JavaWeb: sendRedirect()、forward()、include() 區(qū)別

一、sendRedirect()

sendRedircet() 重定向。服務(wù)端收到客戶端請求后,讓客戶端到新地址去請求。

    1. sendRedircet() 是HttpServletResponse接口中的方法。 resp.sendRedirect("http://www.baidu.com");
    1. sendRedircet() 請求轉(zhuǎn)發(fā),客戶端會發(fā)兩次請求. Response類sendRedirect()方法的關(guān)鍵兩個步驟。
    setStatus(status);
    setHeader("Location", locationUri);
    
    • a. 設(shè)置響應(yīng)的狀態(tài)碼為302.
      public static final int SC_FOUND = 302; setStatus(status);
    • b. 設(shè)置響應(yīng)頭上設(shè)置key ="Location" , value = "locationUri" 。
    1. 客戶端請求的URL地址會變?yōu)橹囟ㄏ虻牡刂贰?/li>
  • 圖解


    sendRedircet

二、forward() 與 include()

(一)forward()

forward() 轉(zhuǎn)發(fā)。服務(wù)端A Servlet收到客戶端請求后,將這個請求轉(zhuǎn)給B Servlet處理。
先看看如何使用:

RequestDispatcher dispatcher = req.getRequestDispatcher("myhttp2");
dispatcher.forward(req,resp);
    1. forward() 要先通過getRequestDispatcher()方法獲取RequestDispatcher類。
    1. 通過RequestDispatcher類調(diào)用forward()方法轉(zhuǎn)發(fā)。
    1. forward() 是轉(zhuǎn)發(fā)給另外一個B Servlet處理,而B Servlet處理的結(jié)果不會再經(jīng)過A處理。
    1. 客戶端請求的URL地址不會變化,還是原先請求的地址。
  • 圖解


    forward()

    運行結(jié)果如下:


    forward()

    結(jié)果里包含B Servet的輸出== myhttp2,不會包含A Servlet的輸出== myhttp1

(二)include()

include() 轉(zhuǎn)發(fā)。服務(wù)端A Servlet收到客戶端請求后,將這個請求轉(zhuǎn)給B Servlet處理,B Servlet處理后 A Servlet會繼續(xù)處理。
先看看如何使用:

RequestDispatcher dispatcher = req.getRequestDispatcher("myhttp2");
dispatcher.forward(req,resp);
resp.getWriter().write("a1");
    1. 要先通過getRequestDispatcher()方法獲取RequestDispatcher類。
    1. 通過RequestDispatcher類調(diào)用include()方法轉(zhuǎn)發(fā)。
    1. include() 是轉(zhuǎn)發(fā)給另外一個B Servlet處理,而B Servlet處理的結(jié)果會再經(jīng)過A處理。
    1. 客戶端請求的URL地址不會變化,還是原先請求的地址。
  • 圖解


    include()

    運行結(jié)果如下:


    include()

    結(jié)果里包含B Servet的輸出== myhttp2,同時也包含A Servlet的輸出== myhttp1

三、小結(jié)比較

比較項目 sendRedirect forward include
使用 resp.sendRedirect("http://www.baidu.com"); RequestDispatcher dispatcher = req.getRequestDispatcher("myhttp2"); dispatcher.forward(req,resp); RequestDispatcher dispatcher = req.getRequestDispatcher("myhttp2"); dispatcher.include(req,resp);
歸屬類 HttpServletResponse RequestDispatcher RequestDispatcher
范圍 可以在本web工程,也可以在外部項目絕對URL地址 只能將請求轉(zhuǎn)發(fā)到同一個web應(yīng)用中 只能將請求轉(zhuǎn)發(fā)到同一個web應(yīng)用中
地址變化 變成重定向的地址 地址不變 地址不變
客戶端請求次數(shù) 兩次 一次 一次
Request對象&Response對象 Request對象&Response對象 各自獨立 Request對象&Response對象共享 Request對象&Response對象共享
線程情況 獨立線程,獨立請求與獨立響應(yīng) 同一個線程 同一個線程
forward與include - 輸出結(jié)果只會是forward的servlet處理的最后結(jié)果 輸出結(jié)果會是include包含的servlet + 本身 處理的結(jié)果。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容