Javaのフォワードとリダイレクトの違いとは?画面遷移とデータの受け渡しを理解する|確認問題の回答例

Javaのフォワードとリダイレクトの違いとは?画面遷移とデータの受け渡しを理解するの確認問題の回答例です。比較コードと、DB登録後の構成例を区別して確認してください。

問題1:フォワードで表示する

確認するもの回答
割引額500円
ブラウザのURL/lesson05/discount-navigation
リクエスト数1回。フォームからのPOSTに対して結果のHTMLが返る。画像やCSSの取得は除く。

Modelが返した500をrequestへ保存し、そのままJSPへforwardするため、JSPはdiscount属性を取得できます。JSPの実行はサーバー内で行われ、JSPのURLへブラウザがアクセスし直すわけではありません。

問題2:リダイレクトで表示する

「割引額がありません。」と表示され、URLは /lesson05/navigation-result.jsp になります。Modelによる計算と元のrequestへの保存は成功していますが、JSPはブラウザから届いた新しいGETで動きます。

新しいrequestにはdiscount属性がないため、getAttributeはnullを返し、JSPのelseに進みます。今回の通常のブラウザ操作では、POSTとリダイレクト後のGETで2回のリクエストになります。

問題3:入力エラーを表示する

sendRedirectだけに変えると、元のrequestに保存したerrorは入力JSPへ引き継がれず、メッセージを表示できません。本文のように、同じリクエストで入力画面へforwardします。

request.setAttribute("error",
        "購入金額は0〜2147483647の整数で入力してください。");
request.getRequestDispatcher("/navigation-form.jsp")
        .forward(request, response);
return;

returnは、このあと結果画面への処理を続けないために必要です。移動先URLを直すだけでは、リクエストが新しくなる問題は解決しません。

問題4:登録後はリダイレクト、その表示からJSPへフォワード

  1. 登録Servletから表示Servletへは、リダイレクトする。登録POSTを終え、表示用GETへ進む。
  2. 表示Servletから詳細JSPへは、フォワードする。そのGETのrequestに表示用データを保存し、JSPへ引き継ぐ。
  3. 表示Servletでは、URLなどから受け取った商品IDを検証し、閲覧権限も確認して、DBから商品を取得し直す。

商品データはDBへ保存済みなので、新しいリクエストになっても取得できます。前のrequestの属性を引き継いでいるわけではありません。表示側GETでは登録を繰り返さず、取得と表示を担当します。

この構成は結果画面の再読み込みによるPOST再送信を避けますが、連打など別経路の重複登録まで防げるわけではありません。必要に応じてサーバー側の重複対策も行います。

元の記事に戻る

Javaのフォワードとリダイレクトの違いとは?画面遷移とデータの受け渡しを理解する