1

Struts 2 値スタックとリクエスト スコープを理解したい。struts2 値スタックがリクエスト スコープと同じように機能するようにします。

たとえば、struts 2 で action1 を呼び出した場合、アクションはいくつかの db タスクを実行して戻ります。ケースと呼ばれるオブジェクトに対して何らかの操作を実行します (タイプ Cases、ここで Cases は getter と setter を持つ Bean クラスです)。ケース オブジェクトはクラス レベルで宣言されます。

action1 によってビューがレンダリングされ、たとえば jsp1 がレンダリングされました。

jsp1 にも action2 と呼ばれるアクションがあります。action2 は action1 と同じ Java ファイルにつながりますが、メソッドが異なります。

ここで、action1 で使用されたオブジェクトにアクセスしたいと思います。action1 のケースでは、Value Stack にプッシュされ、jsp1 でアクセスされました。

getter メソッドにアクセスしようとしただけですが、null 値が返されます.... !!

方法に関する解決策はありますか??? またはそれは可能ですか?? それが可能かどうかはわかっていますが、vsとリクエストスコープの違いは何ですか...

4

2 に答える 2

1

ValueStack がリクエスト スコープ内にあることについて Dave が言っていることは正しいです。

ただし、データベースからデータを一度取得し、このデータを複数のアクション/リクエストで使用する限り、目的を達成するには、いくつかの可能なアプローチを使用できます。

1)アクションにSessionAwareインターフェースを実装させ、セッションマップとの間でデータを「手動で」取得および挿入するコードを記述します。このアプローチは、追加の構成を必要とせず、非常に単純で「マジックレス」です。一方、定型コードをアクション クラスに追加し、作業が終了したらセッションからデータを「手動で」削除する必要があります (または、メモリの節約が重要でない場合はそのままにしておくこともできます)。 .

2) アクションでModelDrivenインターフェースを実装し、ScopedModelDrivenInterceptor を構成して「ケース」モデルのセッション スコープを管理します。これは、ドキュメントを参照して非常に具体的な構成の詳細を struts.xml に追加する必要があるため、SessionAware アプローチよりも単純ではありません。定型コードを追加する必要があり、セッションからデータを削除する簡単な方法はありません。

3) Struts2 Conversation Pluginを使用し、ケース オブジェクトに @ConversationField アノテーションを付け、action1 および action2 メソッドに @ConversationAction アノテーションを付けます。次に、struts.xml でパッケージを「struts2-conversation-default」パッケージに拡張し、インターセプター スタックに「conversation」interceptor-ref を含めます。次に、jsp で会話タグを使用します. このアプローチには定型文と構成はほとんど必要ありませんが、注釈を介してメタデータをアクションに追加し (一部の人々はそれを嫌うでしょう)、もう少し学習する必要があります。プラグインには、同じ会話の複数の同時インスタンスを許可する、メモリを節約するためのデータの自動削除などの追加機能がありますが、必要に応じて、これはやり過ぎになる可能性があります.

アプリの最適なアプローチは、要件と好みによって異なります。ActionContext.getContext().getSession();アクション クラスでは、SessionAware インターフェイスを使用してセッション オブジェクトにアクセスすることは避けてください。

于 2012-07-05T03:12:50.647 に答える
0

HTTP プロトコルはステートレスであるため、最初のリクエストで作成したオブジェクトは 2 番目のリクエストでは参照できません。

Web は HTTP プロトコルを使用して通信するため、すべての Web プログラミング (PHP、サーブレット jsp、asp など) で同じです。

あなたの問題に対する実行可能な解決策:

1.オブジェクトIDを含む非表示の入力タグを作成します。これにより、2回目のリクエスト時に、struts 2メソッドがIDを(パラメーターとして)取得し、「アクションが何らかのdbタスクを実行する」を再度実行して同じオブジェクトを再作成できます(再度作成するのは費用がかかりますが、必要に応じて異なります)

また

2 . 最初のリクエストで jsp をレンダリングする前に、オブジェクトをセッション スコープに入れることができます (この手順は、jsp スクリプトレットではなく、実際に実行することをお勧めします)。

Map session = ActionContext.getContext().getSession();
session.put("myCases","cases);

2 番目のリクエストでは、オブジェクトにアクセスできます

Map session = ActionContext.getContext().getSession();
Cases cases=(Cases)session.get("myCases");

セッションは、削除されるまで、任意のアクション/jsp でアクセスできます。

Map session = ActionContext.getContext().getSession();
session.remove("myCases");

セッションから削除された後に「myCases」にアクセスしようとすると、null が返されます。

于 2012-07-03T14:36:41.040 に答える