request
實現請求轉發:
servlet api
提供了 一個 RequestDispatcher
接口,俗稱 請求分派器。
它定義瞭如下兩個 請求轉發 方法:
public void forward(ServletRequest request, ServletResponse response)
public void include(ServletRequest request,ServletResponse response)
獲取
RequestDispatcher
實例的方式主要有兩種:
調用
ServletContext
接口提供的getRequestDispatcher(String url)
方法。
調用ServletRequest
接口提供的getRequestDispatcher(String url)
方法。
url
爲要轉發 過去 的 本應用內url
RequestDispatcher
:
例:
// 返回指定 屬性的 值 作爲對象,如果沒有給定名稱的屬性,則返回null
if(request.getAttribute("lol")!=null) {
System.out.println("該請求中無此參數");
// 添加 一個 請求 參數
request.setAttribute("lol", "haha");
}
else if (request.getAttribute("lol").toString()=="haha") {
System.out.println("我會重置此參數的值");
// 重置 該請求參數
request.setAttribute("lol", "wawa");
}
else {
System.out.println("其他情況我會刪除 該參數");
// 刪除 該參數
request.removeAttribute("lol");
}
// 獲取全部屬性
Enumeration<String> enumeration = request.getAttributeNames();
//將 該請求 實現轉發
request.getRequestDispatcher("./Demon").forward(request, response);
request
對象提供了一個getRequestDispatcher
方法,該方法返回一個RequestDispatcher
對象,調用這個對象的forward
方法可以實現請求轉發。
request
對象同時也是一個域對象,開發人員通過request
對象在實現轉發時,把轉發前 修改後的 數據 可以 通過request
對象 帶給其它web資源
處理。
對request
中 的數據對象進行操作:
setAttribute() //若無此屬性 在此請求中存儲 ,若有 屬性在請求之間重置。
getAttribute() // 獲取該屬性 的值 ,並作爲 對象(object) 處理
removeAttribute() // 移出該屬性
getAttributeNames() // 獲取全部屬性 的名稱 作爲 枚舉類型 使用
注意
forward
方法用於將請求轉發到RequestDispatcher
對象封裝的資源。- 如果在調用
forward
方法之前,在Servlet
程序中寫入的部分內容已經被傳送到了客戶端
forward
方法拋出IllegalStateException
異常。 - 如果在調用
forward
方法之前向Servlet
引擎的緩衝區response
中寫入了內容
只要寫入到緩衝區中的內容還沒有被真正輸出到客戶端,forward
方法就可以被正常執行
除已寫入到HttpServletResponse response
對象中的響應頭字段信息
保持有效 外 , 轉發前 其它寫入到輸出緩衝區中的 內容將被清空,
請求重定向(402)和請求轉發的區別
- 請求轉發:
- 一個
web
資源收到客戶端請求後,通知服務器去調用
另外一個web
資源進行處理 - 請求重定向
- 一個
web
資源收到客戶端請求後,通知瀏覽器去訪問
另外一個web
資源
通過HttpServletResponse.sendRedirect()
方法 實現
可重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL
重定向到其他站點的資源。
但不進行處理
路徑區別
HttpServletResponse.sendRedirect
方法的相對URL以/
開頭,它是相對於整個WEB站點的根目錄;
創建RequestDispatcher
對象時指定的相對URL以/
開頭,它是相對於當前WEB應用程序的根目錄
如同
www.pan.baidu.com
和www.pan.baidu.com/disk/
的區別
調用HttpServletResponse.sendRedirect
方法重定向的訪問過程結束後,瀏覽器地址欄中顯示的URL會發生改變,由 初始的URL 地址變成重定向的 目標URL;
調用RequestDispatcher.forward
方法的請求轉發過程結束後,瀏覽器地址欄保持初始的URL地址不變。
HttpServletResponse.sendRedirect
方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的訪問請求;
RequestDispatcher.forward
方法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在服務器程序內部發生了轉發行爲。
RequestDispatcher.forward
方法的調用者與 被調用者之間共享相同的request
對象和response
對象,它們屬於同一個訪問請求和響應過程;
而HttpServletResponse.sendRedirect
方法調用者與被調用者使用各自的request
對象和response
對象,它們屬於 兩個獨立的訪問請求和響應過程。