2

サーブレットがデータベースから取得したレコードからJSPのフォームにデータを渡す必要があるシナリオがいくつかあります。現在、この情報をリクエストに保存しており、RequestDispatcherを使用してページに転送していますが、すべて問題ありません。

ただし、これはPRGパターン(AFAIK)に適合していません。もちろん、結果のJSPを更新すると、サーブレットが再実行されることを意味します。これは望ましくありません。

もちろん、これらの値をセッションに保存することもできますが、それは後でそれらをクリアすることを意味し、セッションを使用することでさえ、データベースからのレコードを表示するためのちょっとしたハックのように見えます。

この状況でのベストプラクティスは何でしょうか。リクエストを引き続き使用するか、セッションを使用するか、またはその他の手法を使用する必要がありますか?

前もって感謝します。

編集: いくつかの記事とスタックオーバーフローの回答を読んだ後、サーブレットからJSPにデータを渡すときにリクエストとディスパッチャーを使用する以外のオプションを提示する場所は見つかりません。それは私には正しくないようですが、セッションもそうではありません。誰かがこれに光を当てることができますか?

4

1 に答える 1

4

問題を完全に理解しているかどうかはわかりませんが、2つのパターンがベストプラクティスです。

  1. モデルを埋め、リクエストに保存し、モデル内のデータを表示するビューにディスパッチするコントローラーを常に通過します。それがMVCパターンです
  2. 非べき等要求が成功した後は常にリダイレクトします(つまり、HTTPプロトコルを尊重する場合はPOST)。これがリダイレクト後の取得パターンです。

つまり、次のようにする必要があります。

  • リクエスト1はサーブレットに送信されます。
  • サーブレットは、フォームに表示されるデータを取得してリクエストに保存し、JSPに転送します
  • JSPはフォームを表示します
  • フォームがサーブレットに送信されます(リクエスト2)
  • サーブレットはデータをデータベースに格納し、データベースは作成されたデータのIDを生成します
  • /product?id=<generatedId>サーブレットは、またはのようなURLにリダイレクトします/product/<generatedId>
  • ブラウザはこのURLにリクエストを送信します(リクエスト3)。このリクエストはサーブレットに送信されます
  • サーブレットは、データベースからIDで識別されるデータを取得します。データをリクエストに保存し、JSPに転送します
  • JSPはデータを表示します。

もちろん、たとえば製品のリストなど、他のページにリダイレクトすることもできます。

サーブレットからJSPに転送するときにリクエストを使用してデータを保存するのが面倒な場合は、気にしないでください。これが唯一のクリーンな方法です。データはリクエストのみにスコープされ、リクエストが処理されたときにガベージコレクションされます。

于 2013-02-04T16:51:41.323 に答える