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>