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

以前好像曾經整理過,但忘了放在哪裏了,好像壓根就沒整理過😂,博客裏也沒有,故今天從新整理一下。java

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

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

雖然兩者均可以實現獲取相應的url資源,但首先要注意的是,重定向由sendRedirect來實現,請求轉發由forward來實現。tomcat

在跳轉範圍上forward方法只能重定向到同一個web應用程序中的一個資源,僅僅侷限在同一個服務器內;而sendRedirect方法不只能夠在位於同一主機上的不一樣web應用程序之間進行重定向,並且能夠將客戶端重定向到其它服務器上的web應用程序資源。服務器

先給出sendRedirect方法的工做原理圖:app

描述一下上圖的過程:瀏覽器先向servlet1發送一次request請求,servlet1讓servlet2爲客戶端服務,servlet1調用sendRedirect方法,將客戶端的request請求重定向到servlet2(告訴瀏覽器servlet2的位置,讓瀏覽器從新訪問servlet2,這樣就會發現地址欄會發生相應變化,這也是和forward的一個重要區別)。最後servlet2對請求作出響應。上圖中產生了兩次請求。webapp

下面再給出forward方法的工做原理圖:jsp

描述一下上圖的過程:瀏覽器先向servlet1發送請求,servlet1讓servlet2爲客戶端服務,servlet1調用forward方法,將客戶端的請求轉發給servlet2處理(這裏瀏覽器地址欄是不會變化的,由於沒告訴瀏覽器),servlet2對請求作出響應。網站

對重定向和請求轉發的使用分別舉個實例,以下:url

//重定向到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,防止表單重複提交
相關文章
相關標籤/搜索