web.xml里<filter-mapping>中的<dispatcher>作用
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
:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>xx.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<servlet-name>目标资源一</servlet-name>
</filter-mapping>
他的请求示意图如下:
2.Forward 过滤器
web.xml
如下:
<filter>
<filter-name>OneFilter</filter-name>
<filter-class>unsuccessful.weibo.base.filter.demo1.OneFilter</filter-class>
</filter>
<filter-mapping>
<!-- change request to forward -->
<filter-name>OneFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>TwoFilter</filter-name>
<filter-class>unsuccessful.weibo.base.filter.demo1.TwoFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TwoFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter>
<filter-name>ThreeFilter</filter-name>
<filter-class>unsuccessful.weibo.base.filter.demo1.ThreeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ThreeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
请求示意图如下:

3.Error 过滤器
`web.xml` 如下:
<filter>
<filter-name>OneFilter</filter-name>
<filter-class>unsuccessful.weibo.base.filter.demo1.OneFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OneFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<filter>
<filter-name>TwoFilter</filter-name>
<filter-class>unsuccessful.weibo.base.filter.demo1.TwoFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TwoFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<filter>
<filter-name>ThreeFilter</filter-name>
<filter-class>unsuccessful.weibo.base.filter.demo1.ThreeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ThreeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
打印数据如下:
ThreeFilter
BREAK ThreeFilter
OneFilter
TwoFilter
BREAK TwoFilter
BREAK OneFilter
得出示意图如下:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步