1

私は自家製の MVC 実装を持っています。次のようなControllerServlet:

/controller?cmd=EditUser&userid=55

この URL から、コントローラーはインスタンスを作成し、表示する結果ページ (例: ) を返すメソッドをEditUserCommand.class呼び出します。execute()user.jsp

次に、コントローラ サーブレットは次のことを行います。

getRequestDispatcher(resultPage).forward(request, response);

...結果のページが表示されます。

コントローラーが行うことの 1 つは、メッセージ (エラー、情報など) を要求属性として設定することです。例えば:

request.setAttribute("infoMessage", "User was edited successfully.");

そして、そのメッセージはページのリクエストから引き出されてuser.jsp表示されます。

正常に動作します。

ここに私の問題があります。

時々、私のコマンドはページを返さず、結果のuser.jspように URL を返します。cmd=ShowUser&userid=55これは、ユーザーの閲覧権限など、最終ページを表示する前に確認したいことがあるためです。

これを行うと、リクエストに配置した「infoMessage」は表示されません。これは、結果が新しいリクエストであるサーブレットへの新しい呼び出しを行う URL であるためです。新しいリクエストは、最初のリクエストからのリクエスト属性を維持しません。これは理にかなっていますが、私はこれが起こるとは予想していませんでした。

元のリクエストの結果の最終ページに実際に表示されるまで、リクエスト変数を「存続」させるにはどうすればよいですか?

提案やアドバイスをいただければ幸いです。参考までに、アプリ全体を書き直して、JSF の Struts、Spring MVC などに移行することはできません。それはオプションではありません。

ありがとう!

ロブ

4

3 に答える 3

4

redirect通常、ブラウザからの新しいリクエストにより、リクエスト データが失われます。考えられるアプローチの 1 つは、メッセージを URL 文字列に属性として追加し、必要なときに読み取ることです。

あなたの編集に基づいて:あなたの編集後も、私の答えは理にかなっています。ただし、1 つだけ訂正があります。転送はサーバー側で行われるため、真新しいリクエストではありません。

于 2012-07-06T18:58:46.847 に答える
2

Redirect の代わりに RequestDispatcher を使用してみましたか?

RequestDispatcher dispatcher = request.getRequestDispatcher("/myNextPage.jsp");
dispatcher.forward(request, response);
于 2012-07-06T18:57:45.340 に答える
0

簡単な例を挙げているかもしれませんが、制御フローが「再送信」エラーを引き起こしているのではないでしょうか? 基本的に、データに変更を加えた後、コントローラーはリダイレクトを介してすぐに「Get」を実行する必要があり、画面は完全にステートレスに表示されます。

ご覧ください: http://en.wikipedia.org/wiki/Post/Redirect/Get

そのため、属性はあまり役に立ちません。考慮すべきことは、すべてのログイン ユーザーの Bean/Object を維持し、このオブジェクトを LRU キャッシュ (JCache または MemcacheD) に永続化し、アプリケーションへのエントリごとに取得することです。それができたら、そのオブジェクトの以前の結果などの疑似状態を維持できます。

いずれにせよ、属性を使用して状態を保持すると、オプションが大幅に制限されます。より一般的な柔軟なルーティングに依存しないメカニズムが必要です。

于 2012-07-06T19:02:43.663 に答える