sendRedirect()和forward()方法的區別

Z發表於2020-07-03

之前好像曾經整理過,但忘了放在哪裡了,好像壓根就沒整理過?,部落格裡也沒有,故今天重新整理一下。

我們知道頁面之間的跳轉有兩種方式:重定向與轉發

跳轉:顧名思義,就是頁面跳轉。

雖然二者都可以實現獲取相應的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,防止表單重複提交

相關文章