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

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

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

お題は、こちら

  • 公式サイト: Welcome
  • バージョン: 2.2.1

前身は、WebWorkというフレームらしいです。
所々に xwork という文字が出てくるのですが、struts2となってもその名称が残るのですね。

AddAction.java

まずは、アクションクラスです。

package webapp.action;

import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.interceptor.validation.SkipValidation;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.annotations.RequiredFieldValidator;

@Results(value = { @Result(name = "input", location = "input.jsp"),
        @Result(name = "result", location = "result.jsp") })
public class AddAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    private Integer arg1;

    private Integer arg2;

    private Integer result;

    @SkipValidation
    @Override
    public String execute() throws Exception {
        return "input";
    }

    public String calculate() throws Exception {
        result = arg1 + arg2;
        return "result";
    }

    @RequiredFieldValidator(message="arg1は必須")
    public Integer getArg1() {
        return arg1;
    }

    public void setArg1(Integer arg1) {
        this.arg1 = arg1;
    }

    @RequiredFieldValidator(message="arg2は必須")
    public Integer getArg2() {
        return arg2;
    }

    public void setArg2(Integer arg2) {
        this.arg2 = arg2;
    }

    public Integer getResult() {
        return result;
    }
}

Conventionプラグインを使ってみました。struts2-convention-plugin-2.2.1.jar を追加で配置するだけで認識してくれるようです。
リクエストパラメータは、Integer型で受け取っても大丈夫っぽい。
リクエストパラメータは、publicフィールドにもバインドされます。
アノテーションって入れ子になると見づらい。
バリデータのアノテーションは、getterに付けるのですが、フィールドに付ける仕様にした方が見やすかったのではと思ったりします。
Ovalプラグインを使ってもバリデーションができるらしく、そっちの場合、フィールドにアノテーションを付けるっぽいです。

input.jsp

入力画面です。

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page pageEncoding="UTF-8" %>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
<head>
<title>input</title>
</head>
<body>
<s:fielderror />
<s:form theme="simple" action="add">
arg1: <s:textfield key="arg1" /><s:fielderror fieldName="arg1"/><br>
+<br/>
arg2: <s:textfield key="arg2" /><s:fielderror fieldName="arg2"/><br>
<s:submit method="calculate" />
</s:form>
</body>
</html>

formにthemeとか必要なのかなぁ。デフォルトが確かsimpleじゃないんだよなぁ。

result.jsp

結果出力画面です。

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page pageEncoding="UTF-8" %>
<%@ taglib uri="/struts-tags" prefix="s" %>
<html>
<head>
<title>result</title>
</head>
<body>
result: <s:property value="%{result}"/>
</body>
</html>

DIコンテナなしでもアクションにインターセプタ使えるの事が、よいなぁと思いました。

実案件で使ったのですが、未だによくわかりません。
1つの目的に複数の選択肢がある感じで、チームとしてのベストプラクティスを作る必要があり面倒に感じます。

https://issues.apache.org/jira/browse/WW-2803

以上