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 を読みにいく。
[通知用URL]
Tweet
最終更新時間:2011年06月26日 14時37分14秒