很多时候一个请求会需要多个Servlet协作才能完成,这时候就需要从一个Servlet中跳转到另个一Servlet中处理了。
一、格式
首先调用request的getRequestDispatcher(“参数”)方法,获取到一个RequestDispatcher对象:
ResquestDispatcher rd=request.getRequestDispatcher("/MyServlet");
参数为被包含或被转发的目标Servlet路径。
如果是请求转发,接下来输入:
rd.forward(request,response);
如果是请求包含,接下来输入:
rd.include(request,response);
就可完成我们的请求转发和请求包含。二者的区别为:
- 请求转发:由当前Servlet设置响应头(不能设置响应体),下一个Servlet既可设置响应头也可设置响应体。
- 请求包含:当前Servlet和下一个Servlet共同完成相应头和响应体。
需要注意的是无论是请求转发还是请求包含,都在一个请求范围内,所以多个Servlet中使用的是同一个request和response。
二、请求转发
FirstServlet代码如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
response.getWriter().print("This is the FirstServlet");
RequestDispatcher rd=request.getRequestDispatcher("/SecondServlet");
rd.forward(request, response);
}
SecondServlet代码如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
response.getWriter().print("This is the SecondServlet");
}
显示结果:
网页响应的结果我们可以看出FirstServlet中设置的响应体并没有在网页中显示出来,只有SecondServlet中设置的响应体被显示出来了。
三、请求包含
请求包含和请求转发中代码相比,只是在OneServlet中将forward()方法改为include()方法而已。
FirstServlet代码如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
response.getWriter().println("This is the FirstServlet");
RequestDispatcher rd=request.getRequestDispatcher("/SecondServlet");
rd.include(request, response);
}
SecondServlet代码如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
response.getWriter().print("This is the SecondServlet");
}
显示结果:
网页响应可看出 FirstServlet和SecondServlet中设置的响应体都显示出来了。
四、请求转发和重定向的区别
- 请求转发是一个请求一次响应,而重定向是两次请求两次响应。
- 请求转发地址栏不变化,而重定向会显示后一个请求的地址。
- 请求转发只能转发到本项目其他Servlet,而重定向不只能重定向到本项目的其它Servlet,还能定向到其它项目。
- 请求转发是服务器端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,即包含项目名。
- 请求转发和重定向二者效率前者高,因为前者只发出一个请求。
需要在下一个Servlet中获取到request域中的数据,必须用请求转发