!!!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}}