请求包含(Include)和请求转发(Forward)
定義
請求包含是指將另一個Servlet的請求處理流程包含進來。
請求轉(zhuǎn)發(fā)是指將請求轉(zhuǎn)發(fā)給別的Servlet處理。
實現(xiàn)
實現(xiàn)請求包含和請求轉(zhuǎn)發(fā),可以使用HttpServletRequest的getRequestDispatcher()方法取得RequestDispatcher接口的實現(xiàn)對象實例,調(diào)用時傳入請求、響應(yīng)對象即可。
取得RequestDispatcher還有兩個方式,通過ServletContext的getRequestDispatcher()或getNamedDispatcher()。
demo
package com.test;import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter;@WebServlet({"/some.controller", "/world"}) public class Some extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {PrintWriter out = response.getWriter();out.println("Some do one...");RequestDispatcher dispatcher = request.getRequestDispatcher("other.view");// 請求包含 dispatcher.include(request, response);// 請求轉(zhuǎn)發(fā)// dispatcher.forward(request, response);out.println("Some do two...");} } Some.java package com.test;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Arrays;@WebServlet({"/other.view", "/view"}) public class Other extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.getWriter().println("Other do one...");} } Other.java請求轉(zhuǎn)發(fā) forward 的響應(yīng)結(jié)果是:
Other do one...
請求包含 include 的響應(yīng)結(jié)果是:
Some do one...
Other do one...
Some do two...
區(qū)別
forward:目前的Servlet不能有任何響應(yīng)確認,如果在目前的Servlet中通過響應(yīng)對象設(shè)置了一些響應(yīng)但未確認(響應(yīng)緩沖區(qū)未滿或未調(diào)用任何清除方法),則所有響應(yīng)設(shè)置會被忽略,如果已經(jīng)有響應(yīng)確認且調(diào)用了forward()方法,則會拋出IllegalStateException。
include:被包含的Servlet中任何對請求標頭的設(shè)置都會被忽略。但被包含的Servlet中可以使用getSession()方法取得HttpSession對象。
相同點
1、在取得RequestDispatcher時,也可以包括查詢字符串。
例如:req.getRequestDispatcher("other.view?data=123456").include(req, resp);
這樣在被包含或轉(zhuǎn)發(fā)的Servlet中就可以使用getParameter("data")取得請求參數(shù)值。
2.查詢字符串的方式,僅適用于傳遞字符串值給另一個Servlet;如果有必須共享的“對象”,可以設(shè)置給請求對象成為屬性。
HttpServletRequest上與請求范圍屬性有關(guān)的幾個方法如下。
setAttribute():指定名稱與對象設(shè)置屬性。
getAttribute():指定名稱取得屬性。
getAttributeNames():取得所有屬性名稱。
removeAttribute():指定名稱移除屬性。
example:
package com.test;import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter;@WebServlet({"/some.controller", "/world"}) public class Some extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setAttribute("setAttr", new int[]{1, 2, 3});PrintWriter out = response.getWriter();out.println("Some do one...");RequestDispatcher dispatcher = request.getRequestDispatcher("other.view?data=123456");// 請求包含// dispatcher.include(request, response);// 請求轉(zhuǎn)發(fā) dispatcher.forward(request, response);out.println("Some do two...");} } Some.java package com.test;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Arrays;@WebServlet({"/other.view", "/view"}) public class Other extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String data = request.getParameter("data");int[] getAttr = (int[])request.getAttribute("setAttr");response.getWriter().println("Other do one..." + " | "+ "include or forward parameter: " + data + " | " // 請求或轉(zhuǎn)發(fā)時攜帶的查詢參數(shù)+ "setAttrbute object: " + Arrays.toString(getAttr)); // 共享對象 } } Other.java請求轉(zhuǎn)發(fā)?forward?的響應(yīng)結(jié)果是:
Other do one... | include or forward parameter: 123456 | setAttrbute object: [1, 2, 3]
請求包含?include?的響應(yīng)結(jié)果是:
Some do one...
Other do one... | include or forward parameter: 123456 | setAttrbute object: [1, 2, 3]
Some do two...
相似點
| 請 求 包 含 | javax.servlet. include.request_uri | javax.servlet. include.context_path | javax.servlet. include.servlet_path | javax.servlet. include.path_info | javax.servlet. include.query_string |
| 請 求 轉(zhuǎn) 發(fā) | javax.servlet. forward.request_uri | javax.servlet. forward.context_path | javax.servlet. forward.servlet_path | javax.servlet. forward.path_info | javax.servlet. forward.query_string |
| 表 示 上 一 個 Servlet 的 | Request URI | Context path | Servlet path | Path info | 取得RequestDispatcher時 給定的查詢參數(shù) |
?
?如果被包含或轉(zhuǎn)發(fā)的Servlet還包含或轉(zhuǎn)發(fā)其他的Servlet,則這些屬性名稱的對應(yīng)值也會被代換。
example:
請求轉(zhuǎn)發(fā)?forward?的響應(yīng)結(jié)果是:
Other do one... | request_uri: /hello/some.controller | context_path: /hello | servlet_path: /some.controller | path_info: null | query_string: null
請求包含?include?的響應(yīng)結(jié)果是:
Some do one...
Other do one... | request_uri: /hello/other.view | context_path: /hello | servlet_path: /other.view | path_info: null | query_string: data=123456
Some do two...
轉(zhuǎn)載于:https://www.cnblogs.com/Mike_Chang/p/10033063.html
總結(jié)
以上是生活随笔為你收集整理的请求包含(Include)和请求转发(Forward)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MySQL】玩转定时器
- 下一篇: 15合并两个排序的链表