WEB元件之間有三種跳轉方式:請求轉發;URL重定向;請求包含。
請求轉發
從Servlet1,請求轉發到Servlet2。Servlet1完成一部分的功能,再跳轉到Sservlet2,繼續完成剩餘的功能。
request.getRequestDispatcher(String path).forward(request,response)
;
特點:
- 瀏覽器位址列不會發生改變。
- 請求轉發只傳送一個請求。
- 轉發前和轉發後共享請求中的資料。
- 最終相應給瀏覽器的由轉發後來決定。
- 請求轉發不能跨域訪問,只能跳轉到當前應用中的資源。
- 請求轉發可以訪問WEB-INF目錄中的資源。
URL重定向
response.sendRedirect(String url);
特點:
- 瀏覽器地址會發生改變。
- URL重定向是兩次不同的請求。
- 因為URL重定向是兩次獨立的請求,所以不能共享請求中的資料。
- 最終相應給瀏覽器的由定後來決定。
- URL重定向能跨域訪問,可以訪問其他應用中的資源。
- URL重定向不能訪問WEB-INF目錄中的資源。
請求包含
在一個頁面中可以包含其他頁面的內容。在Servlet中沒有意義,但是在JSP中有意義。
request.getRequestDispatcher(String path).inclode(request,response);
選擇方式:如果需要共享請求的資料,使用請求轉發;如果需要訪問WEB-INF中的資源使用請求轉發;如果需要跨域訪問,避免表單的重複提交使用URL重定向。
示例:
請求轉發是服務端行為:使用者傳送一個HTTP請求>>>伺服器接收到請求>>>呼叫內部方法在作用域(專案)中完成請求處理和轉發>>>將資源相應給客戶端。伺服器轉發的地址只能是域(專案)中的路徑,不能跳轉到其他域(專案)的路徑上,轉發後的URL位址列不變,只能通過瀏覽器開發者模式檢視到對應請求轉發的地址,客戶端只請求了一次服務端。
**重定向是客戶端行為:**使用者傳送一個HTTP請求>>>伺服器接收到傳送302狀態碼相應和重定向的地址>>>客戶端接受到狀態碼和定向的URL地址>>>客戶端重新傳送新的HTTP請求(請求的路徑是服務端相應給客戶端的URL路徑)>>>服務端接收到客戶端再次請求的資料並相應給客戶端資料。所以瀏覽器的URL位址列是會變化,而且在兩次請求中不能共享資料。
301,302都是HTTP狀態的編碼,都代表著URL發生了變化。301表示永久性跳轉,302表示暫時性跳轉。如果不是暫時性轉移推薦使用301永久性跳轉,301永久性跳轉對搜尋引擎優化更好。