トップ 一覧 置換 検索 ヘルプ RSS ログイン

forward と redirectの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!redirect と forward の違い
,,redirect  ,forward
,ソース ,response.sendRedirect([ページ2]); ,"request.getRequestDispatcher([ページ2]).forward(request, response);"
,処理の流れ ,"クライアント [ページ1] を要求{{br}}     ↓{{br}}サーバ  [ページ2] に redirect 命令を返却{{br}}     ↓{{br}}クライアント [ページ2] を要求{{br}}     ↓{{br}}サーバ  [ページ2] を返却","クライアント [ページ1] を要求{{br}}     ↓{{br}}サーバ  [ページ2] を返却"

パフォーマンス ,悪い (リクエストを 2 回送信する必要がある) ,良い (通常通り 1 回のリクエストで良い)
リクエスト情報 ,引き継がない (全く別の 2 つのリクエストの為) ,引き継ぐ (同一の 1 つのリクエストの為)
転送可能範囲 ,外部サーバも OK ,同一サーバ内のみ
,パフォーマンス ,悪い (リクエストを 2 回送信する必要がある) ,良い (通常通り 1 回のリクエストで良い)
,リクエスト情報 ,引き継がない (全く別の 2 つのリクエストの為) ,引き継ぐ (同一の 1 つのリクエストの為)
,転送可能範囲 ,外部サーバも OK ,同一サーバ内のみ

!!!Servlet
!!Servlet
!Forward
 RequestDispatcher rDispatcher =    
     request.getRequestDispatcher("/result.jsp");
    rDispatcher.forward(request, response);
・Pathが「/」で始まる場合
 コンテキストルートに対する相対パス
・Pathが「/」以外で始まる場合
 現在のリクエストURIからの相対表記であると解釈

※APIドキュメントより
指定するのは相対的なパス名ですが、この Servlet が属しているコンテキスト外部のリソースは指定できません。 パス名が "/" で始まっている場合はこのコンテキストルートに対する相対パスであると解釈されます。

!Redirect
 response.sendRedirect("top.html");
・Pathが「/」で始まる場合
 Servletコンテナのルートからの相対表記であると解釈
・Pathが「/」以外で始まる場合
 現在のリクエストURIからの相対表記であると解釈

※APIドキュメントより
指定されたリダイレクト先のURLを用いて、 クライアントに一時的なリダイレクトレスポンスを送信します。 URLとしては相対URLを指定することができます。 従って、Servletコンテナは相対URLを絶対URLに変換しなくてはいけません。 指定された場所が '/' から始まらない相対表記である場合、 コンテナは現在のリクエストURIからの相対表記であると解釈します。 指定された場所が '/' から始まる相対表記である場合、  コンテナはServletコンテナのルートからの相対表記であると解釈します。

!!Jsp
!Forward
 <jsp:forward page="top.html" />
または
 <% pageContext.forward("top.html"); %>

・Pathが「/」で始まる場合
 コンテキストルートに対する相対パス
・Pathが「/」以外で始まる場合
 現在のリクエストURIからの相対表記であると解釈
!Redirect
 <% response.sendRedirect("top.html"); %>
・Pathが「/」で始まる場合
 Servletコンテナのルートからの相対表記であると解釈
・Pathが「/」以外で始まる場合
 現在のリクエストURIからの相対表記であると解釈
!!!Struts
!!Servlet
!Forword
 actionクラス内で
 return (mapping.findForward("SUCCESS"));
または
 return new ActionForward("/xxx.do?param=" + param);
・Pathが「/」で始まる場合
 コンテキストルートに対する相対パス
・Pathが「/」以外で始まる場合
 現在のリクエストURIからの相対表記であると解釈
!Redirect
 actionクラス内で
 return new RedirectingActionForward("/xxx.do?param=" + param);

・Pathが「/」で始まる場合
 コンテキストルートに対する相対パス
・Pathが「/」以外で始まる場合
 現在のリクエストURIからの相対表記であると解釈

※注意※
HttpServletResponse.sendRedirect()が内部的に呼ばれるのでPathが「/」で始まる場合は、Servletコンテナルートからの相対表記になりそうだが、内部(RequestProcessor#processForwardConfigあたり)でsendRedirectする前にServletコンテナルートからコンテキストルートの相対表記に変換している。

※APIドキュメントより
ActionForwardはActionクラスの処理の結果、 コントローラServlet(ActionServlet)によって実行される、 RequestDispatcher.forward()またはHttpServletResponse.sendRedirect()の遷移先を表わします。

!!Jsp
!Forword
 <logic:foward name="start" />
または
 <% pageContext.forward("top.html"); %>
基本的にActionを指定
!Redirect
 <logic:redirect action="/next" />
基本的にActionを指定

!!!参照
http://amsoft.minidns.net/modules/chapox/content.php?lid=52

[JspForwardRedirect1.jsp]
 <HTML>
 <BODY>
 <jsp:forward page="top.html" />
 </BODY>
 </HTML>

JspForwardRedirect1.jsp にアクセスするとサーバ内で top.html へのリクエストし、そのレスポンスを JspForwardRedirect1.jsp へのアクセス結果として返す。
そのためブラウザのURLは JspForwardRedirect1.jsp にアクセスしたままになる。


[JspForwardRedirect2.jsp]
 <HTML>
 <BODY>
 <% response.sendRedirect("top.html"); %>
 </BODY>
 </HTML>
JspForwardRedirect2.jsp にアクセスするとブラウザに対して「top.html へリダイレクトしなさい」というHTTPステータスコードが返され、ブラウザが再度 top.html を読みにいく。

{{category2 プログラミング言語,Servlet & Struts}}