S2Struts 入 門 2006.11.12 S2Struts コミッタ 永 島 克 彦 1
自 己 紹 介 名 前 : 永 島 克 彦 ブログ:http://d.hatena.ne.jp/kanag/ 所 属 :( 株 ) 広 島 情 報 シンフォニー メール: katsuhiko.nagashima@gmail.com 2
アジェンダ S2Struts 概 要 S2とStrutsの 連 動 無 設 定 ~ 省 設 定 POJO 化 拡 張 TagLib HOT deploy まとめ 3
S2Struts 概 要 S2Strutsとは Strutsのノウハウをそのまま 活 用 してS2と 簡 単 に 連 動 さらに 無 設 定 ~ 省 設 定 記 述 量 を 減 らす POJO 化 テストしやすく 拡 張 TagLib より 便 利 に HOT deploy テンポのよい 開 発 4
S2Struts 概 要 必 要 な 機 能 のみ 利 用 できる 無 設 定 省 設 定 拡 張 TagLib POJO 化 HOT deploy S2とStrutsの 連 動 5
S2とStruts Strutsの の 連 動 S2とStruts 連 動 の 特 徴 ActionクラスをS2Containerで 管 理 DI x AOP 既 存 Actionクラスに 変 更 なく 適 用 可 能 ただし 設 定 ファイルの 変 更 / 追 加 は 必 要 web.xmlの 変 更 struts-config.xmlの 変 更 Actionの 登 録 (diconファイルの 追 加 ) 6
連 動 の 設 定 1 S2ContainerFilter S2StrutsFilterの 追 加 S2ContainerServletの 追 加 ActionServletは 変 更 する 必 要 なし ただし 先 に S2ContainerServletを 初 期 化 すること <servlet> <servlet-name>s2container</servlet-name> <servlet-class>...s2containerservlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>action</servlet-name> <servlet-class>...actionservlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> 7
連 動 の 設 定 2 S2RequestProcessorへの 変 更 <controller processorclass="org.apache.struts.action.requestprocessor"/> <controller processorclass="org.seasar.struts.processor.s2requestprocessor"/> 8
Actionの の 登 録 方 法 1 diconファイルの 作 成 1 AutoRegisterを 利 用 してカンタンに 登 録 <component class="...filesystemcomponentautoregister"> : <initmethod name="addclasspattern"> <arg>"example.app.web"</arg> <arg>".*action"</arg> </initmethod> </component> Actionクラスを 格 納 しているパッケージと 自 動 登 録 したいクラスパターンを 指 定 すればOK 9
Actionの の 登 録 方 法 2 diconファイルの 作 成 2 SMART deployでもっとカンタンに 登 録 ただし 推 奨 パッケージ 構 成 に 合 わせる 必 要 がある <component class=...namingconventionimpl"> <initmethod name="addrootpackagename"> <arg>"example.app"</arg> </initmethod> </component> アプリケーションの ルートパッケージを 指 定 するのみでOK 10
Actionでの でのAOP 既 存 のActionクラスに 修 正 なく 適 用 可 能 <component class="...aspectautoregister"> <property name="interceptor">traceinterceptor</property> <property name="pointcut">"execute"</property> <initmethod name="addclasspattern"> <arg>"example.app.web"</arg> <arg>".*action"</arg> </initmethod> </component> トレースログ 出 力 内 容 DEBUG... [...] BEGIN...Action#execute(ActionConfig[...) : DEBUG... [...] END...Action#execute(ActionConfig[...) : ForwardConfig[...] 11
Actionでの でのDI 既 存 のActionクラスを 修 正 する 必 要 あり プロパティの 追 加 ActionクラスはRequest 単 位 で 生 成 するため プロパティ を 持 っても 問 題 なし 開 発 しやすくなる ロジック サービスクラスをMockにできる テストしやすくなる はやめにJSPの 動 作 を 確 認 できる S2DaoなどのS2ファミリーが 使 いやすくなる 12
S2とStruts Strutsの の 連 動 のポイント 開 発 中 又 は 開 発 済 みのアプリケーション AOPのみならActionクラスの 修 正 なく 適 用 可 能 今 すぐに 試 すことができる これから 開 発 のアプリケーション Strutsを 使 って S2DaoなどのS2ファミリーも 使 うなら 利 用 したほうが 楽 になる 13
無 設 定 ~ 省 設 定 無 設 定 ~ 省 設 定 の 特 徴 規 約 に 従 うことで 無 設 定 で 動 作 Actionクラスを 作 るのみでOK 規 約 に 従 えない 場 合 はカスタマイズ 可 能 アノテーションによるカスタマイズ 定 数 アノテーション Tigerアノテーション 従 来 どおりstruts-config.xmlによる 設 定 も 可 能 struts-config.xmlの 内 容 を 優 先 14
無 設 定 ~ 省 設 定 ストレスの 少 ない 開 発 JSPの 作 成 クラスの 作 成 テスト 動 作 確 認 設 定 ファイル の 修 正 15
無 設 定 ~ 省 設 定 の 設 定 struts-config.xmlの 変 更 AutoStrutsConfigRegisterPlugInの 追 加 無 設 定 情 報 となるプロパティも 設 定 <plug-in classname="...validatorplugin"> : </plug-in> <plug-in classname="...autostrutsconfigregisterplugin"> : </plug-in> ValidatorPlugInの 次 に AutoStrutsConfigRegisterPlugInを 追 加 16
無 設 定 規 約 に 従 い 自 動 的 に 設 定 package example.app.form; public class AddFrom extends ValidatorForm { : } package example.app.web; public class AddAction extends Action { public ActionForward execute(...) { : } } <form-bean name= addform type= example.app.form.addform /> : <action path="/add" type="example.app.web.addaction" name="addform" scope="request" validate="true"> <forward name="success" path="/add.jsp" /> </action> 17
form-bean beanの の 規 約 form-bean nameの 規 約 <form-bean name= addform type= example.app.form.addform /> コンポート 名 を 設 定 クラス 名 :AddForm コンポーネント 名 :addform form-bean name:addform 18
actionの の 規 約 1 action pathの 規 約 <action path="/add" type= "example.app.web.addaction" name="addform" scope="request" validate="true"> <forward name="success" path="/add.jsp" /> </action> / + Action を 消 したコンポート 名 を 設 定 クラス 名 :AddAction コンポーネント 名 :addaction action path:/add 19
actionの の 規 約 2 action nameの 規 約 <action path="/add" type= "example.app.web.addaction" name="addform" scope="request" validate="true"> <forward name="success" path="/add.jsp" /> </action> Action を 消 したコンポート 名 + Form or Dto を 設 定 クラス 名 :AddAction コンポーネント 名 :addaction action name:addform 20
actionの の 規 約 3 forwardの 規 約 <action path="/add" type= "example.app.web.addaction" name="addform" scope="request" validate="true"> <forward name="success" path="/add.jsp" /> </action> パッケージとクラス 名 からViewを 検 索 しあった 場 合 は success のforwardとして 設 定 クラス 名 :example.app.web.addaction docroot :/ ViewExtension :jsp の 場 合 の 検 索 順 1. /example/app/web/add.jsp 2. /app/web/add.jsp 3. /web/add.jsp 4. /add.jsp 21
actionの の 規 約 4 その 他 はデフォルト 値 を 割 り 当 てる <action path="/add" type= "example.app.web.addaction" name="addform" scope="request" validate="true"> <forward name="success" path="/add.html" /> </action> scope validate input parameter attribute forward include prefix suffix unknown roles cancellable request true null null null null null null null null null false 22
バリデーション バリデーションの 設 定 もアノテーションでかける クラスとバリデーション 設 定 の 記 述 が 近 く 管 理 しやす い(わかりやすくなる) 独 自 のバリデーションをアノテーションとして 作 成 することもできる public class AddForm extends ValidatorForm { @Required @EmailType public void setvalue(string value) { } } : public class AddForm extends ValidatorForm { public static final String value_validator_0 = "required"; public static final String value_validator_1 = "email"; public void setvalue(string value) { : } } 23
無 設 定 ~ 省 設 定 のポイント 省 設 定 でシンプルに 基 本 的 な 設 定 は 無 設 定 にまかせ 一 部 の 特 殊 なものをアノテーションで 設 定 アノテーションで 設 定 する 項 目 を 限 定 する ちょっとした 設 定 で 思 わぬ 時 間 をとられることを 防 ぐ 限 定 の 例 form-beanは 無 設 定 で 行 う action-mappingは nameとscopeのみアノテーションで 設 定 する etc 24
POJO 化 ActionをPOJO 化 したときの 特 徴 テストしやすくなる 特 定 のAPIに 依 存 しなくなる import 文 からStruts 関 連 のクラスがなくなる ページを 中 心 とした 開 発 拡 張 TagLibを 利 用 することで 可 能 となる Initタグによる 画 面 初 期 化 MethodBindingによるAction 処 理 25
POJO Action 例 @StrutsAction(name= calcform ) public class AddAction { } @StrutsActionForward(path= /calcresult.jsp public static final String SUCCESS = success ; public void setcalcform(calcform calcform) {...} public CalcForm getcalcform() {... } @ExportToSession public List getcalchistory() {... } public void initialize() {... } public String docalc() {... } 26
POJO Action 規 則 1 Actionメソッド( 引 数 なし 戻 り 値 Stringのメソッド) Forward 名 を 返 却 する 1つのActionメソッドのみを 定 義 している 場 合 通 常 Actionと 同 様 の 方 法 による 実 行 MethodBindingによる 実 行 複 数 のActionメソッドを 定 義 している 場 合 DispatchActionと 同 様 の 方 法 による 実 行 MethodBindingによる 実 行 <s2struts:submit action= #{addaction.docalc} /> MethodBindingでは 実 行 するActionメソッドを コンポーネント 名.メソッド 名 で 指 定 27
POJO Action 規 則 2 Initializeメソッド( 引 数 なし 戻 り 値 voidのメソッド) 画 面 の 初 期 化 を 行 う メソッド 名 は 自 由 Initタグで 呼 び 出 されるメソッド <s2struts:init action= #{addaction.initialize} /> Initタグでは Initializeメソッドを コンポーネント 名.メソッド 名 で 指 定 28
POJO Action 規 則 3 FormBeanのバインディング FormBean 名 のプロパティを 定 義 セッターメソッドでViewから 受 け 取 れる ゲッターメソッドでViewへ 渡 す スコープはActionMappingに 従 う 29
POJO Action 規 則 4 その 他 のオブジェクトのバインディング セッターメソッドでViewから 受 け 取 れる 受 け 取 る 優 先 順 位 HttpServletRequest#getParameter(プロパティ 名 ) HttpServletRequest#getAttribute(プロパティ 名 ) HttpSession#getAttribute(プロパティ 名 ) ゲッターメソッドでViewへ 渡 す デフォルトはRequestスコープに 値 を 設 定 Sessionスコープに 値 を 設 定 する 場 合 はアノテーションで 指 定 する 30
POJO Actionの の 疑 問 interfaceは 必 要 なの? S2Struts1.3からinterface 不 要 ただinterfaceを 定 義 すると 設 定 と 実 装 が 分 離 され 明 確 になる InitializeメソッドとActionメソッドは 別 々のAction クラスで 定 義 しないといけないの? 1つのActionクラスとして 定 義 可 能 31
POJO 化 のポイント トレードオフを 考 慮 する Strutsから 距 離 をおく 移 行 しやすいかも でも Strutsの 知 識 は 必 須 POJO 化 するだけの 価 値 はあるか テストしやすくなる 拡 張 TagLibを 使 うことで 開 発 しやくなる でも 新 しく 覚 えることが 増 える 32
拡 張 TabLib 拡 張 TagLibの 特 徴 Strutsのタグをより 便 利 に indexidの 追 加 チェックがない 場 合 でも 値 をセットするcheckboxタグ バリデーションを 行 わなくするcancel 属 性 の 追 加 無 設 定 の 支 援 ページを 中 心 とした 開 発 のための 機 能 33
無 設 定 の 支 援 Pageタグ エラー 発 生 時 自 画 面 を 再 表 示 する action inputを 指 定 しなくてよい cancel 属 性 バリデーション 有 無 をタグで 指 定 action validateは 常 にtrue(デフォルト 値 )で 問 題 な し 34
ページ 中 心 とした 開 発 のための 機 能 Initタグ 画 面 の 初 期 化 処 理 を 行 う ページの 初 期 化 についてはそのページで 指 定 MethodBinding POJO Actionのメソッドを 直 接 指 定 する DispatchActionなどの 代 替 え 手 段 cancel 属 性 と 併 用 することによりバリデーション 有 無 を 制 御 35
拡 張 TagLibのポイント POJO 化 しない 場 合 Strutsタグの 拡 張 部 分 のみを 利 用 違 和 感 なく 便 利 に 利 用 できる Initタグは 利 用 しないほうがよいかも 利 用 したらPOJO 化 したくなる POJO 化 する 場 合 積 極 的 に 利 用 したほうが 便 利 Pageタグを 利 用 すればInitタグもほしくなる Initタグを 利 用 すればMethodBindingしたくなる 36
HOT deploy HOT deployの 特 徴 テンポのよい 開 発 クラスの 追 加 / 変 更 がすぐに 反 映 設 定 ファイルの 変 更 もすぐに 反 映 struts-config.xml validation.xml application.properties ストレスの 少 ない 開 発 アプリケーションサーバーを 起 動 したまま 開 発 37
HOT deployの の 設 定 web.xmlの 変 更 HotdeployFilterの 追 加 <filter> <filter-name>hotdeployfilter</filter-name> <filter-class>...hotdeployfilter</filter-class> </filter> : <filter-mapping> <filter-name>hotdeployfilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>request</dispatcher> <dispatcher>forward</dispatcher> </filter-mapping> REQUESTとFORWARDに 対 してフィルタをかけるため Servlet2.4が 必 要 38
HOT deployの の 設 定 struts-config.xmlの 変 更 HotdeployPlugInの 追 加 <plug-in classname="...validatorplugin"> : </plug-in> <plug-in classname="...hotdeployplugin"> : </plug-in> 一 番 最 後 に HotDeployPlugInを 追 加 する 39
HOT deployの の 仕 組 み 設 定 ファイル Requestのたびに 毎 回 読 み 込 む 無 設 定 ~ 省 設 定 の 場 合 ActionConfigの 求 め 方 RequestのたびにActionConfigを 生 成 する Requestパス コンポーネント 名 クラス ActionConfig FormBeanConfigの 求 め 方 RequestのたびにFormBeanConfigを 生 成 す ActionConfig name コンポーネント 名 クラス FormBeanConfig 40
HOT deployの の 制 限 無 設 定 ~ 省 設 定 の 場 合 の 制 限 action pathは 規 約 による 設 定 とする pathからactionクラスを 求 めるため form-bean nameは 規 約 による 設 定 とする nameからformbeanクラスを 求 めるため 41
HOT deployの の 注 意 点 対 応 していない 設 定 ファイルがある web.xml tiles-defs.xmlについては 未 対 応 開 発 のときのみ 利 用 Requestのたびに 設 定 ファイルを 読 み 込 むため 性 能 が 悪 くなる 本 番 運 用 時 にはCOOL deployに 切 り 替 える env.txtの 内 容 を ut 以 外 に 変 更 42
まとめ 必 要 な 機 能 のみを 利 用 まずはS2とStrutsの 連 動 とHOT deployを 試 してほ しい 開 発 効 率 のアップ 無 設 定 ~ 省 設 定 により 設 定 ファイルの 管 理 を 不 要 に でき HOT deployにより 動 作 確 認 がすぐにできるよ うになる POJO 化 による 利 点 ActionをPOJO 化 することによりテストがしやすくなり 拡 張 TagLibも 一 緒 に 使 うことによりページ 中 心 の 開 発 が 可 能 となる 43
ご 清 聴 ありがとうございました 44