いろんなJava Webフレームワークで同じ画面を作ってみる(Struts1編)
いろんなJava Webフレームワークで同じ画面を作ってみる(Struts1編)です。
お題は、こちら。
- 公式サイト: The Apache Struts Web Application Framework
- バージョン: 1.2.9
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の設定が面倒くさいといったところでしょう。
以上