Filter中 dispatcher标签的解析 REQUEST INCLUDE FORWARD ERROR

一、forward和include

RequestDispatcher提供两个方法forward和include进行资源跳转。 
不同的是,如果使用forward跳转则其后面的response输出则不会执行,而用include来跳转,则include的servlet执行完后,再返回到原来的servlet执行response的输出(如果有)。 
实例: 
servlet A

RequestDispatcher disp = request.getRequestDispatcher("B");
disp.forward(request, response);
System.out.println("servlet A completed");
PrintWriter pw = response.getWriter();
pw.println("servlet A");
  • 1
  • 2
  • 3
  • 4
  • 5

servlet B

PrintWriter pw = response.getWriter();
pw.println("servlet B");
  • 1
  • 2

输出结果: 
控制台:servlet A completed 
页面:servlet B 
这表示在forward方法后的pw.println("servlet A")并未执行

如果将forward换成include的话,则结果为: 
控制台:servlet A completed 
页面:servlet B servlet A 
这表示include的servlet执行完后,再返回到原来的servlet执行response的输出。 
注意:如果在servlet B里吧pw给close掉了的话,那servlet A 这里就无法输出了,则结果就和第一个一样。

二、dispatcher元素

2.4版本的servlet规范在部属描述符中新增加了一个<dispatcher>元素,这个元素有四个可能的值:即REQUEST,FORWARD,INCLUDE和ERROR,可以在一个<filter-mapping>元素中加入任意数目的<dispatcher>,使得filter将会作用于直接从客户端过来的request(REQUEST),通过forward过来的request(FORWARD),通过include过来的request(INCLUDE)和通过<error-page>过来的request(ERROR)。如果没有指定任何< dispatcher >元素,默认值是REQUEST。 
注意:<dispatcher></dispatcher>必须写在filter-mapping的最后。dispatcher的前提条件当然是要先满足url-pattern,然后dispatcher有四种可能的属性: 
1、REQUEST 
只要发起的操作是一次HTTP请求,比如请求某个URL、发起了一个GET请求、表单提交方式为POST的POST请求、表单提交方式为GET的GET请求。一次重定向则前后相当于发起了两次请求,这些情况下有几次请求就会走几次指定过滤器。 
2、FOWARD 
只有当当前页面是通过请求转发转发过来的情形时,才会走指定的过滤器 
3、INCLUDE 
只要是通过<jsp:include page="xxx.jsp" />,嵌入进来的页面,每嵌入的一个页面,都会走一次指定的过滤器。 
4、ERROR 
假如web.xml里面配置了<error-page></error-page>

<error-page>
    <error-code>400</error-code>
    <location>/filter/error.jsp</location>
</error-page>

<error-page>
    <error-code>404</error-code>
    <location>/filter/error.jsp</location>
</error-page>

<error-page>
    <error-code>500</error-code>
    <location>/filter/error.jsp</location>
</error-page>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

意思是HTTP请求响应的状态码只要是400、404、500三种状态码之一,容器就会将请求转发到error.jsp下,这就触发了一次error,走进了配置的DispatchFilter。需要注意的是注意一点的是,虽然把请求转发到error.jsp是一次forward的过程,但是配置成<dispatcher>FORWARD</dispatcher>并不会走DispatchFilter这个过滤器。 
这四种dispatcher方式可以单独使用,也可以组合使用,配置多个<dispatcher></dispatcher> 即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值