2003/6/19 作成
2003/8/8 更新
最近、ちょっと悩んだことで。同じHTMLフォームに対して、複数のActionがあるとき、Actionによって、入力チェックも異なる場合があります。例えば、管理系の画面で、同じFormでも登録と更新によって、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>
<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>
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>
ここでは、Strutsを利用した開発時に役立つ(かもしれない)Antタスクを紹介します。 Antって何?という方は、このへんを参考にしてください。 なお、Ant本家はここで、翻訳はここ(Ja-Jakarta)にあります。
日本語記述のプロパティーファイルはnative2asciiを行う必要があります。Antのnative2asciiタスクが利用できます。
<native2ascii encoding="Shift_JIS" src="WEB-INF/src" dest="WEB-INF/classes" includes="**/*_ja.properties" />
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>