JSP/サーブレットアプリケーションで、処理中のページから別のページ(ファイル)へ処理を移す場合、次の2つの方法があります。
1.リダイレクト
response.sendRedirect("遷移先のページ");
2.フォワード
application.getRequestDispatcher("転送先のページ").forward(request,response);
しかし、sendRedirectメソッドによる移動は「リダイレクト」、forwardメソッドによる移動は「フォワード」と呼ばれ、内部的な挙動も性質もまったく異なるものです。ユーザーからは同じように見えますが、開発者はこれらの違いを把握しておく必要があります。
まず、リダイレクトとフォワードの挙動がどのように異なっているのかを簡単に説明しましょう。
リダイレクトの場合、クラアイアントがページXを要求すると、サーバがページYを要求する指示をクライアントに戻します。これによって“クライアントは自動的に”ページYを要求し、結果としてページYがクライアントに戻されます(ページXとページYは、必ずしも同一サーバからのレスポンスではない)。これに対しフォワードは、クライアントがページXを要求すると、“サーバ内で”ページXからYへ処理が移送され、ページYが応答として戻されます(ページXとページYは、必ず同一サーバからのレスポンス)。
以上の説明を図示すると以下のようになります。
リダイレクトは、サーバからクライアントに異なるページYにアクセスする要求を返すことでページYへの遷移を実現する。これに対し、フォワードはサーバ内でページYに処理を転送し、ページYを結果としてクライアントへ返すことでページ遷移を実現する
この結果、「リダイレクト」と「フォワード」には、以下のような違いが発生します。
- リダイレクトよりもフォワードの方がパフォーマンスが良い
リダイレクトがクライアントとサーバ間を2往復(ラウンドトリップ)する非効率な処理であるのに対して、フォワードは通常のリクエスト同様に1回のリクエスト/レスポンスで処理が完結します。これは、単純に2倍のトラフィックが発生するというだけのことではありません。リダイレクトによって発生した2回目のリクエストは、待ち行列の末尾に配置されるため、特にトラフィックの多いサーバにおいては、要求待ちによる遅延が発生する可能性があります。一方、フォワードは、1つのリクエスト処理内の連続したロジックとして処理されるため、こうした遅延の心配はありません。 - フォワードはサーバ内部の転送にのみ使用できる
遅延が起こらないからといって、ページの自動的な転移を常にフォワードで行えば良いというわけではありません。フォワードは、「サーバ内」で処理を転送するというその性質上、同一サーバ内ページ(クラス)間でしか利用することができません。外部のサーバ上のページに対して移動したいという場合には、リダイレクトを使用する必要があります。 - リクエスト情報を引き継げるのはフォワードのみ
リダイレクトでは、ページA、Bへの要求はまったく独立した「2つの」リクエストとして扱われるため、リクエストパラメータやリクエスト属性などの情報を両者で共有することはできません。しかし、フォワードでは、ページA、Bの処理は「1つの」リクエスト処理として扱われるため、リクエストパラメータやリクエスト属性はすべて引き継がれます。
以上、リクエストとフォワードとは一見似通った機能であるにもかかわらず、内部的にはまったくといっていいほど異なるものであり、プログラミングにおいてもその違いを十分に意識して使い分けられるようにしてください。
Copyright © ITmedia, Inc. All Rights Reserved.