Forums: Open Discussion (Thread #22886)

1つの画面で異なるバリデーションを行なう場合のblogic-io設定方法 (2009-05-28 16:15 by Anonymous #44038)

お世話になっております。

1画面でボタンの種類によって、バリデーションが変わる画面があります。
例:更新ボタンは全項目チェック、検索ボタンはチェックなし、部分更新ボタンは指定項目のみチェック等。。。

htmlフォームやアクションフォーム、beanは1つだけ用意し、
また、アクションパス、バリデータはパターン分用意し、
各ボタンのサブミット前にjavascriptにてアクションを切り替えることで
バリデーションを切り替えて実装しています。

この場合、blogic-io.xmlにもアクションパス分だけ、設定を書く必要がありますが、
画面項目が多い画面などでは、すぐに数百行になってしまいます。
(しかも、異なるのは、アクションパス名のみで冗長なものばかり・・・)

何とか、blogic-ioをシンプルに記述する方法はありますでしょうか?


-- struts-config.xml --

<action path="/Init" name="sampleForm" scope="request"
validate="true" input="/WEB-INF/jsp/sample.jsp" >
<forward name="success" path="/WEB-INF/jsp/sample.jsp"/>
<forward name="error" path="/WEB-INF/jsp/sample.jsp"/>
</action>
<action path="/Update" name="sampleForm" scope="request"
validate="true" input="/WEB-INF/jsp/sample.jsp" >
<forward name="success" path="/WEB-INF/jsp/sample.jsp"/>
<forward name="error" path="/WEB-INF/jsp/sample.jsp"/>
</action>

<action path="/Search" name="sampleForm" scope="request"
validate="true" input="/WEB-INF/jsp/sample.jsp" >
<forward name="success" path="/WEB-INF/jsp/sample.jsp"/>
<forward name="error" path="/WEB-INF/jsp/sample.jsp"/>
</action>


-- validation.xml --
<form-validation>
<formset>
<form name="/Search">
<!-- チェック不要 -->
</form>

<form name="/Update">
<field property="no" depends="required">
<arg key="ナンバー" position="0" resource="false" />
</field>
</form>
</formset>
</form-validation>


-- blogic-io.xml --

<blogic-io>
<action path="/Init">
<blogic-params bean-name="jp.co.sample.bean.SampleBean">
<set-property property="no" blogic-property="no" source="form" />



</blogic-params>
<blogic-result >
<set-property property="no" blogic-property="no" dest="form" />



</blogic-result>
</action>

<action path="/Search">
<blogic-params bean-name="jp.co.sample.bean.SampleBean">
<set-property property="no" blogic-property="no" source="form" />



</blogic-params>
<blogic-result >
<set-property property="no" blogic-property="no" dest="form" />



</blogic-result>
</action>

<action path="/Update">
<blogic-params bean-name="jp.co.sample.bean.SampleBean">
<set-property property="no" blogic-property="no" source="form" />



</blogic-params>
<blogic-result >
<set-property property="no" blogic-property="no" dest="form" />



</blogic-result>
</action>
</blogic-io>

よろしくお願いします。

Reply to #44038×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 1つの画面で異なるバリデーションを行なう場合のblogic-io設定方法 (2009-05-28 17:44 by taromaru #44039)

blogic-io.xmlに冗長な定義をしたくないということであれば、
ビジネスロジックを実行するアクションパスを1つにしておき、
バリデーションを行うだけのForwardActionをBLogicActionの前に配置する方法があります。

・更新ボタン押下->/Update(ForwardAction)->/Execute(BLogicAction)
・検索ボタン押下->/Search(ForwardAction)->/Execute(BLogicAction)
となるようアクションマッピングをしておくと、
押下するボタンに応じてバリデーションルールを変更でき、
また、blogic-io.xml に冗長な定義をせずに済みます。
Reply to #44038

Reply to #44039×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 1つの画面で異なるバリデーションを行なう場合のblogic-io設定方法 (2009-05-28 19:44 by Anonymous #44046)

ご回答ありがとうございます。
もう少し、具体的にお話頂けると助かります。
開発経験が浅くて、あまり理解できていません。
お手数おかけしますが、よろしくお願いします。
Reply to #44038

Reply to #44046×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 1つの画面で異なるバリデーションを行なう場合のblogic-io設定方法 (2009-05-28 21:34 by taromaru #44051)

バリデーションルールを変更するために、別々のアクションパスを用意しなければならないということは理解しているかと思います。

その方法として、(同じロジックを実行する)BLogicActionのパスを複数設定しているというのが現状です。
・更新ボタン押下->/Update(BLogicAction)
・検索ボタン押下->/Search(BLogicAction)
この方法では、(同じロジックを実行する)BLogicアクションのパスが複数になってしまうので、
blogic-io.xmlには、ご指摘の通り、複数設定したパスの分だけ冗長な記述をする必要があります。

私が提示した方法は、
BLogicアクションのパスが複数にならないようにする方法です。
・更新ボタン押下->/Update(ForwardAction)->/Execute(BLogicAction)
・検索ボタン押下->/Search(ForwardAction)->/Execute(BLogicAction)

バリデーションは/Update等のアクションパスに対して設定しているので、validation.xmlは、現状から変更不要です。
押下するボタンに応じて/Update.doや/Search.doを実行するという点も変わらないので、JSPの修正も不要です。
現状からの変更が必要なのは、
・struts-config.xml
・moduleContext.xml
・blogic-io.xml(冗長な定義をなくしたいという、今回の目的のファイル)
です。

まず、特定のロジックを動作させるためのパスを1つ決めます。
便宜上、このパスを「/Execute」とします。

</Execute(BLogicAction)をマッピング>
moduleContext.xmlもstruts-config.xmlも、
現状の/Updateや/Searchを元にすると、すぐに出来ます。
[moduleContext.xml]
・/Updateのbean要素を丸ごと複製して、bean要素のname属性を/Executeに変更する。
[struts-config.xml]
・/Updateのaction要素を丸ごと複製して、action要素のpath属性を/Executeに変更する。
・/Executeのaction要素のinput属性を削除し、validate属性はfalseに変更する。(/Executeではバリデーションチェックを行いません)

</Updateや/Searchのアクションクラスを、BLogicActionからForwardActionに変更>
[moduleContext.xml]
・/Updateや/Searchのbean要素のclass属性にある、「BLogicAction」の部分を「ForwardAction」に変更する。
・/Updateや/Searchのbean要素の子要素(<property name="businessLogic"~)を削除する。

</Updateや/Searchの遷移先を、JSPから/Execute(BLogicAction)に変更>
[struts-config.xml]
・<forward name="success"~のpathを、/Execute.doに変更する。
・<forward name="error"~を削除する。
(<forward name="success"~の変わりに、action要素のparameter属性でも、遷移先を指定できます。)

ここまでの設定で、
/Updateや/Searchに分散していたBLogicActionは、
/Executeに集約されることになります。
/Updateや/Searchが実行されると、それぞれのパスに応じたバリデーションチェックが行われた後、
/Executeが実行されるようになります。

最後に、
blogic-io.xml上、/Updateや/Searchというパスで、同じものがいくつも定義されているもののうち、
1つだけをpath="/Execute"に変更し、その他の冗長な定義を削除します。
Reply to #44046

Reply to #44051×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 1つの画面で異なるバリデーションを行なう場合のblogic-io設定方法 (2009-05-29 10:39 by Anonymous #44066)

ご丁寧にありがとうございました。
おかげさまで、blogic-io.xmlに冗長な記述をせず、コンパクトにまとまりました。
ありがとうございました。
Reply to #44038

Reply to #44066×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

(質問の趣旨とは異なりますが、)ボタンに応じてアクションを切り替える方法 (2009-05-29 11:26 by taromaru #44070)

解決できたようで何よりです。

質問の趣旨とは異なるので後回しにしましたが、
同一のhtmlフォームで、
押下するボタンに応じて実行するアクションを切り替えたい場合は、
FWで用意しているDispatchActionを使用すると便利ですので、
是非ご利用ください。

・DispatchActionをマッピングする(struts-config.xml, moduleContext.xml)
・JSP上のサブミットボタンに、識別できる名前をつける(JSP)
で、押下するボタンに応じて、アクションを切り替えられます。

DispatchActionの使用方法について、
詳しくは、機能説明書の
WE-02 標準ディスパッチャ機能
をご覧ください。
Reply to #44038

Reply to #44070×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login