web.xml里<filter-mapping>中的<dispatcher>作用
在对 sitemesh 框架使用的过程中,发现有的请求不渲染,从而引发对些问题的探究。
2.4版本的 Servlet 规范在部署描述符中增加了一个 <dispatcher>
元素,这个元素有四个可能的值:即 REQUEST,FORWARD,INCLUDET 和 ERROR,可以在一个<filter-mapping>
元素中加入任意数目的 <dispatcher>
,使得 filter 将会作用于直接从客户端过来的 request,通过 forward 过来的 request,通过 include 过来的 request 和通过<error-page>
过来的 request。如果没有指定任何<dispatcher>
元素,默认值是 REQUEST。
1.REQUEST(Request):默认值 只有直接访问该目标资源时该过滤器才会起作用。
2.FORWARD(Forward):对转发到目标资源的请求过滤。
3.INCLUDE(Include):在JSP页面中的动作:
<jsp:include page=.......
在Java代码中的request.getRequestDispatcher("....").include
注意:如果目标资源一通过<%@ include file="目标资源二"%指令包含,这时此过滤器不工作。
4.ERROR(error): 配置了过滤器对错误页面进行过滤,正常请求不会拦截,当出现错误的时候,会跳转到改过滤器。
REQUEST FORWARD 工作示意图
1.Request 过滤器
首先我们来看一下 web.xml
:
myFilter xx.MyFilter myFilter 目标资源一
他的请求示意图如下:
2.Forward 过滤器
web.xml
如下:
OneFilter unsuccessful.weibo.base.filter.demo1.OneFilter OneFilter /* TwoFilter unsuccessful.weibo.base.filter.demo1.TwoFilter TwoFilter /* FORWARD ThreeFilter unsuccessful.weibo.base.filter.demo1.ThreeFilter ThreeFilter /*
请求示意图如下:
3.Error 过滤器
web.xml
如下:
OneFilter unsuccessful.weibo.base.filter.demo1.OneFilter OneFilter /* ERROR TwoFilter unsuccessful.weibo.base.filter.demo1.TwoFilter TwoFilter /* ERROR ThreeFilter unsuccessful.weibo.base.filter.demo1.ThreeFilter ThreeFilter /* 404 /404.html
打印数据如下:
ThreeFilterBREAK ThreeFilterOneFilterTwoFilterBREAK TwoFilterBREAK OneFilter
得出示意图如下: