巷の面倒なWebフレームワークを使うのに疲れた人は、
是非使ってみて下さい。
Tomcat上からしか確認していませんが、
おそらく他のWeb Applicationサーバでも動くはずです。
設定は、ここだけです。
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>Command</servlet-name>
<servlet-class>org.limy.web.VelocityCommandServlet</servlet-class>
<init-param>
<!-- コマンドクラスを配置したパッケージ名 -->
<param-name>commandPackageName</param-name>
<param-value>sample.command</param-value>
</init-param>
<init-param>
<!-- vmファイルを配置したディレクトリ名 -->
<param-name>baseResourcePath</param-name>
<param-value>WEB-INF/vm</param-value>
</init-param>
<init-param>
<!-- 開発モードにする場合はtrue -->
<param-name>development</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Command</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
こんな感じにします。
コマンドクラスを配置するパッケージ名を指定します。
省略した場合は、org.limy.web.command になります。
VM(Velocity)ファイルを配置するディレクトリ名を
アプリケーションのルートディレクトリからの相対パスで記述します。
省略すると、アプリケーションルート直下になります。
true を指定すると、開発モードになります。
省略または false を指定すると、サーバモードになります。
毎回VMファイルのパースを行います。
処理はやや遅くなりますが、VMファイルの修正がすぐさま反映されます。
処理中に例外(Exception)が発生した場合、スタックトレースが画面上に表示されます。
1時間に1回、VMファイルのパースを行います。
その間、VMファイルの修正は反映されなくなりますが
このときの処理速度はまさにVelocity(高速)です。
処理中に例外(Exception)が発生した場合、画面上には簡易エラーのみ表示され
スタックトレースは標準出力に吐き出されます。
servlet-mapping 要素は、作成するコマンドの数だけ定義する必要があります。
コマンドクラス名は、servlet-mapping 要素で定義した url-pattern によって決まります。
今回の例ならば、TestCommand です。
url-pattern とコマンドクラス名の対応は以下のようになっています。
/test -> TestCommand /user_list -> UserListCommand / -> IndexCommand
ちなみに、コマンドクラスを配置するパッケージは
web.xmlで定義した commandPackageName に合わせる必要があります。
今回ならば、sample.command.TestCommand という事です。
コマンドクラスは POJO を採用しています。
特定のインターフェイスを実装したりする必要はありません。
簡単な例を挙げます。
public class TestCommand {
public String cmdEnter(WebResource resource) {
resource.setAttribute("number", 50);
resource.setAttribute("string", "abc");
TestBean bean = new TestBean();
bean.setV(100);
bean.setName("jon");
resource.setAttribute("bean", bean);
return "test/index";
}
}
cmdEnter メソッドは、デフォルトのエントリメソッドです。
GET/POST 形式のどちらにも対応しています(違いはありません)。
流れとしては以下のようになります。
簡単ですね。
WebResource は ServletRequest/Response をラップした作りになっています。
resource
|-- number = 50
|-- string = "abc"
`-- bean = TestBean
|-- v = 100
`-- name = "jon"
ツリー構造で値を格納することが出来ます。
表示側のVMファイルは以下のようになります。
VM構文の詳細に関しては、VTL Reference Guide を参考にして下さい。
非常にシンプルなので、誰でも2〜3時間あれば使えるようになるはずです。
<html><body>
number = ${number} <br />
string = ${string} <br />
bean = { ${bean.v}, ${bean.name} } <br />
</body></html>
表示結果は以下のようになります。
number = 50
string = abc
bean = { 100, jon }
VMファイルの作成場所は、コマンドメソッドの戻り値そのままです。
今回の例ならば、次のようなイメージになります。
アプリケーションルート
`-- WEB-INF
`-- vm
`-- test
`-- index.vm
拡張子は .vm で固定となっています。
コマンドには複数のエントリメソッドを登録することが出来ます。
入力したURLに応じて、以下のようにエントリメソッド名が変化します。
http://sample.com/test -> cmdEnter http://sample.com/test?__cmd__=regist -> cmdRegist http://sample.com/test?__cmd__=deleteAll -> cmdDeleteAll http://sample.com/test?param1=a -> cmdEnter
このように、__cmd__ パラメータで指定されたモード名称によって
エントリメソッドが自動的に決まります。
今のところ、この __cmd__ という文字列は固定です。
そのうち変えられるようにする予定ですが。
POSTにも対応しているので、以下のようなHTMLがあった場合…
<form action="test" method="post"> <input type="hidden" name="__cmd__" value="send"> <input type="submit" value="送信"> </form>
「送信」ボタンを押したときに呼び出されるメソッド名は、cmdSend になります。