2004/03
WebWorkはプレゼンテーション技術にJSP以外にVelocityを使うことも
出来ます。ですが、今回はJSPを使います。Velocityバージョンもいつか
作ってみたいと思います。VelocityはWebアプリケーションのみならず
普通のJavaアプリから利用することも出来ます。僕のホームページの
Javaなわけと読書なわけ、JavaソースはVelocityを使って生成しています。
ソースは
http://yamarou.at.infoseek.co.jp/src.html#jp.gr.java_conf.yamarou.app.magtool.HTMLGenerator2.java
にて公開してるので興味のある方はぜひ見てみて下さい。
Velocityはテキストファイルを生成する時のテンプレートエンジンとしても
かなり使えます!
それではソース。
[forum.jsp]
<%@ taglib uri="webwork" prefix="ww" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<HTML>
<HEAD>
<link rel=stylesheet href="base.css" type="text/css">
<META http-equiv="Content-Language" content="ja">
<META http-equiv="Content-Type" content="text/html; charset=shift_jis">
<META http-equiv="pragma" content="no-cache">
<title>WebWorkで掲示板</title>
<body>
<h1>WebWorkで掲示板</h1>
<ww:if test="hasActionErrors() == true">
エラー:
<ww:iterator value="actionErrors">
<font color=red><ww:property/></font><br>
</ww:iterator>
</ww:if>
<ww:form name="sendMessage" action="sendMessage.action" method="POST">
<table>
<tr>
<td class="content">
<ww:textfield label="名前" name="name" size="20"/>
</td>
</tr>
<tr>
<td class="content">
<ww:textarea label="メッセージ" name="message" rows="5" cols="40"/>
</td>
</tr>
</table>
<input type="submit" value="送信"/>
<a href="loadMessage.action">リロード</a>
<ww:iterator status="messageObj" value="messages">
<table>
<tr>
<td class="title">
名前
</td>
<td class="content">
<ww:property value="name"/>
</td>
</tr>
<tr>
<td class="title">
メッセージ
</td>
<td class="content">
<ww:property value="message"/>
</td>
</tr>
</table>
<br>
</ww:iterator>
</ww:form>
</body>
</html>
formやiterator等のWebWorkのTagLibを使用しています。Strutsでは
URLに".do"を付けましたが、WebWorkでは".action"です。でもって
iteratorはStrutsではrequestの属性名を指定しましたが、WebWork
ではActionのgetterを指定します。
<ww:iterator status="messageObj" value="messages">
だと「ActionのgetMessages()を呼び出して要素を順にmessageObjに格納する」
という意味です。StrutsのActionは一つ生成したものを使いまわす為、
インスタンス内に情報を保持することが出来ませんがWebWorkのActionは
リクエスト毎にインスタンスが生成されるため、JSPはActionから表示項目を
取り出すことが出来ます。それとStrutsはActionフォームにHTTPパラメータを
自動的にリフレクションでセットしますが、WebWorkはActionのsetterにセットしま
す。それらによってServletAPIのHttpRequestを使用しないで済む設計となってい
るわけです。
まぁそんなわけで完成です。完成版はStrutsの時と同じようにwarにして
http://yamarou.at.infoseek.co.jp/webwork-forum.html
にてダウンロード出来るようにしました。ぜひ動かしてみてください!
今回使わなかった機能として、
・UIタグのカスタマイズ・・・UIタグのレンダリングにVelocityが使われてて
テンプレートを変えるだけでカスタマイズが出来る。
自分でUIタグを作ることも出来る。
・インタセプタ ・・・Actionの実行前、実行後に行う処理を追加が出来る。
これによりActionに対して様相を加えることが出来る。
まさにアスペクト指向だ!
・Validation ・・・StrutsのValidatorのような入力チェック機能。
・IoCコンテナ ・・・セッションの属性をActionにセットしてくれる機能。
・ViewからAction起動 ・・・リンクやサブミットでなく、Viewから直接
Actionのgetterを呼び出す機能。
と、いろいろと細かい機能がたくさんあります。少しでもプログラムを
再利用(使いまわす)しようという想いが感じられます。ほんと、きめ細かくて
柔軟なフレームワークだなぁと感じました。
フレームワークを使って掲示板を作るのは2度目なわけですが、前回(Struts版で)
作ったForumDAOとForumMessegeDAOをそのまま使いまわすことが出来たので
とても楽でした。やはりビジネスロジックは再利用すべきですね!!