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へフォワード
- 登録Servletから表示Servletへは、リダイレクトする。登録POSTを終え、表示用GETへ進む。
- 表示Servletから詳細JSPへは、フォワードする。そのGETのrequestに表示用データを保存し、JSPへ引き継ぐ。
- 表示Servletでは、URLなどから受け取った商品IDを検証し、閲覧権限も確認して、DBから商品を取得し直す。
商品データはDBへ保存済みなので、新しいリクエストになっても取得できます。前のrequestの属性を引き継いでいるわけではありません。表示側GETでは登録を繰り返さず、取得と表示を担当します。
この構成は結果画面の再読み込みによるPOST再送信を避けますが、連打など別経路の重複登録まで防げるわけではありません。必要に応じてサーバー側の重複対策も行います。