Forums: Open Discussion (Thread #33108)

画面ごとにActionFormを持つ場合のパラメータに関して (2012-11-16 07:30 by xuzan #66306)

各画面でActionFormを持つ思想でアプリ作成する場合
パラメータ移し変えの実現方法に関してご教授お願いいたします。

■例
A画面
 名前を入力する。
 ActionFormはAForm(fieldにnameを持つ)
 A画面の実行ボタンを押すと、B画面へ遷移する。
B画面
 A画面で入力された名前を表示する。
 ActionFormはBForm(fieldにnameを持つ)

このような構成の場合、AFormの名前fieldの値をBFormの名前fieldの値に移す過程はどこに記述すれば簡易に実現できますでしょうか。Actionクラスを作成し詰め替えをする以外の方法はないでしょうか。(できればActionクラスを作成したくない)

A画面とB画面で同一ActionFormを持ち、sessionスコープにすれば実現可能ですが、
あくまでA画面とB画面のActionFormは別で作成する前提となります。
 

Reply to #66306×

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: 画面ごとにActionFormを持つ場合のパラメータに関して (2012-11-22 18:18 by suzukihrzzl #66375)

A画面⇒_AForm⇒B画面⇒_BForm …
といった遷移の場合に、
A画面で入力した"name"を_BFormに格納する方法を例にとり、
回答を記載させて頂きます。

本件の実現方法には、
・"name"がどの様な値であるか
・A画面⇒B画面の遷移の間にはどの様な業務処理があるか
等により、いくつかの実装方法があげれられますので、
以下4つの方法と付随する制約をご確認頂き、ご希望に沿うかご検討ください。

① B画面に遷移するForwardActionの定義で"_BForm"を指定する方法
[struts-config.xmlの実装例]
 <action path="/A画面BL" name="_AForm" scope="session">
  <forward name="success" path="/B画面SCR.do"/>
 </action>
 <action parameter="/B画面.jsp" name="_BForm" path="/ B画面SCR" scope="session"/>
 ※/~BLがBLogicActionのパス、/~SCRがForwardActionのパス

[ 説明 ]
 このパターンでは、/B画面.jspへの遷移で"_BForm"を指定することにより、
 ForwardActionの制御前にRequestProcessorExが"_BForm"にA画面からのリクエストの情報を
 書き込みます。
 ※/A画面BLのアクションフォームは、"_AForm"
  /B画面SCRのアクションフォームが、"_BForm"であることにご注意ください。

 値の詰め替えでは無く、A画面からのリクエストパラメータが有効なうちに
 "_BForm"に切り替えることで、A画面の入力値"name"を"_BForm"に設定することが可能です。

[ 制約 ]
 このパターンの制約は以下3点
 ・A画面から呼出されたBLogicの戻り値をB画面で利用する場合は、この方法は利用できない。
  ⇒blogic-io.xmlで指定するBLogicの戻り値(formスコープ)の格納先は"_AForm"である為、
   破棄されて読み込みができなくなります。
   "_AForm"にA画面から呼出されるBLogicの結果を反映しない場合にご利用ください。
 ・A画面がファイルアップロードを行う画面の場合、"_BForm"には反映されない。
  ⇒ファイルアップロードには、マルチパート形式のリクエストを使用するが、
   マルチパート形式のリクエストは、JavaEEサーバが解析してくれず、
   strutsがリクエストボディをストリームとして解析しているため、
   フォワード先では、リクエストパラメータの再取得ができない。
・B画面からさらに先のC画面の"_CForm"には値は引き継がれない。
  ⇒ この制限を取り払うには、B画面にhtml:hiddenを配置する必要がある。
    "_CFrom"まで値を引き継ぐご要望がある場合は、②以降のパターンでご検討ください。

② ActionForm詰め替え用のBLogicActionとBLogicを実装する方法
[struts-config.xmlの実装例]
 <action path="/A画面BL" name="_AForm" scope="session">
  <forward name="success" path="/Form詰替えBL.do"/>
 </action>
 <action name="_BForm" path="/Form詰替えBL" scope="session">
   <forward name="success" path="/ B画面SCR.do"/>
 </action>
 <action parameter="/B画面.jsp" name="_BForm" path="/ B画面SCR" scope="session"/>

[Bean定義ファイルの設定例]
 <bean class="jp.terasoluna.fw.web.struts.actions.BLogicAction"
    name="/Form詰替えBL" scope="singleton">
   <property name="businessLogic" ref="Form詰替えBLogic"/>
 </bean>

[Form詰替えBLogicの実装例]
 public BLogicResult execute(Action2Input param) {
   BLogicResult result = new BLogicResult();
   result.setResultObject(param);
   result.setResultString("success");
   return result;
 }

[ 説明 ]
 このパターンではA画面から呼出されたBLogicAction(とBLogic)の処理の後、
 ActionFormの詰替えを行うBLogicAction(とActionFormの詰替えを行う為のBLogic)
 にアクションチェーンすることで、"_AForm"から"_BForm"に"name"と前者のBlogicの結果を
 詰替えた上で、B画面に"_BForm"を渡しています。
 ※ ActionFormの詰替えを行う為のBLogic
  ⇒InputをそのままBLogicResultのsetResultObject()で設定するBLogic。
   blogic-io.xmlで"_AForm"から"_BForm"に詰め替えるプロパティを入出力の両方に定義する。

[ 制約 ]
 このパターンの場合、大きな制約はありませんが、アクションチェーンを行うことにより、
 定義ファイルの記述が複雑になるデメリットがあります。

③ B画面にhidden項目として"name"を持つ方法
[B画面.jspの実装例]
 <ts:form action="/B画面BL">
  <logic:present name="_AForm" >
   <bean:define id="name" name="_AForm" property="name" type="java.lang.String"/>
   <html:hidden property="name" value="<%= name %>"/>
  </logic:present>
  <ts:submit value="実行" />
 </ts:form>

[ 説明 ]
このパターンでは、"_AForm"の値をB画面のhidden項目で取得し、改めて"name"を含むリクエストを
送信しています。

[ 制約 ]
このパターンの制約は、"name"の値が盗み見や改竄の危険に晒される点です。
"name"が、ユーザに見せてはならない情報や、ユーザに操作させてはならない情報である場合は
利用できません。

④ "name"を格納するBeanを作成し、セッションで管理する。
[ 実装方法 ] 以下の実装を行う。
・"name"のフィールドとアクセッサメソッドを持つBeanクラスを作成する。
・A画面から呼出される業務ロジックでBeanのインスタンスを生成し、"name"をセットする。
・業務ロジックの戻り値にBeanを設定する。
・業務ロジックの出力定義で、Beanをセッションスコープに格納する。

上記の実装を行うことで、各画面から共通でBeanに格納された"name"を参照可能になります。
Beanで管理すれば、ActionFormの実装に影響はありません。

このパターンの制約は、セッションに格納したBeanを削除するパスをあらかじめ決めておく必要があり、
そのパスを通らない画面遷移が行われると(途中まで処理してメニューに戻る等)、
Beanの削除の機会が無くなる点です。
※Beanに格納する値がアカウント名などのユーザ情報である場合は、
TERASOLUNAが提供する「WB-01 ユーザ情報管理機能」をご活用下さい。
Reply to #66306

Reply to #66375×

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