SAStrutsのチュートリアル2 足し算
/add/で遷移できるので、対象Actionは
tutorial.action.AddActionになります。
package tutorial.action; import javax.annotation.Resource; import org.seasar.struts.annotation.ActionForm; import org.seasar.struts.annotation.Execute; import tutorial.form.AddForm; public class AddAction { public Integer result; @ActionForm @Resource protected AddForm addForm; @Execute(validator = false) public String index() { return "index.jsp"; } @Execute(input = "index.jsp") public String submit() { result = Integer.valueOf(addForm.arg1) + Integer.valueOf(addForm.arg2); return "index.jsp"; } }
見どころ1(メソッドの決定)
@Execute指定されたメソッドが複数ありますが、これは以下ルールに従って解釈されます。
/add/
にアクセスした場合、indexメソッドが呼ばれます。
/add/index
にアクセスした場合も同様にindexメソッドが呼ばれます。
/add/submit
にアクセスした場合、submitメソッドが呼ばれます。
見どころ2(ActionForm)
ActionFormについては、@ActionFormアノテーションによって指定しています。
@ActionForm @Resource protected AddForm addForm;
ActionFormは、
ルートパッケージ.form
に配置されます。
package tutorial.form; import org.seasar.struts.annotation.IntegerType; import org.seasar.struts.annotation.Required; public class AddForm { @Required @IntegerType public String arg1; @Required @IntegerType public String arg2; }
validate.xmlによる指定ではなく、アノテーションによって、チェックの内容を指定しています。
(表示は今まで通り
Actionでは、入力チェックに該当した場合の遷移先を@Executeで指定しています。
@Execute(input = "index.jsp") public String submit() {
また、indexメソッドの@Execute(validator = false)は、デフォルトではtrueのためチェックをしないように指定しています。
ちなみにActionFormが不要な場合、該当パラメータをActionに定義することで、ActionFormではなく、
Actionのパラメータに値が設定されるようになります。
ActionFormと、Actionに同一のパラメータが存在する場合、
ActionFormが優先されますので気を付けてください。
@ResourceはSeasar2のタグで、このフィールドはDI対象であることを示します。
プロパティ名は、クラス名の先頭を小文字にした名前である必要があります。
そのルールに従わない場合は、明示的に@Resource(name=””)で指定してやる必要があります。
また、ActionFormではなく、単純にネストしたプロパティとして利用したい場合、
@ActionFormアノテーションを外すことにより可能になります。
そうすると、ただのネストしたプロパティになるのでjspなどでは、addForm.arg1として、
ネスト形式でアクセスすることが可能です。
※ActionFormとして利用して、ActionFormにネストしたプロパティを持たせることも当然可能です。
見どころ3(s:formとボタンでのメソッド)
add/index.jspのタグについて
<s:form>
と、formタグに、POSTするActionの設定がありません。
Submitボタンもべたなhtmlタグです。
<input type="submit" name="submit" value="サブミット"/>
こうすると、今のActionの、submitメソッドが実行されることになります(nameで指定したメソッド)
ちなみに、1ユースケースをActionとするので、ユースケース内で別Actionを呼ぶような構成にはせず、
画面表示、確認画面表示、結果表示などをすべて同一のActionで賄うような構成になるため、特にActionの指定が必要無い。
という思想っぽいです。
当然、action=”/radio”など別のActionを指定することも可能です。
見どころ4(f:h()と、インクルード)
${f:h(result)}
スコープの中の、resultという名前の値を、サニタイジングして表示する。
sturtsの
ちなみに・・・タグリブディレクティブの宣言がないのは、
view/common/common.jspで宣言されているのを、
明示的なincludeではなく、web.xmlにて
<jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <el-ignored>false</el-ignored> <page-encoding>UTF-8</page-encoding> <scripting-invalid>false</scripting-invalid> <include-prelude>/WEB-INF/view/common/common.jsp</include-prelude> </jsp-property-group> </jsp-config>
として共通でインクルードするような設定になっています。
ちなみに、functionについては、SAStruts本体を取得して解凍すると
\java\sa-struts\src\main\resources\META-INF
あたりにtldが存在するので必要であれば参照ください。