sendRedirect方法用於生成302響應碼和Location響應頭,從而通知客戶端去從新訪問Location響應頭中指定的URL。html
RedirectServlet.javajava
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RedirectServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); // 一、寫入到輸出緩衝區中的內容尚未被真正傳送到客戶端,sendRedirect方法就能夠被正確執行 // 而且將輸出緩衝區中原來或調用方法後寫入的內容都清空,因此下面兩條打印語句都不會顯示 out.println("before sendRedirect"); response.sendRedirect(request.getContextPath() + "/test.html"); // 與上面語句效果同樣 //response.sendRedirect("../test.html"); // 相對URL以「/」開頭,則相對於Tomcat的虛擬根目錄,而不是相對於當前Web應用程序的根目錄(虛擬目錄) // 訪問報404,URL是localhost:8888/test.html //response.sendRedirect("/test.html"); out.println("after sendRedirect"); } }
在瀏覽器輸入http://localhost:8888/testSendRedirect/servlet/RedirectServlet地址,頁面顯示爲:web
注意,此時的URL是test.hmtl自己的路徑,而不是RedirectServlet的路徑瀏覽器
Web瀏覽器——————發出HTTP請求(到)——————Web容器;緩存
Web瀏覽器 Web容器————首次訪問,容器建立目標servlet————servlet(servlet1)服務器
web容器建立請求對象和響應對象ide
web容器調用servlet1的service方法並將請求對象和響應對象傳遞給該方法spa
servlet1對象的service方法從請求對象中讀取請求信息,這時也能夠在響應對象中寫入部分響應頭和響應體數據code
service方法向web容器發出forward命令表示要跳轉到servlet2,web容器清空當前所寫入的響應體內容,並調整請求頭中的信息htm
web容器根據forward命令調用servlet2對象,若是初次訪問則加載建立servlet2對象
web容器調用servlet2的service方法,並將請求對象和響應對象傳遞給該方法。注意,這裏傳遞的仍是調用servlet1時所建立的request和response對象
servlet2對象的service方法從請求對象中讀取請求信息,並向響應對象中寫入響應頭和響應體信息
servlet2的service方法執行完畢後返回
servlet1的service方法繼續執行調用forward方法的語句後面的代碼,執行完畢後返回
web容器從響應對象中讀取響應信息
web容器將響應信息發送給瀏覽器處理和顯示,一次請求響應過程徹底結束,request和response變成垃圾,等待垃圾回收器回收
Web瀏覽器——————發出HTTP請求(到)——————Web容器;
Web瀏覽器 Web容器————首次訪問,容器建立目標servlet————servlet(servlet1)
web容器建立請求對象和響應對象
web容器調用servlet1的service方法並將請求對象和響應對象傳遞給該方法
servlet1對象的service方法從請求對象中讀取請求信息,並將包含重定向的響應頭信息寫入到響應對象中。
service方法執行完畢後返回
web容器從響應對象中讀取響應信息
web容器把包含重定向的響應信息發送給瀏覽器。一次請求響應過程徹底結束,request和response變成垃圾,等待垃圾回收器將其完全從內存中清除。
web瀏覽器根據上次返回的重定向URL發出新的HTTP請求,這個請求甚至能夠指向另一個站點,web瀏覽器又開始一次全新的請求響應過程。
若是請求資源爲servlet並首次訪問,web容器則加載和建立該servlet對象。
web容器建立請求對象和響應對象
web容器調用servlet2的service方法並將請求對象和響應對象傳遞給該方法
servlet2對象的service方法從請求對象中讀取請求信息,並向響應消息對象中寫入響應頭和響應體消息
service方法執行完畢後返回
web容器從響應對象中讀取響應信息
web容器將響應信息發送給瀏覽器處理和顯示,新的請求響應過程徹底結束,request和response變成垃圾,等待垃圾回收器回收
forward方法只能將請求轉發給同一個web應用中的組件;而sendRedirect方法不只能夠重定向到當前應用程序中的其餘資源,還能夠是同一個站點上的其餘資源,甚至是使用絕對URL重定向到其餘站點的資源。若是傳遞給sendRedirect方法的相對URL以「/」開頭,它是相對於整個web站點的根目錄(若是不指定則是以當前頁面爲相對路徑);建立RequestDispatcher對象時指定的相對UR必須以「/」開頭(不這樣則報錯),它是相對於當前web應用程序的根目錄。
調用sendRedirect方法重定向的訪問過程結束後,瀏覽器由初始的URL變爲重定向目標的URL;而調用forward方法的請求轉發過程結束後,瀏覽器地址欄保持初始的URL。
sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去從新發出對另一個URL的訪問請求。forward方法在服務器端內部將請求轉發給另一個資源,瀏覽器只知道發出了請求並獲得了響應結果,並不知道在服務器程序內部發生了轉發行爲。
forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬於同一個訪問請求和響應過程;而sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬於兩個獨立的訪問請求和響應過程。
不管forward方法仍是sendRedirect方法,在調用它們以前,都不能有內容已經被實際輸出到了客戶端。若是緩存區中已經有了一些內容,這些內容將被清除掉。