java web项目通常会针对500和404错误各制作一个页面.
在使用struts2时,404错误需要在web.xml配置页面处理. 因为struts2只拦截.do结尾的url.其他url不会走struts2的filter.
在web.xml中加上如下配置:
<error-page>
<error-code>404</error-code>
<location>/pagenotfound.do</location>
</error-page>
上面的配值是希望tomcat将404页面转发到struts2进行处理.但是加上这个配置后没有作用.于是我将/pagenotfound.do改成404.jsp进行测试.发现可以成功转发过去.改成Servlet地址也可以.于是推断是struts2过滤器的问题. 为了验证猜测.我又写了一个filter拦截所有以.do结尾的地址,放在所有filter之前. 运行之后显示转到/pagenotfound.do没有进这个新的filter. 这表明问题和struts2框架没关系,出在filter上面.
struts2的filter配置:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
从配置中看到struts2 过滤器是有拦截FORWARD的,但是tomcat404错误转发到/pagenotfound.do确实没进到filter.难道转到/pagenotfound.do这里不是普通的转发,filter针对error-page的转发处理不一样?我查看了一遍Filter的文档,发现还真不一样.
filter-mapping 的dispatcher还有两个选项ERROR和INCLUDE,很明显ERROR就是我们需要的.ERROR就是用于从error-page中过来的请求. 在struts2的filter中加上ERROR这个dispatcher后立刻达到了想要的效果.
<error-page>
<error-code>404</error-code>
<location>/pagenotfound.do</location>
</error-page>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>