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

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

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

お題は、こちら

Struts1は、一番普及してしまったフレームワークではないでしょうか。
今回、他のフレームワークの挙動と合わせるため、LookupDispatchAction を使おうかと思いましたが、面倒くさそうなのであきらめました。また、1.3系より1.2系の方が使われている感じがするので1.2系にしました。

AddInitAction.java

まずは、入力画面を表示するアクションクラス。

package webapp.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class AddInitAction extends Action {

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        return mapping.findForward("success");
    }
}

AddSubmitAction.java

次は、計算を実行するアクションクラス。

package webapp.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import webapp.form.AddForm;

public class AddSubmitAction extends Action {

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        AddForm addForm = (AddForm) form;

        addForm.setResult(Integer.valueOf(addForm.getArg1())
                + Integer.valueOf(addForm.getArg2()));

        return mapping.findForward("success");
    }
}

form をキャストするあたりが悲しい。
戻りは、 return new ActionForward("/WEB-INF/jsp/input.jsp"); と書いちゃった方が、わかりやすいんではと思ったり。

AddForm.java

package webapp.form;

import org.apache.struts.validator.ValidatorForm;

public class AddForm extends ValidatorForm {

	private static final long serialVersionUID = 1L;

	private String arg1;
	private String arg2;
	private Integer result;

	public Integer getResult() {
		return result;
	}
	public void setResult(Integer result) {
		this.result = result;
	}
	public String getArg1() {
		return arg1;
	}
	public void setArg1(String arg1) {
		this.arg1 = arg1;
	}
	public String getArg2() {
		return arg2;
	}
	public void setArg2(String arg2) {
		this.arg2 = arg2;
	}
}

resultは、出力オンリーのフィールドなのでフォームに含める事に違和感を感じるこの頃です。
リクエストパラ―メータを受け取るフィールドは、実際扱うのが数値でもString型にしておくのが定石なようです。
また、DynaActionForm とかありましたが、なんでそんなもん作ったかなぁという感じです。

input.jsp

入力画面。

<%@ page contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html:html>
<head>
<title>input</title>
</head>
<body>
<html:errors/>
<html:form action="/addSubmit" >
<html:text property="arg1" /><html:errors property="arg1"/><br/>
+<br/>
<html:text property="arg2" /><html:errors property="arg2"/><br/>
<html:submit property="calculate" />
</html:form>

</body>
</html:html>

result.jsp

結果出力画面。

<%@ page contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html:html>
<head>
<title>input</title>
</head>
<body>
result: <bean:write name="AddForm" property="result"/>
</body>
</html:html>

struts-config.xml

画面遷移は、XMLで定義。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>

    <form-beans>
        <form-bean name="AddForm" type="webapp.form.AddForm"/>
    </form-beans>

    <action-mappings>
        <action path="/addInit" type="webapp.action.AddInitAction" name="AddForm"
                                                                   scope="request" validate="false">
            <forward name="success" path="/WEB-INF/jsp/input.jsp"/>
        </action>
        <action path="/addSubmit" type="webapp.action.AddSubmitAction" name="AddForm" scope="request"
            validate="true" input="/WEB-INF/jsp/input.jsp">
            <forward name="success" path="/WEB-INF/jsp/result.jsp"/>
        </action>
    </action-mappings>

    <controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>

    <message-resources parameter="MessageResources" />

    <plug-in className="org.apache.struts.tiles.TilesPlugin" >
      <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
      <set-property property="moduleAware" value="true" />
    </plug-in>

    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
      <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
    </plug-in>

</struts-config>

アクションフォームのスコープは、デフォルトでsessionになるので嵌ることがある。

validation.xml

バリデーションもXMLで定義。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE form-validation PUBLIC
          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
          "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
    <formset>
        <form name="AddForm">
            <field
                property="arg1"
                depends="required,integer">
                    <arg key="arg1" resource="false"/>
            </field>
            <field
                property="arg2"
                depends="required,integer">
                    <arg key="arg2" resource="false"/>
            </field>
        </form>
    </formset>
</form-validation>

とにかくXMLの設定が面倒くさいといったところでしょう。

以上