RequestDispatcher是一個Web資源的包裝器,可以用來把當(dāng)前request傳遞到該資源,,或者把新的資源包括到當(dāng)前響應(yīng)中,。RequestDispatcher接口中定義了兩個方法:include/forward
由于<jsp:include>只能指定固定的jsp文件名,不能動態(tài)指定jsp文件名,。我們需要把<jsp:include>翻譯為Java code – RequestDispatcher.include();
用法:
<% request.getRequestDispatcher(filename).include(request, response); />
服務(wù)器端的重定向可以有兩種方式,,一是使用HttpServletResponse的sendRedirect()方法,一是使用RequestDispatcher的forward()方法.
HttpServletResponse.sendRedirect()方法將響應(yīng)定向到參數(shù)location指定的,、新的URL,。location可以是一個絕對的URL,,如response.sendRedirect("http://java.")也可以使用相對的URL,。如果location以“/”開頭,則容器認(rèn)為相對于當(dāng)前Web應(yīng)用的根,,否則,,容器將解析為相對于當(dāng)前請求的URL,。這種重定向的方法,將導(dǎo)致客戶端瀏覽器的請求URL跳轉(zhuǎn),。從瀏覽器中的地址欄中可以看到新的URL地址,,作用類似于上面設(shè)置HTTP響應(yīng)頭信息的實現(xiàn),。
RequestDispatcher.forward()方法將當(dāng)前的request和response重定向到該RequestDispacher指定的資源。這在實際項目中大量使用,,因為完成一個業(yè)務(wù)操作往往需要跨越多個步驟,,每一步驟完成相應(yīng)的處理后,轉(zhuǎn)向到下一個步驟,。比如,通常業(yè)務(wù)處理在Servlet中處理,,處理的結(jié)果轉(zhuǎn)向到一個JSP頁面進(jìn)行顯示,。這樣看起來類似于Servlet鏈的功能,但是還有一些區(qū)別,。一個RequestDispatcher對象可以把請求發(fā)送到任意一個服務(wù)器資源,,而不僅僅是另外一個Servlet。 include()方法將把Request Dispatcher資源的輸出包含到當(dāng)前輸出中,。
注意,,只有在尚未向客戶端輸出響應(yīng)時才可以調(diào)用forward()方法,,如果頁面緩存不為空,,在重定向前將自動清除緩存。否則將拋出一個IllegalStateException異常,。
RequestDispatcher接口所定義的forward()方法可以將HTTP請求轉(zhuǎn)送給其他Web資源(例如Servlet,、JSP或HTML)進(jìn)行處理,并產(chǎn)生HTTP回應(yīng),。
調(diào)用forward()方法時必須注意下列兩點(diǎn):
1. 在HTTP回應(yīng)被“確認(rèn)”(committed)以前才能調(diào)用forward()方法(這里的“確認(rèn)”是指將HTTP回應(yīng)的內(nèi)容主體送回用戶端),,否則將拋出IllegalStateException異常。
2. 調(diào)用forward()方法后,,原先存放在HttpResponse對象中的內(nèi)容將會自動被清除.
RequestDispatcher接口的include()方法與forward()方法非常類似,,惟一的不同在于:利用include()方法將HTTP請求轉(zhuǎn)送給其他Servlet后,,被調(diào)用的Servlet雖然可以處理這個HTTP請求,,但是最后的主導(dǎo)權(quán)仍然是在原來的Servlet。換言之,,被調(diào)用的Servlet如果產(chǎn)生任何HTTP回應(yīng),,將會并入原來的HttpResponse對象,。
RequestDisPatcher dispatcher=requset.getRequestDisPatcher("/uservlet2)"
這句代碼就是說將當(dāng)前servlet的數(shù)據(jù)轉(zhuǎn)發(fā)到uservlet2這個servlet里
它是服務(wù)器端轉(zhuǎn)發(fā)
一般還要把request和response傳過去
完整用法:
RequestDisPatcher dispatcher=requset.getRequestDisPatcher(""/uservlet2)";
dispatcher.forward(request, response);
還有一個response.sendRedirect("a.jsp")是不傳送數(shù)據(jù)的瀏覽器端轉(zhuǎn)發(fā)
1.RequestDispatcher.forward()
是在服務(wù)器端起作用,當(dāng)使用forward()時,Servlet engine傳遞HTTP請求從當(dāng)前的Servlet or JSP到另外一個Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此時form提交的所有信息在 b.jsp都可以獲得,參數(shù)自動傳遞.
但forward ()無法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同時forward()無法在后面帶參數(shù)傳遞,比如 servlet?name=frank,這樣不行,可以程序內(nèi)通過response.setAttribute("name",name)來傳至下一個頁面.
重定向后瀏覽器地址欄URL不變.
例:servlet文件中重定向
CODE
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
response.setContentType("text/html; charset=gb2312");
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher("/index.jsp");
rd.forward(request, response);
}
2.response.sendRedirect()
是在用戶的瀏覽器端工作,sendRedirect()可以帶參數(shù)傳遞,比如servlet?name=frank傳至下個頁面,同時它可以重定向至不同的主機(jī)上,且在瀏覽器地址欄上會出現(xiàn)重定向頁面的URL.
sendRedirect()可以重定向有frame的jsp文件.
例:servlet文件中重定向
CODE
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
response.setContentType("text/html; charset=gb2312");
response.sendRedirect("/index.jsp");
}