Strutsメモ7

2003/6/19 作成
2003/8/8 更新

Action、validateのスイッチ

最近、ちょっと悩んだことで。同じHTMLフォームに対して、複数のActionがあるとき、Actionによって、入力チェックも異なる場合があります。例えば、管理系の画面で、同じFormでも登録と更新によって、Actionが違うし、入力チェックも違います。思いつくもの、人に聞いた方法として、以下の方法があります。

(A)JavaScriptでActionを書き換える

Submit用のボタンを押したときに、Formのactionパスを書き換える方法です。

<html:form action="/action1">
    <p>message1<html:text property="message1"/>
    <p>message2<html:text property="message2"/>
    <p><html:button property="button1" value="click1" onclick="doAction('action1')"/>
       <html:button property="button1" value="click2" onclick="doAction('action2')"/>
</html:form>

<script language="JavaScript">
<!--
    function doAction(jsActionName){
        if(jsActionName == 'action1'){
            submitForm('<html:rewrite page="/action1.do"/>');
        }else if(jsActionName == 'action2'){
            submitForm('<html:rewrite page="/action2.do"/>');
            //関係ないけど、なぜにhtml:rewriteにはaction属性がない?
        }else{
            //
        }
    }

    function submitForm(actionName){
        with(document.forms[0]){
            action = actionName;
            submit();
        }
        return false;
    }
//-->
</script>

(B)Actionの中で処理を分ける

<html:form action="/saction">
    <p>message1<html:text property="message1"/>
    <p>message2<html:text property="message2"/>
    <p><html:submit property="submit1" value="submit1"/>
       <html:submit property="submit2" value="submit2"/>
</html:form>

スイッチ用のActionの中で、パラメータを見てActionを振り分けます。

	if(request.getParameter("submit1") != null){
		return mapping.findForward("submit1");

	}else if(request.getParameter("submit2") != null){
		return mapping.findForward("submit2");	

スイッチ用のActionのstruts-config.xml。スイッチ用のActionから、さらに別のアクションにフォワードします。

        <action
            path="/saction"
            type="SAction"
            name="form1"
            validate="false"
            <forward name="submit1" path="/action1.do"/>
            <forward name="submit2" path="/action2.do"/>
        </action>

(A)(B)の方法とも、呼ぶフォームを同じプロパティーで、異なるvalidateを記述(あるいは異なるフォーム名をつけてvalidate.xmlに入力チェックを記述)します。どちらの方法でもやりたいこと(ActionおよびFormのvalidateを切り替える)はできました。ただ、(A)の方法だと、JavaScriptの記述が増え、(B)の方法だとstruts-config.xmlとActionクラスの記述が増えます。また、validatorのクライアントサイドチェックはできません。う〜ん、まあ適当な解決方法か。もっといい方法ある?

なお、Struts1.1のValidaterを使う場合は、同じValidaterFormに対して異なる論理名をつければ、イチイチ固定クラスを作らなくてもよいです。(thanks codyさん)

<form-beans>
    <form-bean name="form1" type="ValidatorFormA"/>
    <form-bean name="form2" type="ValidatorFormA"/>
</form-beans>


AcctionMessage

<p>AcctionMessageを使ってみました。<html:messages>を利用します。<html:errors>と同じやり方で、keyに対応するメッセージをメッセージリソースファイルから取得し、表示することができます。注意点?としては、message="true"を指定しないと表示されません。
    ActionMessages msgs = new ActionMessages();
    msgs.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(key));
    saveMessages(request, msgs);
    <html:messages id="hoge" message="true">
          <bean:write name="hoge"/>
    </html:messages>


Antタスクの利用

ここでは、Strutsを利用した開発時に役立つ(かもしれない)Antタスクを紹介します。 Antって何?という方は、このへんを参考にしてください。 なお、Ant本家はここで、翻訳はここ(Ja-Jakarta)にあります。

native2ascii

日本語記述のプロパティーファイルはnative2asciiを行う必要があります。Antのnative2asciiタスクが利用できます。

    <native2ascii 
        encoding="Shift_JIS" 
        src="WEB-INF/src" 
        dest="WEB-INF/classes" 
        includes="**/*_ja.properties" 
    />

xmlvalidate

struts-config.xml(やweb.xml)のXMLの妥当性検査を行う場合には、xmlvalidateタスクが便利です。

    <xmlvalidate file="WEB-INF/struts-config.xml" warn="false">
      <dtd publicId="-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
           location="WEB-INF/struts-config_1_1.dtd"/>
    </xmlvalidate>




もどる