サーブレットジャンプ方式sendReDirect()とforward()


Webアプリケーションサービスでは、異なるSERVLET間のジャンプに直面することがよくあります.現在、以下の2つの方法で実現できます.
1.RequestDispatcher.forward()
2.ServletResponse.sendReDirect()
 
両者の違い:
1.redirect方式はアプリケーション間でアクセスでき、forwardは同じアプリケーションでのみジャンプできます.
2.forwardクライアントはサーバにアクセスし、サーバはジャンプする適切なURLを見つけ、クライアントに戻ることを実行します.クライアントのアドレスバーには元のURLが表示されます.
redirectクライアントはサーバにアクセスし、サーバはジャンプするURLを見つけてクライアントにURLを送り、クライアントから新しいURLに対して要求を再送信します.客
ユーザー側のアドレスバーには2回目のリクエストのURLが表示されます.
3.データの転送:requestのデータ、forwardはアクセスできます.redirectはもう新しいリクエストなので、redirectはできません.
 
forwardジャンプの理解:
1.ジャンプ取得
getRequestDispatcherメソッドは、StringパラメータでサーブレットContextの役割ドメインのパスを記述します.このパスは、サーブレットContextのルートに対して「/」で始まる必要があります.この方法では、パス(path)を使用してservletを検索し、RequestDispatcherオブジェクトでパッケージし、結果オブジェクトを返します.指定したパスに基づくservletがない場合は、RequestDispatcherがパス値を返します.
 
getNamedDispatcherメソッドは、サーブレットContextで既知のservlet名をStringパラメータで表します.servletが見つかった場合は、RequestDispatcherオブジェクトでパッケージして返します.指定した名前に関連付けられたservletがない場合はnullを返す必要があります.
 
現在要求されている相対パス(サーブレットContextルートの相対パスではない)を使用してRequestDispatcherオブジェクトを取得するには、サーブレットRequestインタフェースは次の方法を提供します.
getRequestDispatcher
このメソッドの動作は、サーブレットContextと同じ名前のメソッドと似ています.servletコンテナはrequestオブジェクトの情報を使用して、指定した相対パスを完全パスに変換します.例えば、"/"をルートとするコンテキストは、/garden/toolsを要求する.html、ServeretRequest.getRequestDispatcher(「header.html」)が取得したrequestDispatcherは、実際にはサーブレットContextを呼び出すのと同じである.getRequestDispatcher("/garden/header.html").
 
request.getRequestDispatcher("/uu").forward(request,response)

this.getServletContext().getRequestDispatcher("/uu").forward(request,response)

this.getServletContext().getNamedDispatche("ServletName").forward(request, response)

 
1.1 RequestDispatcherパスのquery文字列
サーブレットContextおよびサーブレットRequestは、pathパラメータを使用してRequestDispatcherオブジェクトを作成する方法で、pathの後にquery文字列を追加できます.たとえば、開発者は次のコードでRequestDispatcherを入手できます.
String path = “/raisons.jsp?orderno=5”;
RequestDispatcher rd = context.getRequestDispatcher(path);
rd.include(request, response);
query文字列で指定したパラメータは、servletを含む同名の他のパラメータに渡すよりも優先してRequestDispatcherを作成するために使用されます.このパラメータはRequestDispatcherに関連付けられており、includeまたはforward呼び出しでのみ有効です.
 
2 RequestDispatcherの使用
requestDispatcherを使用するには、servletはRequestDispatcherインタフェースのincludeメソッドまたはforwardメソッドを呼び出すことができます.これらのメソッドのパラメータは、サーブレットインタフェースのサービスメソッドを介して伝達されるrequestおよびresponseパラメータであってもよいし、仕様2.3に導入されるrequestおよびresponseパッケージクラスのサブクラスの例であってもよい.後者では、パッケージインスタンスは、コンテナをサービスメソッドのrequestおよびresponseオブジェクトに渡す必要があります.
 
コンテナベンダーは、ターゲットservletへの転送要求と元の要求が同じVM、同じスレッドにあることを確認する必要があります.
 
3 includeメソッド
RequestDispatcherインタフェースのincludeはいつでも呼び出すことができます.includeメソッドのターゲットservletはrequestオブジェクトに完全にアクセスできますが、responseオブジェクトを使用するにはいくつかの制限があります.
 
responseオブジェクトのサーブレットOutputStreamまたはWriterにのみ情報を書き込み、レスポンス(レスポンスバッファの末尾にコンテンツを出力)、またはサーブレットResponseインタフェースのflushBufferメソッドを明示的に呼び出すことができます.ヘッダを設定したり、応答ヘッダに影響を与えるメソッドを呼び出したりすることはできません.どんな試みも無視されなければならない.
 
3.1含まれる要求パラメータ
getNamedDispatcherメソッドを使用して取得したservletに加えて、includeのservletは呼び出しパスにアクセスできます.次の要求プロパティを設定します.
 
javax.servlet.include.request_uri
javax.servlet.include.context_path
javax.servlet.include.servlet_path
javax.servlet.include.path_info
javax.servlet.include.query_string
 
includeのservletのこれらの属性はrequestオブジェクトのgetAttributeメソッドによってアクセスされます.
 
includeのservletがgetNamedDispatcherメソッドで取得された場合、これらのプロパティは設定されません.
 
4 forwardメソッド
RequestDispatcherインタフェースのforwardメソッドは、出力がクライアントにコミットされていない場合にのみ、呼び出しservletによって呼び出されます.出力データがまだコミットされていない応答バッファに存在する場合、コンテンツはターゲットservletのserviceメソッド呼び出しの前に空にする必要があります(そうでなければout.println()出力はすべてキャッシュにあり、無効です).応答がコミットされている場合は、IllegalStateException例外を放出する必要があります.ターゲットservletのrequestオブジェクトに露出するpath要素は、RequestDispatcherを取得するためのパスをマッピングする必要があります.
唯一の例外は、RequestDispatcherがgetNamedDispatcherメソッドによって取得された場合、requestオブジェクトのpath要素は最初のリクエストをマッピングする必要があります.
 
RequestDispatcherインタフェースのforwardメソッドが戻る前に、servletコンテナが送信し、応答内容をコミットして閉じる必要があります.
 
public void doPost(HttpServletRequest request,HttpServletResponse response ) throws IOException,ServletException{
String page =  request.getParameter("page");// forward  URL  page=1   
		response.setCharacterEncoding("UTF-8");
		//clear cache.
		response.setHeader("Pragma","No-cache");          
		response.setHeader("Cache-Control","no-cache");   
		response.setHeader("Cache-Control", "no-store");   
		response.setDateHeader("Expires",0);
		
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><title>china</title></hea>");
		out.println("<body>");
		out.print("==");
		out.println("<br/>");//jsp    
		out.println("</body>");
		out.println("</html>");
		
		//  out.flush  out.close().        ,    IllegalStateException  。requestDispather.forward():    .
		//out.flush();
		//out.close();		
		//    3 .
	//	request.getRequestDispatcher("/productInfo.do?page=1").forward(request,response);
}

 
4.1 query文字列
リクエスト転送メカニズムは、転送(forward)またはincludeを含むリクエスト時にquery文字列を渡す役割を果たす.
 
5エラー処理
requesDispatcherのターゲットのservletがサーブレットExceptionまたはIOExceptionタイプのランタイム異常またはchecked異常を投げ出した場合は、呼び出しservletに渡す必要があります.その他のすべての例外は、サーブレットException例外としてパッケージされ、例外のルートは転送前に元の例外に設定されます.
 
 
相対パスの理解:
forwardの"/"はwebアプリケーションに対して.http://localhost:8080/Test/gw/page.jspから転送JSPページが解析するpageContextに変換される.forward("OtherPage.jsp");「/otherPage.jsp」はhttp://localhost:8080/Test/OtherPage.jsp「OtherPage.jsp」にhttp://localhost:8080/Test/gw/OtherPage.jsp
およびresponseにコミット.sendRedirect("/ddd"); サーバルートパスに対して.転送コードが登録されたservlet-urlに含まれると仮定すると/ggg/ttである.jspは/ggg/ttである.jsp:絶対パス:response.sendRedirect(「http://www.brainysoftware.com」)は、http://www.brainysoftware.com本のパス:responseを送信する.sendRedirect("/ooo")は、http://localhost:8080/ooo相対パス:responseに送信.sendRedirect(「ooo」)はhttp://localhost:8080/Test/ggg/oooに送信され、
 
 
参考文献:http://blog.csdn.net/wocongdongfanglai/archive/2007/02/05/1502615.aspx