1. 程式人生 > >servlet和JSP中轉發和重定向知識複習

servlet和JSP中轉發和重定向知識複習

1:servlet中轉發 、包含、和重定向

請求轉發:(源元件留頭不留體,目標元件留體不留頭)

Servlet(源元件)先對客戶請求做一些預處理操作(一般是對響應頭進行處理),然後把請求轉發給其他Servlet(目標元件)來完成包括生成響應結果在內的後續操作。 
  實現方法:request.getRequestDispatcher(“轉發的路徑”). forward(request,response) 

     “/“ ” 開頭是絕對路徑,不是以“/”開頭是相對路徑。

  getRequestDispatcher(String path):該方法的返回值型別是RequestDispatcher,請求傳送器,該方法的引數是指明要接收請求的Servlet 的路徑; 
  forward(ServletRequest req,ServletResponse res):該方法是RequestDispatcher 介面的方法,將請求從一個 servlet 轉發到伺服器上的另一個資源(servlet、JSP 檔案或 HTML 檔案)。此方法允許一個 servlet 對請求進行初步處理,並使另一個資源生成響應。需要傳遞兩個引數,這兩個引數是當前Servlet 的request 物件和 response 物件傳遞過去的。 
  forward() 方法的處理流程: 
  ● 清空用於存放響應正文(響應體)資料的緩衝區。 
  ● 如果目標元件為Servlet 或JSP,就呼叫它們的service() 方法,把該方法產生的響應結果傳送到客戶端,如果目標元件為檔案系統中的靜態 html 文件,就讀去文件中的資料並把它傳送到客戶端。 
  ● 由於 forward() 方法先清空用於存放響應正文資料的緩衝區,因此servlet源元件生成的響應結果不會被髮送到客戶端,只有目標元件生成的結果才會被髮送到客戶端,所以對源元件叫“留頭不留體”,目標元件為“留體不留頭”,就是說共享request和response但是源目標的輸出結果被清空,轉發目的地址的輸出才是有效輸出。 
  ● 如果源元件在進行請求轉發之前,已經提交了響應結果(例如呼叫了flush 或close() 方法),那麼forward() 方法會丟擲IllegalStateException。為了避免該異常,不應該在源元件中提交響應結果,所以叫留體拋異常。

請求包含:(源元件留頭又留體,目標元件留體不留頭)

請求包含定義: 
  Servlet(源元件)把其他Servlet(目標元件)生成的響應結果包含到自身的響應結果中。 
   
  實現方式: 
request.getRequestDispatcher(“接收請求的Servlet 路徑”). include(request,response)

  include(ServletRequest request,ServletResponse response):該方法是RequestDispatcher 介面的方法,表示包含。它的引數同forward() 方法的引數一樣都是由當前Servlet傳遞過去的。 
  包含與轉發相比,源元件與被包含的目標元件的輸出資料都會被新增到響應結果中,在目標元件中對響應狀態程式碼或者響應頭所做的修改都會被忽略,所以對源元件來說是“留頭又留體”,對目標元件為“留體不留頭”。

重定向:

response.sendRedirect(String location);

1:JSP中轉發 、包含

包含:

靜態包含

include指令的語法為:<%@ include file="URL" %>,其中file是指要包含的頁面。

靜態包含包含在解析階段

動態包含

include動作的語法為:<jsp:include page="URL" flush="false|true"/>,其中page為要包含的頁面,flush指被包含的頁面是否從緩衝區讀取,預設為false

動態包含發生在執行class檔案階段,動態加入。

轉發:<jsp:forward page="url"/>做為伺服器端跳轉,跳轉後位址列地址是當前地址,而不是目的頁面。

執行時,立即跳轉,後面語句不執行。這和servlet中的轉發不同,servlet中轉發之後的程式碼也會執行。