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>