一、getRequestDispatcher()

getRequestDispatcher()包含两个重要方法,分别是请求转发和请求包含。一个请求跨多个Servlet时,需要使用请求转发和请求包含。

首先需要获得一个RequestDispatcher 对象:

RequestDispatcher rd = request.getRequestDispatcher(“/MyServlet”);

  • 请求转发: rd.forward( request , response );
  • 请求包含: rd.include( request , response);

需注意的是,无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response!

二、请求转发和请求包含的区别

请求转发:

由下一个Servlet完成响应体,当前Servlet可以设置响应头(留头不留体)。
举个例子,AServlet请求转发到BServlet,那么AServlet不能够使用response.getWriter() 和response.getOutputStream()向客户端输出响应体,但可以使用response.setContentType(“text/html;charset=utf-8”) 设置响应头。而在BServlet中可以输出响应体。

请求包含:

由两个Servlet共同完成响应体(留头又留体)。同样用上面的例子,AServlet请求包含到BServlet,那么AServlet既可以设置响应头,也可以完成响应体。
下图是请求转发的流程,最后返给客户端的response只是BServlet的,而AServlet的响应不会在客户端显示出来。
image.png
下图是请求包含流程,因为BServelt的响应返回给AServlet时携带了responseB,所以AServlet的响应中包含了BServlet的响应,最后返给客户端的响应是两者之和。
image.png
三、request域
request是Java四大域对象之一,正是它提供了请求转发和请求包含的功能。一个请求会创建一个request对象,若在一个请求中跨越了多个Servlet,那么这些Servlet可以使用request来共享数据。同一个请求范围内使用request.setAttribute()和request.getAttribute()来传值!前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值。

四、请求转发和重定向的区别
请求转发和重定向的区别也是非常重要的知识点!!!

  1. 请求转发是一个请求一次响应,而重定向是两次请求两次响应。
  2. 请求转发地址不变化,而重定向会显示后一个请求的地址。这是因为请求转发是服务器的行为,是由容器控制的转向,整个过程处于同一个请求中,因此客户端浏览器不会显示转向后的地址;但重定向是客户端的行为,重新发送了请求,整个过程不在同一个请求中,因此客户端浏览器会显示跳转后的地址。
  3. 请求转发只能转发到本项目其它Servlet,而重定向不只能重定向到本项目的其它Servlet,还能定向到其它项目。
  4. 请求转发是服务端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,既包含项目名。

请求转发
image.png
重定向
image.png