読者です 読者をやめる 読者になる 読者になる

いろんなJava Webフレームワークで同じ画面を作ってみる(SAStruts編)

いろんなJava Webフレームワークで同じ画面を作ってみる(SAStruts編)です。
お題は、こちら

公式のチュートリアルにあるのとほぼ同じなんですが、計算結果は別画面に遷移して出力するようにしています。
セットアップは、doltengで簡単にできます。
SAStrutsは、S2Containerに依存します。

convention.dicon

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
  "http://www.seasar.org/dtd/components24.dtd">
<components>
  <component class="org.seasar.framework.convention.impl.NamingConventionImpl">
    <initMethod name="addRootPackageName">
      <arg>"webapp"</arg>
    </initMethod>
  </component>
</components>

まずは、addRootPackageNameでベースとなるパッケージを指定します。

AddAction.java

アクションクラス。

package webapp.action;

import javax.annotation.Resource;

import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;

import webapp.form.AddForm;

public class AddAction {

    public Integer result;

    @ActionForm
    @Resource
    protected AddForm addForm;

    @Execute(validator = false)
    public String index() {
        return "input.jsp";
    }

    @Execute(input = "input.jsp")
    public String calculate() {
    	result = Integer.valueOf(addForm.arg1) + Integer.valueOf(addForm.arg2);
        return "result.jsp";
    }
}

アクションクラスもフォームクラスもsetter,getter不要なので見た目はすっきりします。
リクエストパラメータは、アクションクラスのフィールドでも受け取れますが、フォームクラスを作るのが定石です。
フィールドresultは、出力オンリーなのでフォームクラスには作らず、アクションクラスに作ります。
個人的には、実行メソッドの戻り値の型は、Stringじゃなく特別な型だったらなーと思っています。
アクションクラス、フォームクラスともにPOJOです。ちなみに自分はPOJOに対するこだわりはないです。

AddForm.java

次はフォームクラス。

package webapp.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;
}

リクエストパラメータは、Stringで受け取り、型変換はアクションクラスで実施します。
バリデーション用のアノテーションには、target属性が用意されており、検証対象となるメソッドを指定できるので良い感じです。

input.jsp

入力画面です。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>input</title>
</head>
<body>
<html:errors/>
<s:form>
<html:text property="arg1"/><html:errors property="arg1"/><br/>
+<br/>
<html:text property="arg2"/><html:errors property="arg2"/><br/>
<input type="submit" name="calculate"/>
</s:form>
</body>
</html>

JSPは、JSTL + 素のStrutsのカスタムタグ + SAStrutsのELファンクション、カスタムタグで作る感じでしょうか。
素のStrutsで理解しておかなかければならないのは、カスタムタグくらいでしょう。

result.jsp

出力結果画面です。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>result</title>
</head>
<body>
result: ${f:h(result)}
</body>
</html>

that's it.