之前好像曾經整理過,但忘了放在哪裡了,好像壓根就沒整理過?,部落格裡也沒有,故今天重新整理一下。
我們知道頁面之間的跳轉有兩種方式:重定向與轉發。
跳轉:顧名思義,就是頁面跳轉。
雖然二者都可以實現獲取相應的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,防止表單重複提交 |