Struts2.0.9インストールからサンプル作成まで

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の動きみたいなのが書いてあった。

  1. ブラウザがリクエストを投げる(/mypage.acitonとか/reports/myreport.pdfなど)
  2. FilterDispatcherはリクエストを見て適切なActionを決定する
  3. インタセプタは自動的に自動的に共通の機能(ワークフロー、Validation、ファイルアップロードハンドリング)をリクエストに適用する。
  4. 通常はデータベースから情報を取り出したり、入れたりするActionメソッドを実行する。
  5. 結果をブラウザに出力&レンダリングする

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の作成

Action Javadoc

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」)に置かなければならない。

Struts document struts.xml

ファイルが大きくなった場合、グルーピングして分けることも可能。

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”&gt;

<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メソッドが呼ばれて遷移してくれる。

pic20080308_215224

次に登録画面で入力して登録ボタンをクリック。これでexecuteメソッドが呼ばれる。

pic20080308_215228

登録に成功したら完了画面が表示される。

pic20080308_215232