アクセサメソッドを書く手間が省けるDynaActionFormを使ってみた

Beanはただ値を格納するだけに利用する場合は、自動でアクションフォームを作成してもらいましょう。アクセサメソッドを書く手間が省けます。

ファイル構成

action要素でvalidate属性をfalseにしないと何故かエラーになってしまいます。デフォルトはtrueみたいですね。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
    <form-beans>
        <form-bean name="autoBean"
            type="org.apache.struts.validator.DynaValidatorActionForm">
            <form-property name="name1" type="java.lang.String"></form-property>
            <form-property name="name2" type="java.lang.String"></form-property>
            <form-property name="name3" type="java.lang.String"></form-property>
        </form-bean>
    </form-beans>
    <action-mappings>
        <action path="/Input" forward="/pages/Input.jsp">
        </action>
        <action path="/Output" type="HelloAction" name="autoBean" validate="false">
            <forward name="success" path="/pages/Output.jsp"></forward>
        </action>
    </action-mappings>
</struts-config>
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 org.apache.struts.action.DynaActionForm;

public class HelloAction extends Action {
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        DynaActionForm dynaForm = (DynaActionForm) form;

        String name1 = dynaForm.get("name1").toString();
        dynaForm.set("name1", "Mr." + name1);
        
        dynaForm.set("name3","名無し");

        return mapping.findForward("success");
    }
}
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html:html>
<head>
<html:base/>
</head>
<body>
<h1><%=request.getRequestURI()%></h1>
<html:form action="/Output.do">
    名前1:<html:text property="name1" />
    名前2:<html:text property="name2" />
    名前3:<html:text property="name3" />
    <html:submit />
</html:form>
</body>
</html:html>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<html:html>
<head>
<html:base />
</head>
<body>
    <h1><%=request.getRequestURI()%></h1>
    <p>
        <bean:write name="autoBean" property="name1" />さんと、
        <bean:write name="autoBean" property="name2" />さんと、そして、
        <bean:write name="autoBean" property="name3" />さん、おめでとうございます!
    </p>
</body>
</html:html>

実験開始

入力画面では3つ目の値は空にしておいてもエラーにならないことを確かめます。

struts_01_141010

アクションクラスで名前1に「Mr.」をつけて、名前3には「名無し」をセットします。

struts_02_141010

DynaActionFormにて値の受け渡しができることが確認できました。今回は悪書フォームを自分で記述していないので、reset()でリクエストのエンコーディングを設定できません。そのためinputフィールドで日本語を使用すると文字化けします。しかし、アクションクラスでセットした値は大丈夫でした。jsp側のcharsetで対応出来るみたいです。