sendRedirect()和forward()方法的區別
- 2020 年 7 月 3 日
- 筆記
- ++JavaWeb++
之前好像曾經整理過,但忘了放在哪裡了,好像壓根就沒整理過😂,博客里也沒有,故今天重新整理一下。
我們知道頁面之間的跳轉有兩種方式:重定向與轉發。
跳轉:顧名思義,就是頁面跳轉。
雖然二者都可以實現獲取相應的url資源,但首先要注意的是,重定向由sendRedirect來實現,請求轉發由forward來實現。
在跳轉範圍上forward方法只能重定向到同一個web應用程序中的一個資源,僅僅局限在同一個服務器內;而sendRedirect方法不僅可以在位於同一主機上的不同web應用程序之間進行重定向,而且可以將客戶端重定向到其它服務器上的web應用程序資源。
先給出sendRedirect方法的工作原理圖:
描述一下上圖的過程:瀏覽器先向servlet1發送一次request請求,servlet1讓servlet2為客戶端服務,servlet1調用sendRedirect方法,將客戶端的request請求重定向到servlet2(告訴瀏覽器servlet2的位置,讓瀏覽器重新訪問servlet2,這樣就會發現地址欄會發生相應變化,這也是和forward的一個重要區別)。最後servlet2對請求做出響應。上圖中產生了兩次請求。
下面再給出forward方法的工作原理圖:
描述一下上圖的過程:瀏覽器先向servlet1發送請求,servlet1讓servlet2為客戶端服務,servlet1調用forward方法,將客戶端的請求轉發給servlet2處理(這裡瀏覽器地址欄是不會變化的,因為沒告訴瀏覽器),servlet2對請求做出響應。
對重定向和請求轉發的使用分別舉個實例,如下:
//重定向到index.jsp頁面
response.sendRedirect("/ServletStudy/index.jsp");
//如果你不想寫前面的項目名,可以寫成下面這樣
response.sendRedirect(request.getContextPath() + "/index.jsp");
//獲取到requestDispatcher對象,跳轉到index.jsp
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/index.jsp");
//調用requestDispatcher對象的forward實現轉發,傳入request和response方法
requestDispatcher.forward(request,response);
把上面這些話用一個表格表示,如下:
區別 | forward | sendRedirect |
---|---|---|
是否可轉向本web應用之外的頁面或網站 | 否 | 是 |
實際發生位置 | 服務端 | 客戶端 |
用法 | request.getRequestDispatcher("/資源名").forward(request,response) (注意:轉發時”/”代表的是本應用程序的根目錄,比如”/web應用名”) |
response.sendRedirect("/web應用/資源名") (重定向時”/”代表的是webapps目錄,這個目錄在tomcat那個目錄下) |
傳送數據的類型 | 轉發的request對象可以傳遞各種類型的數據,包括對象 | 重定向只能傳遞字符串,就是在路徑後面加 |
跳轉時間 | 轉發時:執行到跳轉語句後就會立即跳轉 | 重定向:整個頁面執行完成後才執行跳轉,也就是說其後的代碼有執行機會 |
在跳轉前request對象setAttribute();的值是否會丟失 | 不會 | 會 |
轉向速度 | 快 | 慢 |
地址欄 | 不變 | 變 |
應用場景 | 訪問Servlet處理業務邏輯,然後forward到jsp顯示處理結果 | 提交表單,處理成功後redirect到另一個jsp,防止表單重複提交 |