4月 7th, 2008at 13:58

Tags: , ,

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.javapublic 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">

<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メソッドが呼ばれる。

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