2

Struts 1.2.2を使用しており、ここに状況があります。したがって、FormAとFormBの2つのフォームがあります。ActionAとActionBの2つのアクションもあります。

これで、ActionAが呼び出されると、送信されたBeanとしてFormAが取得されます。すべての処理を実行し、フォームを保存し、OrderIdを作成し、成功するとActionBに転送します。次に、ActionBはOrderIdに基づいてFormBにデータを入力し、次のjspに転送します。

内容が大きく異なるため、2つのアクションでフォームを共有する必要はありません。また、フォームはjspページでの表現のみを表す必要があります。また、すべてのページでコンテンツをDbに保存しています。フローは5ページあり、1ページは2ページ後に残すことができます。もう一度戻って1ページから開始します。ただし、1ページと2ページはDBからデータを取得して表示する必要があります。したがって、orderIDが存在する場合は、DBからデータをフェッチすることにより、そのorderIdに基づいてフォームにデータを入力します。

ただし、このorderIdをあるアクションから別のアクションに渡す簡単な方法は見つかりません。

request.setAttribute()コントロールがActionBに到達するまでに、完全に新しいRequest Objectが設定されているため、ActionAの最後では使用できません。あるアクションから別のアクションに発生する転送で、リクエストが更新されると推測しています。ただし、jspに転送する場合、リクエストは保持されます。

session.setAttribute()誰かがブックマークされたURLを試み、そのページがセッションで最後に保存されたOrderIdを取得し、それを処理しようとする可能性があるため、orderIdをセッションに保存しないでください。

また、それは共有されていないため、formbeansに入れることはできません。

1つのオプションは、URLでそれをパラメーターとして渡すことです(例:ActionB?OrderId = 89)。ただし、その欠点は、誰かがURLのorderIdを変更して、そのランダムなorderIdのデータをフェッチしようとする可能性があることです。他の顧客に属する注文を表示する権限がない人を防ぐために、いつでもチェックを入れることができますが、現時点では複雑なプロセスです。また、Struts 1.2.2では、プログラムで新しいActionForwardオブジェクトを作成し、現在のパスの最後に「?OrderId=89」を明示的に追加する必要があると思います。

助けてくれる友達はいますか?

4

1 に答える 1

2

実際、私はそれをセッションに入れます。次に、ActionBから取得したら、すぐに削除します。

Integer orderId = session.getAttribute("myapp.OrderId");
session.removeAttribute("myapp.OrderID");

これは通常、Flashスコープ変数として知られています。Strutsには公式のFlashスコープはありませんが、これはそれをシミュレートします。

基本的に、OrderIdをリロードする心配はありません。これは、ActionAがセッションでこの変数を設定し、ActionBに転送し、ActionBがセッションから取得して削除するためです。誰かがセッションでそれをスタックさせる唯一の方法は、ActionAが実行された後、ActionBが実行される前にリクエストを停止する場合です。これはほとんどあり得ず、とにかくActionBを表示すると削除されるだけで、おそらくそれほど悪くはありません。

これにより、ActionBを挿入して、OrderIDがセッションに含まれていることを確認し、含まれていない場合はActionAに転送することもできます。

于 2012-09-20T12:21:14.913 に答える