Java Servlet の リダイレクトとフォワード
Java Servlet の リダイレクトとフォワード
Java Servlet のリダイレクトとフォワードを試してみたのでメモ。
環境
リダイレクトとフォワード
リダイレクトとフォワードとは、 画面から画面へ移動するための方法である。
次の画面へのリクエストを投げた時に、 Tomcatは、 フォワードまたはリダイレクトで、 リクエストを返すことができる。
リダイレクトとは
画面移動する指示を「こっそり」クライアントに出す。
URLはリダイレクト先に変更される。
リダイレクトの仕組み
画面Aのリダイレクト先が画面Bの場合:
画面Aのリクエストがあった場合、 Tomcatが画面Bへ(こっそりリダイレクト)して、 レスポンスを返す。
(昔のIEなどでは、リダイレクトがされたとき、 カチッと音が鳴っていた。)
リダイレクトはどんなときに使うか
- 例:
-
別のWebサイトを表示したいとき
-
(サーバ移転などで)同じサイトだが新しくページを表示するとき
リダイレクト先の指定方法
doGet()
やdoPost()
メソッドの response
引数の中のsendRedirect("移動先")
メソッドを使う。
response.sendRedirect("移動先");
フォワードとは
サーバが画面の作成と表示を行う。
URLは変わらない。
フォワードの仕組み
画面Aのフォワード先を画面Bへ指定している場合
画面Aをリクエストした場合、 Tomcatが次の画面を準備 して、 画面B をレスポンスする。
URLは変わらない。
フォワードはどんなときに使うか
- 例:
-
同じサイト内のページを表示するとき
-
※リダイレクトのようにほかのサイトには移動できない
-
※同じサイト内であればリダイレクトよりフォワードを使うようにする
フォワード先の指定方法
リダイレクトより少し複雑になる。
ServletContext context = request.getServletContext();
RequestDispatcher rd = context.getRequestDsipatcher("移動先");
rd.forward(request, response);
Webサイトの情報「コンテキスト」
request.getServletContext()
メソッドで、 指定された URL に対応する ServletContext オブジェクトを返す。
ServletContextには、 Servlet(Webコンテナ)の設定情報が詰まっている。
移動先を決定する「ディスパッチ」
コンテキスト内の移動先を、 「コンテキストルート」以降から指定する。
RequestDispatcher rd = context.getRequestDsipatcher("/forward.jsp");
コンテキストルートとは、 Sampleという名前のプロジェクトを作った場合、
http://localhost:8080/Sample/forward.jsp
の中の、http://localhost:8080/Sample
がコンテキストルートになる。
フォワードは、コンテキストルートからの移動先を指定する。
フォワードとリダイレクトの違い
リダイレクト | フォワード | |
---|---|---|
リクエスト/レスポンス回数 | 2 | 1 |
外部サイトへの移動 | できる | できない |
処理速度 | 遅い(と言われている) | 速い |
URL | 変わる | 変わらない |
リダイレクトのサンプル
コード
実行結果
リダイレクトするとURLが変わる。 (「http://localhost:8080/RedirectForward/redirect.jsp」へ リダイレクトされる。)
フォワードのサンプル
コード
実行結果
フォワードは、URLは変わらない。 (「forward.jsp」の内容が「http://localhost:8080/RedirectForward/ForwardSample」へ表示されている。)
まとめ
参考リンク