トップ 差分 一覧 ソース 置換 検索 ヘルプ PDF RSS ログイン

forward と redirect

redirect と forward の違い

redirect forward
ソース response.sendRedirect([ページ2]); request.getRequestDispatcher([ページ2]).forward(request, response);
処理の流れ クライアント [ページ1] を要求

サーバ [ページ2] に redirect 命令を返却

クライアント [ページ2] を要求

サーバ [ページ2] を返却
クライアント [ページ1] を要求

サーバ [ページ2] を返却
パフォーマンス 悪い (リクエストを 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 を読みにいく。

[カテゴリ: プログラミング言語 > Servlet & Struts]



  • Hatenaブックマークに追加
  • livedoorクリップに追加
  • del.icio.usに追加
  • FC2ブックマークに追加

最終更新時間:2011年06月26日 14時37分14秒