我們很多時候要對請求進行轉發,例如:
1.servlet處理完相關業務後,將請求轉發到一個jsp頁面;
2.基於mvc模式,定義一個servlet充當控制器,將請求轉發個特定servlet或jsp;
在Servlet中我們可以使用javax.servlet.RequestDispatcher來處理請求轉發。
(一)RequestDispatcher
requestDispatcher對象由servlet容器創建,用於封裝一個由路徑所標識的服務器資源。
轉發的動作包括:
1) public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException;
該方法必須在響應被提交給客戶端之前調用,否則拋出IllegalStateException異常。forward進入後,原先的Servlet將終止執行。
2) public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException;
include進入被調用的對象後,執行完相關操作後仍然會繼續原先的servlet。
note:注意forward和include的區別。
(二)獲得RequestDispatcher對象。
從ServletRequest對象獲取:
public RequestDispatcher getRequestDispatcher(String path);
從ServletContext對象獲取:
public RequestDispatcher getRequestDispatcher(String path);
public RequestDispatcher getNamedDispatcher(String name);
note:servletRequest和servletContext有同樣的方法:getRequestDispatcher,那麼區別是什麼?
區別:
servletRequest的getRequestDispatcher方法,參數path可以以斜槓(/)開頭,代表當前上下文根的路徑。
如果不用斜槓開頭,則相對於當前Servlet的路徑。
servletContext的getRequestDispatcher方法,參數path必須要以斜槓(/)開頭。
(三)sendRedirect和forward的區別
sendRedirect是HttpServletResponse的方法。他的工作原理是:
關鍵點:調用sendRedirect方法,會在響應中設置locaction響應報頭,它告訴瀏覽器再訪問一次directory的新資源。
這對於用戶來說是透明的,一切都是有瀏覽器完成的。用戶只是發現地址欄發生了變化。
整個過程有兩次請求。
而forward的原理如下:
關鍵點:這個過程對於用戶而言更透明,他並不知道服務端內部是哪個servlet處理了請求,甚至地址欄都沒有任何變化。
這個過程只有一次請求。