一、sendRedirect()
sendRedircet() 重定向。服務(wù)端收到客戶端請求后,讓客戶端到新地址去請求。
- sendRedircet() 是
HttpServletResponse接口中的方法。resp.sendRedirect("http://www.baidu.com");
- sendRedircet() 是
-
- 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" 。
- 客戶端請求的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);
- forward() 要先通過getRequestDispatcher()方法獲取RequestDispatcher類。
- 通過RequestDispatcher類調(diào)用forward()方法轉(zhuǎn)發(fā)。
- forward() 是轉(zhuǎn)發(fā)給另外一個B Servlet處理,而B Servlet處理的結(jié)果不會再經(jīng)過A處理。
- 客戶端請求的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");
- 要先通過getRequestDispatcher()方法獲取RequestDispatcher類。
- 通過RequestDispatcher類調(diào)用include()方法轉(zhuǎn)發(fā)。
- include() 是轉(zhuǎn)發(fā)給另外一個B Servlet處理,而B Servlet處理的結(jié)果會再經(jīng)過A處理。
- 客戶端請求的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é)果。 |




