请求转发、重定向、包含的区别

概述

Servlet的service()方法是由Servlet容器来调用的,用户不能在一个Servlet对象中直接调用另一个Servlet对象的servie()方法,因为一个Servlet对象无法得到另一个Servlet对象的引用。为了能够得到另一个servlet的逻辑于是有转发和包含。

请求转发和包含地址栏的内容都不会变化,而请求重定向地址栏会发生变化,而根据request和response生命周期知道,请求转发和包含不会创建新的request和respose只是共享数据而已,而请求重定向则会创建一个新的request和response对象,不能共享数据。

详细概述

请求转发

Servlet(源组件)先对客户请求做一些预处理操作(一般是对响应头进行处理),然后把请求转发给其他Servlet(目标组件)来完成包括生成响应结果在内的后续操作。
  实现方法:request.getRequestDispatcher(“接收请求的Servlet 路径”). forward(request,response)
  getRequestDispatcher(String path):该方法的返回值类型是RequestDispatcher,请求发送器,该方法的参数是指明要接收请求的Servlet 的路径;
  forward(ServletRequest req,ServletResponse res):该方法是RequestDispatcher 接口的方法,将请求从一个 servlet 转发到服务器上的另一个资源(servlet、JSP 文件或 HTML 文件)。此方法允许一个 servlet 对请求进行初步处理,并使另一个资源生成响应。需要传递两个参数,这两个参数是当前Servlet 的request 对象和 response 对象传递过去的。
  forward() 方法的处理流程:
  ● 清空用于存放响应正文(响应体)数据的缓冲区。
  ● 如果目标组件为Servlet 或JSP,就调用它们的service() 方法,把该方法产生的响应结果发送到客户端,如果目标组件为文件系统中的静态 html 文档,就读去文档中的数据并把它发送到客户端。
  ● 由于 forward() 方法先清空用于存放响应正文数据的缓冲区,因此servlet源组件生成的响应结果不会被发送到客户端,只有目标组件生成的结果才会被发送到客户端,所以对源组件叫“留头不留体”,目标组件为“留体不留头”,就是说共享request和response但是源目标的输出结果被清空,转发目的地址的输出才是有效输出。
  ● 如果源组件在进行请求转发之前,已经提交了响应结果(例如调用了flush 或close() 方法),那么forward() 方法会抛出IllegalStateException。为了避免该异常,不应该在源组件中提交响应结果,所以叫留体抛异常。

请求包含

请求包含定义:
  Servlet(源组件)把其他Servlet(目标组件)生成的响应结果包含到自身的响应结果中。
  
  实现方式:
request.getRequestDispatcher(“接收请求的Servlet 路径”). include(request,response)

  include(ServletRequest request,ServletResponse response):该方法是RequestDispatcher 接口的方法,表示包含。它的参数同forward() 方法的参数一样都是由当前Servlet传递过去的。
  包含与转发相比,源组件与被包含的目标组件的输出数据都会被添加到响应结果中,在目标组件中对响应状态代码或者响应头所做的修改都会被忽略,所以对源组件来说是“留头又留体”,对目标组件为“留体不留头”。

参考1
参考2

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值