はしくれエンジニアもどきのメモ

情報系技術・哲学・デザインなどの勉強メモ・備忘録です。

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 がコンテキストルートになる。

リダイレクトは絶対パス相対パスどちらでもok。

フォワードは、コンテキストルートからの移動先を指定する。

フォワードとリダイレクトの違い

 リダイレクトフォワード
リクエスト/レスポンス回数 2 1
外部サイトへの移動 できる できない
処理速度 遅い(と言われている) 速い
URL 変わる 変わらない

リダイレクトのサンプル

コード

Redirectするサンプル

実行結果

「http://localhost:8080/RedirectForward/RedirectSample」にアクセス

リダイレクト前

リダイレクトするとURLが変わる。 (「http://localhost:8080/RedirectForward/redirect.jsp」へ リダイレクトされる。)

「http://localhost:8080/RedirectForward/RedirectSample」にアクセスすると「http://localhost:8080/RedirectForward/redirect.jsp」へリダイレクトされる

リダイレクト後

フォワードのサンプル

コード

Forwardするサンプル

実行結果

「http://localhost:8080/RedirectForward/ForwardSample」へアクセスすると

フォワード前

フォワードは、URLは変わらない。 (「forward.jsp」の内容が「http://localhost:8080/RedirectForward/ForwardSample」へ表示されている。)

「http://localhost:8080/RedirectForward/ForwardSample」へアクセスすると「forward.jsp」の内容がフォワードされる。

フォワード後

まとめ

  • Servletからの画面移動の方法は、 「フォワード」と「リダイレクト」の2パターンある。

  • 「リダイレクト」は、 画面を移動させるための処理

  • フォワード」は、 画面を表示させるための処理