Response.sendRedirect()

1、用sendRedirect方法實現請求重定向

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的路徑瀏覽器


2、請求重定向和請求充轉發二者的區別

一、請求轉發的運行流程

  • 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方法,在調用它們以前,都不能有內容已經被實際輸出到了客戶端。若是緩存區中已經有了一些內容,這些內容將被清除掉。

相關文章
相關標籤/搜索