Servlet總結02——請求轉發

我們很多時候要對請求進行轉發,例如:

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處理了請求,甚至地址欄都沒有任何變化。

這個過程只有一次請求。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章