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が存在するので必要であれば参照ください。