Servlet规范系列 之 RequestDispatcher源码分析

欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

  RequestDispatcher称作请求分派器,包括foward和include两种分派方式,RequestDispatcher使得服务内两个Servlet间通信成为可能,下面让我们来详细介绍下RequestDispatcher的功能。

  RequestDispatcher获取

  可以通过ServletRequest.getRequestDispatcher(path)或HttpServletRequest.getRequestDispatcher(path)获取RequestDispatcher对象,其中path可以传递绝对路径或相对于服务根的相对路径,然后可以调用RequestDispatcher的include或者forward方法。

RequestDispatcher dispatcher = servletRequest.getRequestDispatcher("/xxx");
dispatcher.forward(request, response);
dispatcher.include(request, response);

  forward和include区别

  · forward:forward的实质是当前资源将请求和响应的处理权转交给当前服务的另一个新资源,由新的资源来完成请求的处理以及响应的生成。

   forward使用过程中需要注意的是:

    当前资源调用forward转发前, 保证响应没有提交、缓冲区数据没有被刷新提交。新资源会清空响应缓冲区,如果在响应过程中遇到响应被提交、缓冲区被刷新提交的情况,会抛出IllegalStateException异常。

    当前资源与新资源中获取HttpServletRequest实例,两者不是同一实例,但除URL不同外,其余内容均是相同的。

  · include:include的实质当前资源和一个新的资源协同完成请求和响应的处理。当前资源将请求转发到另一个新资源,新的资源处理请求并产生响应。当前资源将新资源的响应作为整体响应的一部分发送给客户端。

    新资源不能设置响应状态和响应头信息,即使设置也不会生效。这些工作由当前资源进行。

    当前资源与新资源中获取HttpServletRequest实例,两者为同一实例,内容均相同。

  forward和sendRedirect区别

  讲到forward,肯定要讲到sendRedirect,两者一直是放在一起讨论的。

  调用

// forward:
servletRequest.getRequestDispatcher("/xxx").forward(request, response)
// sendRedirect:
response.sendRedirect("xxxxx")

  流程

   forward:

     客户端发送请求到服务器,服务器A资源接收请求。

​     A资源利用forward将请求转发给站内新资源B。

     B资源处理请求、构造响应,发送给客户端。

​     客户端接收服务器响应。

   sendRedirect:

     客户端发送请求到服务器,服务器A资源接收请求。

     A资源利用sendRedirect将请求重定向到新资源B,B资源可以是站内或站外资源。同时返回Http 302状态码,并携带Location响应头,指明重定向地址为B资源。

     客户端解析服务器端响应,若发现Http响应码为302,则取响应头Location,并重新发起请求到B资源。

     服务器B资源接收请求、处理请求、构造响应,发送给客户端。

     客户端接收服务器响应。

  请求

  通过“流程”的分析,对于请求的区别:

    forward转发时,会产生两个Request对象,但两个Request对象除URL不同之外,其他内容均相同。

    sendRedirect重定向时,也会产生两个Request对象,两个Request对象是完全不同的对象。

  速度

​  通过“流程”的分析,在同等业务复杂度的情况下,forward仅在服务器内部跳转,相对更节省时间。sendRedirect会在客户端和服务器之间往复两次,相对要消耗更多的时间。

  传参

  通过“请求”的分析,forward时,可以直接通过Request对象进行参数传递,但sendRedirect由于两次是完全不同的Request对象,所以不能通过Request传参,但是可以通过URL参数的方式传参。

  地址栏

  通过“流程”的分析,对于地址栏的区别:

    forward转发时,属于服务器内部跳转,地址栏信息不会发生变化,因为仅在站内资源跳转。整个过程中,客户端与服务器只会发生一次交互。

    sendRedirect重定向时,地址栏信息会改变,可以跳转到任意网页。在整个过程中,客户端与服务器(可能两次不是一个服务器)会发生两次交互。

  若文中存在错误和不足,欢迎指正!

本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/securitit/article/details/108089132
今日推荐