WebWorkというフレームワークとStrutsが合体&進化してStruts2となったらしい。次世代フレームワークとしてStrutsを超える存在になるのかなー?
- 要件
- Servlet API 2.4
- JSP API 2.0
- Java 5
インストール
Releasesからダウンロード。これをみつけるのにすげー苦労した。今回は「struts-2.0.9-all.zip」をダウンロード。
とりあえずlibフォルダにあるライブラリをすべて「WEB-INF/lib」に入れてみるが、のちにこれではだめだということがわかった。どうも「struts2-spring-plugin-2.0.9.jar」が入るとspring.jarも必要になるらしい。
そこで、「apps/struts2-blank-2.0.9.war」を解凍して使うことにした。どうもこれが一番シンプルなStruts2アプリらしい。
入っていたJarファイルは以下。
- commons-logging-1.0.4.jar
- freemarker-2.3.8.jar
- ognl-2.6.11.jar
- struts2-core-2.0.9.jar
- xwork-2.0.4.jar
FilterDispatcher
Struts1.xでは「ActionServlet」がメインのコントローラだったが、Struts2.xではこの「FilterDispatcher」がメインのハンドラになるみたい。このFilterは4つの仕事をメインとしている。
- Actionの実行
- ActionContextのクリア
- StaticContentの手伝い
- リクエストのライフサイクルのためにXWorkのインタセプタ連鎖をキックする
このフィルタは全部のリクエストにMappingされるようにしなければならない。正確な仕様をしらないのであれば、「/*」というURLパターンにしておくべき
Nutshell
これがなんなのかわからないけど、FilterDispatcherの動きみたいなのが書いてあった。
- ブラウザがリクエストを投げる(/mypage.acitonとか/reports/myreport.pdfなど)
- FilterDispatcherはリクエストを見て適切なActionを決定する
- インタセプタは自動的に自動的に共通の機能(ワークフロー、Validation、ファイルアップロードハンドリング)をリクエストに適用する。
- 通常はデータベースから情報を取り出したり、入れたりするActionメソッドを実行する。
- 結果をブラウザに出力&レンダリングする
web.xmlに記述
FilterDispatcherをweb.xmlに記述して使えるようにする。
<filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
サンプルのWarを参考にしてみた。
Actionの作成
Struts1.xではActionクラスを継承しないと駄目だったが、2.xではインタフェースとして「形だけ」残っている。結局はexecute()メソッドを実装しないと駄目なのだけれど、インタフェースなしで作成してもOKらしい(POJOってやつですね)。
とりあえずActionインタフェースを実装してみる。executeメソッドは登録処理、initメソッドは登録画面へ遷移する処理。
//UserRegAction.java public class UserRegAction implements Action {
@Override
public String execute() throws Exception {
AppLogger.debug(“UserRegAction.execute”);
//ユーザ登録処理
return “success”;
}
public String init() throws Exception {
AppLogger.debug(“UserRegAction.init”);
//遷移するだけー
return “success”;
}
}
struts.xmlの作成
struts-config.xmlはstruts.xmlに変わった。これはクラスパスの通った場所(通常は「WEB-INF/classes」)に置かなければならない。
ファイルが大きくなった場合、グルーピングして分けることも可能。
Can we break up a large struts.xml file into smaller pieces
今回は2つのアクションを定義。登録Actionと初期化アクション。Struts2になってメソッドの呼び出しが便利に、シンプルになった気がする。
//struts.xml <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
“-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”
“http://struts.apache.org/dtds/struts-2.0.dtd”>
<struts>
<package name=”default” extends=”struts-default”>
<action name=”userreginit”
class=”com.daipresents.struts209.action.UserRegAction”
method=”init”>
<result name=”success”>/WEB-INF/jsp/userreg.jsp</result>
</action>
<action name=”userreg”
class=”com.daipresents.struts209.action.UserRegAction”>
<result name=”success”>/WEB-INF/jsp/complete.jsp</result>
</action>
</package>
</struts>
JSP作成
まずは登録画面へ遷移するリンクJSP
//index.jsp <a href="<%=request.getContextPath() %>/userreginit.action">登録画面</a>
つぎに登録画面。
//userreg.jsp <form action="<%=request.getContextPath() %>/userreg.action"> <input type="text" name="userName" value="" /> <input type="submit" value="登録" /> </form>
おまけで登録完了画面。
//complete.jsp 登録が完了しました。
動作確認
まずは登録画面へリンクをクリック。これでinitメソッドが呼ばれて遷移してくれる。
次に登録画面で入力して登録ボタンをクリック。これでexecuteメソッドが呼ばれる。
登録に成功したら完了画面が表示される。