2008年09月06日

SAStruts+Ajax(jquery.js)でXMLデータを取得しましょう

「コードなにがし」にもアップしていますが、SAStruts+Ajax(jquery.js)でXMLデータ取得してみましょう。

SAStrutsのチュートリアルプロジェクト(Eclipse)を元にして改造しています。


目次


●序
●造
 アクションクラス
  sa-struts-tutorial\src\main\java\tutorial\action\AjaxAction.java (変更)
JSP
  sa-struts-tutorial\webapp\WEB-INF\view\ajax\index.jsp (変更)
●結




SAStruts+Ajax+jQueryを試してみましょう。

ここでは、jQueryのAjax機能を使用してアクションクラスを呼び出し、レスポンスとして返されるXMLデータをパースして表示しましょう。

ここでは、例を単純にするためにアクションフォームを使用しません。




アクションクラス


"sa-struts-tutorial\src\main\java\tutorial\action\AjaxAction.java"を以下のように変更します。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.ResponseUtil;

public class AjaxAction {

@Execute(validator = false)
public String index() {
return "index.jsp";
}

@Execute(validator = false)
public String load_xml() throws IOException {
//XMLデータを返却します。
HttpServletResponse httpServletResponse = ResponseUtil.getResponse();
httpServletResponse.setContentType("application/xml");
PrintWriter sendPoint = new PrintWriter(httpServletResponse.getOutputStream());
sendPoint.println("<?xml version='1.0' encoding='UTF-8' ?>");
sendPoint.println("<employees>");
sendPoint.println(" <employee>");
sendPoint.println(" <id>1</id>");
sendPoint.println(" <name>ALLEN</name>");
sendPoint.println(" </employee>");
sendPoint.println(" <employee>");
sendPoint.println(" <id>2</id>");
sendPoint.println(" <name>WARD</name>");
sendPoint.println(" </employee>");
sendPoint.println("</employees>");
sendPoint.flush();
sendPoint.close();
return null;
}
}



JSP


"sa-struts-tutorial\webapp\WEB-INF\view\ajax\index.jsp"を以下の内容に変更します。

<%@page pageEncoding="UTF-8"%>
<html>
<head>

<title>Tutorial: Ajax</title>
<link rel="stylesheet" type="text/css" href="${f:url('/css/sa.css')}" />
<script src="${f:url('/js/jquery.js')}"></script>

</head>
<body>
<h1>Tutorial: Ajax</h1>

<script type="text/javascript">
function loadXML() {
$.ajax({
url: '${f:url('/ajax/load_xml')}',
type: 'GET',
dataType: 'xml', //レスポンスのデータ形式
timeout: 1000,
cache: false, //ブラウザにキャッシュさせません。
error: function(){ //例外時のコールバック関数
alert("xmlファイルの読み込みに失敗しました");
},
success: function(xml){
$(xml).find("employee").find("name").each(function(){
var item_text = $(this).text();
alert(item_text)
});
}
});
}

</script>
<input type="button" value="hello" onclick="loadXML()"/>
</body>
</html>





http://localhost:8080/sa-struts-tutorial/ajax/にアクセスしましょう。以下の画面が表示されますので、「Hello」ボタンをクリックしましょう。
ポップアップで、従業員名が表示されます。

posted by 台北猫々 at 19:54| Comment(0) | TrackBack(0) | 技術メモ(SAStruts)

2008年09月05日

「世情」中島みゆき

昔、金八先生の「俺達は腐ったミカンじゃない!」のくだりが、ある第二期(だっけ?)の最終回だったか生徒が警察に連行される時にかかっていた「世情」〜中島みゆき〜を久々に聴きました。

歌詞は、「シュプレヒコールの波 〜」というところぐらいしか覚えていなかったのですが、改めてじっくり聴くとなんか、じ〜んときます。なんか、頭の中でずっとリフレインしています。猫

歌詞はこちら↓
世情 中島みゆき 歌詞情報 - goo 音楽


CDはこちら↓
posted by 台北猫々 at 21:09| Comment(0) | TrackBack(0) | 本・DVD・映画・美術

2008年09月04日

MySQLからS2JDBC-GenでEntityを自動生成しましょう(コマンドライン編)


目次


●序
●造
1.Apache-Antをダウンロード&セットアップ
2.S2JDBC-GenやSeasar2(S2JDBC)のJARファイルをダウンロード&セットアップ
3.MySQL Connector/J (JDBCドライバ)を配置
4.Seasar2とS2JDBC用のDICONファイルを作成
 convention.dicon
 s2jdbc.dicon
 jdbc.dicon
5.ビルドコンフィグファイル作成
6.Entityクラスの自動生成
●結
●おまけ的
フォルダ/ファイル構成




コードなにがしにもアップしていますが、
S2JDBC-GenのEntityクラスの自動生成機能を試してみます。

EclipseのAnt機能でも生成可能なのですが、ここではコマンドラインでAntコマンドを使用する方法で行います。

データベースはMySQLのインストール後の設定で構築したMySQL環境を使用します。

エンティティクラスの生成も併せて参考にして下さい。




1.Apache-Antをダウンロード&セットアップ


こちらからApache-Antをダウンロードします(本稿執筆時2008.09.03の最新はapache-ant-1.7.1-bin.zipです)。

apache-ant-1.7.1-bin.zipを解凍して出来た、apache-ant-1.7.1フォルダを任意の場所に移動します。本稿ではC:\usr\localに移動します。

PATHに"C:\usr\local\apache-ant-1.7.1\bin"を追加します。

2.S2JDBC-GenやSeasar2(S2JDBC)のJARファイルをダウンロード&セットアップ


作業ディレクトリ作成


以下のフォルダを作成します。
C:\usr\local\s2jdbc
C:\usr\local\s2jdbc\lib
C:\usr\local\s2jdbc\conf



S2JDBC-GenのJARファイル


こちらからS2JDBC-Gen(本稿執筆時2008.09.03の最新はS2JDBC-Gen 
0.9.0です)をダウンロードしましょう。

ダウンロードしたファイルを任意の場所で解凍して、
生成した"s2jdbc-gen\lib"配下にあるJARファイルを、
"C:\usr\local\s2jdbc\lib"フォルダにコピーします。


Seasar2(S2JDBC)のJARファイル



本当はSeasar2セットアップに従って、必要なモジュールをセットアップする
のですが、ここではサボっちゃいます。

こちらからS2JDBCのチュートリアル(本稿執筆時2008.09.03の最新
はS2JDBC Tutorial 2.4.28です)をダウンロードしましょう。
ダウンロードしたファイルを任意の場所で解凍して、生成した
"s2jdbc-tutorial\lib"配下にあるJARファイルを、"C:\usr\local\s2jdbc\lib"フォルダにコピーします。


3.MySQL Connector/J (JDBCドライバ)を配置


S2JDBC-GenがEntityクラスを自動生成する際には、MySQLデータベースに接続してカタログ情報を取得します。なので、実行時にはJDBCドライバが必要になります。

環境・必要なモジュール準備でダウンロードした"mysql-connector-java-5.1.6-bin.jar"を"C:\usr\local\s2jdbc\lib"フォルダにコピーします。

4.Seasar2とS2JDBC用のDICONファイルを作成


"C:\usr\local\s2jdbc\conf\convention.dicon"を以下の内容で作成します。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
<component class="org.seasar.framework.convention.impl.NamingConventionImpl">
<initMethod name="addRootPackageName">
<arg>""</arg>

</initMethod>
</component>
<component class="org.seasar.framework.convention.impl.PersistenceConventionImpl"/>
</components>

"C:\usr\local\s2jdbc\conf\s2jdbc.dicon"を以下の内容で作成します。


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
<include path="jdbc.dicon"/>

<include path="s2jdbc-internal.dicon"/>
<component name="jdbcManager" class="org.seasar.extension.jdbc.manager.JdbcManagerImpl">
<property name="maxRows">0</property>

<property name="fetchSize">0</property>
<property name="queryTimeout">0</property>
<property name="dialect">mysqlDialect</property>

</component>
</components>

"C:\usr\local\s2jdbc\conf\jdbc.dicon"を以下の内容で作成します。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components namespace="jdbc">
<include path="jta.dicon"/>
<component name="xaDataSource"

class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
<property name="driverClassName">
"com.mysql.jdbc.Driver"
</property>
<property name="URL">

"jdbc:mysql://localhost:3306/sastruts"
</property>
<property name="user">"sastruts"</property>
<property name="password">"sastruts"</property>

</component>

<component name="connectionPool"
class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
<property name="timeout">600</property>

<property name="maxPoolSize">10</property>
<property name="allowLocalTx">true</property>
<destroyMethod name="close"/>

</component>



<component name="DataSource"
class="org.seasar.extension.dbcp.impl.DataSourceImpl"
/>
</components>



5.ビルドコンフィグファイル作成


"C:\usr\local\s2jdbc\s2jdbc-gen-build.xml"を以下の内容で作成します。

<?xml version="1.0"?>
<project name="sample" default="gen-entity" basedir=".">

<path id="classpath">
<fileset dir="lib"/>
</path>
<taskdef resource="s2jdbc-gen-task.properties" classpathref="classpath"/>

<target name="gen-entity">
<gen-entity
rootpackagename="mysql"
classpathref="classpath"
classpath="conf"
overwrite="true"

/>
</target>
</project>


6.Entityクラスの自動生成


Windowsのコマンドプロンプトを起動して、"C:\usr\local\s2jdbc"にチェンジディレクトリ(移動)して、以下のコマンドを実行します。


ant -f s2jdbc-gen-build.xml gen-entity

以下のような表示がされ、"src/main/mysql/entity"フォルダにエンティティクラスファイルが生成されます。

C:\usr\local\s2jdbc>ant -f s2jdbc-gen-build.xml gen-entity
Unable to locate tools.jar. Expected to find it in C:\Program Files\Java\jre1.6.
0_07\lib\tools.jar
Buildfile: s2jdbc-gen-build.xml

gen-entity:

BUILD SUCCESSFUL
Total time: 3 seconds

"Unable to locate tools.jar."というメッセージは、JREのjavaコマンドを使用しているために出力されているだけなので、ここでは問題ないので無視して構いません。"tools.jar"は、JDKに同梱されています(C:\Program Files\Java\jdk1.6.0_07\libなどにあります)。antは開発環境で使用されることを前提としているためでしょうか?


以下の3つのエンティティクラスファイルが生成されます。

src/main/mysql/entity/Address.java
src/main/mysql/entity/Department.java
src/main/mysql/entity/Employee.java

中を見ると↓のようにテーブル結合のアノテートもされています。

Employee.java抜粋

/** addressIdプロパティ */
@Column(precision = 10, nullable = true, unique = false)
public Integer addressId;

/** address関連プロパティ */
@ManyToOne
public Address address;


おまけ的


フォルダ/ファイル構成


作業しているフォルダ/ファイルの構成は、以下のようになります。
srcフォルダ配下が生成されたエンティティクラスファイルです。

─────────────────────────────────────
C:\usr\local\s2jdbc
s2jdbc < Dir >
├ conf < Dir >

│ ├ convention.dicon 442 2008/09/03 14:37:57
│ ├ jdbc.dicon 1,306 2008/09/03 10:29:28
│ └ s2jdbc.dicon 542 2008/09/03 13:52:31
├ lib < Dir >
│ ├ ant-1.7.0.jar 1,289,806 2008/09/02 17:58:48
│ ├ aopalliance-1.0.jar 4,467 2008/06/26 23:53:12
│ ├ commons-logging-1.1.jar 52,915 2008/06/26 23:54:08
│ ├ freemarker-2.3.13.jar 870,292 2008/09/02 17:58:44
│ ├ geronimo-annotation_1.0_spec-1.0.jar 12,085 2008/06/26 23:53:50
│ ├ geronimo-ejb_3.0_spec-1.0.jar 31,752 2008/06/26 23:54:14
│ ├ geronimo-interceptor_3.0_spec-1.0.jar 8,954 2008/06/26 23:54:14
│ ├ geronimo-jpa_3.0_spec-1.0.jar 52,555 2008/06/26 23:54:00
│ ├ geronimo-jta_1.1_spec-1.0.jar 14,972 2008/06/26 23:54:04
│ ├ geronimo-jta_1.1_spec-1.0-tsr.jar 7,329 2008/06/26 23:54:08
│ ├ hsqldb-1.8.0.1.jar 625,096 2008/06/26 23:54:02
│ ├ javassist-3.4.ga.jar 471,005 2008/06/26 23:54:12
│ ├ junit-3.8.2.jar 120,640 2008/06/26 23:54:12
│ ├ log4j-1.2.13.jar 358,180 2008/06/26 23:54:10
│ ├ mysql-connector-java-5.1.6-bin.jar 703,265 2008/03/05 17:27:00
│ ├ ognl-2.6.9-patch-20070908.jar 166,995 2008/06/26 23:54:00
│ ├ poi-3.0-FINAL.jar 1,767,938 2008/06/26 23:53:56
│ ├ s2-extension-2.4.28.jar 385,584 2008/08/26 16:50:36
│ ├ s2-framework-2.4.28.jar 654,191 2008/08/26 17:34:36
│ ├ s2jdbc-gen-0.9.0.jar 366,917 2008/09/02 19:41:58
│ ├ s2-tiger-2.4.28.jar 569,177 2008/08/26 17:34:36
│ └ servlet-api.jar 97,703 2008/06/26 23:54:08
├ src < Dir >
│ └ main < Dir >
│ └ java < Dir >
│ └ mysql < Dir >

│ └ entity < Dir >
│ ├ Address.java 743 2008/09/04 09:03:35
│ ├ Department.java 752 2008/09/04 09:03:35
│ └ Employee.java 1,300 2008/09/04 09:03:35
└ s2jdbc-gen-build.xml 447 2008/09/04 08:53:57
─────────────────────────────────────
posted by 台北猫々 at 23:07| Comment(0) | TrackBack(0) | 技術メモ(SAStruts)

2008年09月03日

フレームワークには2通りある(おまけ)

昨日、一昨日は、「学習コスト」という面から考えましたが、精神面から考えても、「とっても苦労して習得した知識・技術」が結局宝の持ち腐れになるというのは、結構辛いことですし、その後に新しい事を学ぼうとするモチベーションも下がってしまうでしょうね。

技術畑にいない人の中には、「技術者は、新しい事をやらしておけば満足するだろ」ぐらいに思っている場合もあるのかもしれませんが、ところがどっこい「人はパンのみにして生きるにあらず」です。
posted by 台北猫々 at 20:53| Comment(0) | TrackBack(0) | コラムみたいな

2008年09月02日

フレームワークには2通りある(後半)

(続き)

現在、開発に使用するフレームワークの選択肢は多種多様ですね。オープンソースとして開発・公開されているものや、SIer達がこれらのオープンソースのフレームワークをラッピングしたりして独自のフレームワークを開発したりもしています。

こういった背景の中、SIerから2次、3次請けする会社のSE・PGが、同じフレームワークを使うプロジェクトに携わり続けるなんてことはほとんど無いでしょう。

例えば、前回はStruts+Spring+iBatis(期間6ヶ月)、今回はフレームワーク無し(期間3ヶ月)、次回はSIer独自FW+EJB3(期間8ヶ月)とかで、さらにOSやWebサーバやAPサーバの違いの合わせ技なんてのも、ありがちだと思います。

この状況下、多くの学習コスト(初期投資)を必要とするフレームワークでは、その回収がままならないというのが現実です。また、しばらく使用しないうちに個人の中の情報が劣化してしまったり、そのフレームワーク自体が陳腐化してしまったりすると、もはや回収不可能ということにもなります。

つまり、多くの学習コスト(初期投資)を必要とするフレームワークを習得することは非常にリスキーであると言えます。
※また、SIer独自のフレームワークは、機能の多い少ないよりかは、書籍が無いことやネット上の2次情報が期待できないこと、さらに下手すると1次情報(マニュアル)が貧相であることもあるので、学習コストは高く「学習コスト的に重量級」であると言えます。

よって、現状では回収フェーズにすぐに入れる「軽量級フレームワーク」が求められるもの、もしくはベターな選択であると言えます。

と、いいつつ実際の現場では重量級のフレームワーク(昔でいえばEJB2, 今だとHibernateとか)を採用している案件が結構多いような気がします。
#私も昔、EJB2の案件に携わったことが多かったです(当時はなんでこんなものが流行っているんだ?と疑問だったものです。。

わざわざ非効率的な方法を選択するのですから、酔狂なことです。

ところで、なんでこんなことになっているのでしょうか?
無知?、それともある組織の陰謀でしょうか?。

多分ですが、
通常、システム開発案件の見積もり項目に「フレームワークの学習コスト」なんて記載しませんし、記載しても認められないでしょう。現実には存在するコストなのですが、書面上には出てこないのですよね。そして、スケジュール上は多少考慮される場合もあるでしょうが、多くの管理者は個人の自助努力に学習コストを押し付けているのではないでしょうか?

こういった背景の中、「学習コスト」は管理されるべきコストからは除外されてしまいます。よって、フレームワークの選択による「学習コスト」の増減についても深く考慮されないのでしょう。
posted by 台北猫々 at 18:40| Comment(0) | TrackBack(0) | コラムみたいな

2008年09月01日

フレームワークには2通りある(前半)

今日は、現場(SIerから2次、3次請けするような会社のSE・PG)で求められるフレームワークについて考えてみます。

で、本題に入る前に投資と回収について1つ話しておきます。
例えばIT投資の場合にシステムの開発を行い運用開始するまでは、投資フェーズと言えますね。この間はお金は一方的に外に流れていきます。そして、運用開始すると回収フェーズとなります。回収フェーズではお金の流れは逆転して、システム化による売上増加や費用削減などにより、手元に入る(残る)お金は増えていきます。そして、一定の期間運用していれば、投資したお金を回収することができ、それから先が本当のシステム化のプラス(利益がっぽがっぽ)フェーズの始まりになります。

つまり、システム開発を行って運用開始しても、しばらくは「投資」>「回収」で、一定期間以上稼動させ続けないと「投資」<「回収」にはなりません。まあ、あたりまえの話ですが。

閑話休題。

フレームワークには2通りあります。
・1つは、多くの学習コスト(初期投資)を必要するため回収フェーズにはなかなか入れないが、その分たくさんの機能を持っているので回収フェーズに入った時の効率は高い重量級です。
・もう1つは、学習コスト(初期投資)は少なく早くに回収フェーズに入れるが、機能はそんなに多くない軽量級です。

で、どちらが現場に求められるかということですが、結論から言うと後者の軽量級フレームワークです。

それは何故かということは明日、説明していきましょう。
(続く)


posted by 台北猫々 at 18:57| Comment(0) | TrackBack(0) | コラムみたいな