以前好像曾經整理過,但忘了放在哪裏了,好像壓根就沒整理過😂,博客裏也沒有,故今天從新整理一下。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,防止表單重複提交 |