請求轉發和重定向

這裏就以筆記的形式記錄,就不展開講。便於以後複習。

轉發和包含

  1. 概念
    • 請求轉發:Servlet源組件先對請求做一些預處理操作,然後把請求轉發給其他Web組件(轉發的目標組件)來完成包括生成響應結果在內的後續操作
    • 包含:Servlet源組件把其他Web組件生成的響應結果包含到自身的響應結果中
  2. 共同點
    • 源組件和目標組件處理的都是同一個客戶端請求,共享同一個ServletRequest對象和ServletResponse對象
    • 目標組件可以是ServletJSPHTML文檔
    • 都依賴於javax.servlet.RequestDispatcher接口來轉發請求。
  3. 關於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對象

      1. 調用ServletContext對象的getRequestDispatcher(String path)方法,path指定目標組件的路徑(絕對路徑,由web應用的根目錄/開頭,必須是絕對路徑,否則報錯)
      2. 調用ServletRequest對象的getRequestDispatcher(String path)方法,path指定目標組件的路徑(相對路徑,相對於當前Servlet所在的目錄,不以/開頭,但是,它還是可以接受絕對的路徑的)
    • forward()方法執行的特點:
      • 此方法先清空源組件用於存放響應數據正文的緩衝區(但不會清空HeaderStatuCode)。所以源組件生成的響應結果不會被髮送到客戶端。
      • 在調用這個方法之前,如果已經提交了源組件的響應結果,會拋出IlleageStaeexception異常。
    • include()方法執行的特點:
      • 此方法執行時,會把目標組件生成的響應結果包含到源組件響應結果中。

重定向

  1. 重定向機制運作流程
    • 用戶在瀏覽器端輸入URL,訪問特定資源
    • 服務器端返回一個302的狀態碼和一個URL的響應結果
    • 瀏覽器根據服務器端返回的URL自動重新向此URL發起請求
    • 瀏覽器端接收到響應結果
  2. HttpServletResponse接口的重定向方法
    • HttpServletResponsesendRedirect(String location)方法用於把請求重定向
    • 方法中的參數location可以以當前服務器根路徑”/”,或者以http://開頭,來重定向到本服務器的另一個Servlet或者頁面,或者Internet上任意一個有效的頁面
    • 在源組件中調用這個方法,那麼源組件生成的響應結果,除了一個狀態碼302和一個重定向的URL,不會發送其他任何響應結果給瀏覽器,但是在這個方法之後,如果還有代碼需要執行,仍然會被執行
    • 這個方法在調用時,一律自動返回狀態碼302,並且瀏覽器在收到狀態碼後,即刻自動重新請求給定的URL
    • 如果在這個方法調用前,源組件提交了響應結果,那麼拋出IllegalStateException異常
  3. 特點
    • 重定向實際上是你在訪問一個資源時,發送了兩次請求,第一次請求,沒有獲取到需要的資源,服務器只是給你一個URL,讓你重新向這個URL再次發起請求,獲取資源,不過這次請求是瀏覽器自動完成的
    • 源組件和目標組件不共享同一ServletRequestServletResponse對象(兩次請求)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章