這裏就以筆記的形式記錄,就不展開講。便於以後複習。
轉發和包含
- 概念
- 請求轉發:
Servlet
源組件先對請求做一些預處理操作,然後把請求轉發給其他Web
組件(轉發的目標組件)來完成包括生成響應結果在內的後續操作 - 包含:
Servlet
源組件把其他Web組件生成的響應結果包含到自身的響應結果中
- 請求轉發:
- 共同點
- 源組件和目標組件處理的都是同一個客戶端請求,共享同一個
ServletRequest
對象和ServletResponse
對象 - 目標組件可以是
Servlet
、JSP
、HTML
文檔 - 都依賴於
javax.servlet.RequestDispatcher
接口來轉發請求。
- 源組件和目標組件處理的都是同一個客戶端請求,共享同一個
關於
javax.servletrequestDispatcher
接口javax.servlet.RequestDispatcher
是一個請求分發器。它有兩個方法,通過這兩個方法來進行請求的轉發和包含
forward() : 把請求轉發給目標組件
方法聲明:
public void forward(ServletRequest request, ServletResponse response) throws ServletException, java.IO.IOException
include() : 包含目標組件的相應結果
方法聲明:
public void include(ServletRequest request, ServletResponse response) throws ServletException, java.IO.IOException
如何獲取
RequestDispatcher
對象- 調用
ServletContext
對象的getRequestDispatcher(String path)
方法,path
指定目標組件的路徑(絕對路徑,由web
應用的根目錄/
開頭,必須是絕對路徑,否則報錯) - 調用
ServletRequest
對象的getRequestDispatcher(String path)
方法,path
指定目標組件的路徑(相對路徑,相對於當前Servlet
所在的目錄,不以/
開頭,但是,它還是可以接受絕對的路徑的)
- 調用
forward()
方法執行的特點:
- 此方法先清空源組件用於存放響應數據正文的緩衝區(但不會清空
Header
和StatuCode
)。所以源組件生成的響應結果不會被髮送到客戶端。 - 在調用這個方法之前,如果已經提交了源組件的響應結果,會拋出
IlleageStaeexception
異常。
- 此方法先清空源組件用於存放響應數據正文的緩衝區(但不會清空
include()
方法執行的特點:
- 此方法執行時,會把目標組件生成的響應結果包含到源組件響應結果中。
重定向
- 重定向機制運作流程
- 用戶在瀏覽器端輸入
URL
,訪問特定資源 - 服務器端返回一個
302
的狀態碼和一個URL
的響應結果 - 瀏覽器根據服務器端返回的
URL
自動重新向此URL
發起請求 - 瀏覽器端接收到響應結果
- 用戶在瀏覽器端輸入
HttpServletResponse
接口的重定向方法
HttpServletResponse
的sendRedirect(String location)
方法用於把請求重定向- 方法中的參數
location
可以以當前服務器根路徑”/”,或者以http://
開頭,來重定向到本服務器的另一個Servlet
或者頁面,或者Internet
上任意一個有效的頁面 - 在源組件中調用這個方法,那麼源組件生成的響應結果,除了一個狀態碼
302
和一個重定向的URL
,不會發送其他任何響應結果給瀏覽器,但是在這個方法之後,如果還有代碼需要執行,仍然會被執行 - 這個方法在調用時,一律自動返回狀態碼
302
,並且瀏覽器在收到狀態碼後,即刻自動重新請求給定的URL
- 如果在這個方法調用前,源組件提交了響應結果,那麼拋出
IllegalStateException
異常
- 特點
- 重定向實際上是你在訪問一個資源時,發送了兩次請求,第一次請求,沒有獲取到需要的資源,服務器只是給你一個
URL
,讓你重新向這個URL
再次發起請求,獲取資源,不過這次請求是瀏覽器自動完成的 - 源組件和目標組件不共享同一
ServletRequest
和ServletResponse
對象(兩次請求)。
- 重定向實際上是你在訪問一個資源時,發送了兩次請求,第一次請求,沒有獲取到需要的資源,服務器只是給你一個