!!!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 ,同一サーバ内のみ
!!!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
または
<% 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
または
<% pageContext.forward("top.html"); %>
基本的にActionを指定
!Redirect
基本的にActionを指定
!!!参照
http://amsoft.minidns.net/modules/chapox/content.php?lid=52
[JspForwardRedirect1.jsp]
JspForwardRedirect1.jsp にアクセスするとサーバ内で top.html へのリクエストし、そのレスポンスを JspForwardRedirect1.jsp へのアクセス結果として返す。
そのためブラウザのURLは JspForwardRedirect1.jsp にアクセスしたままになる。
[JspForwardRedirect2.jsp]
<% response.sendRedirect("top.html"); %>
JspForwardRedirect2.jsp にアクセスするとブラウザに対して「top.html へリダイレクトしなさい」というHTTPステータスコードが返され、ブラウザが再度 top.html を読みにいく。
{{category2 プログラミング言語,Servlet & Struts}}