我正在为Web应用程序使用struts2框架。在尝试创建自定义404错误页面时,我发现Struts2正在为我做更多的工作。
我只使用struts.xml和web.xml文件。在web-xml文件中,我添加了以下代码:
<error-page> <error-code>404</error-code> <location>/error/Error404.jsp</location> </error-page>
现在,当我启动我的Web应用程序时,它会照常转到首页。当我尝试这种类型的网址(所有不存在的网址)时:
http://localhost:8080/MyWebApp/fhgfhfhfhgfhgfhfhfh http://localhost:8080/MyWebApp/fhgfhfhfhgfhgfhfhfh.action
Struts将处理请求,运行拦截器并自动重定向到默认页面。我希望我的404错误页面会显示在这些页面上。我什至在struts.xml中删除了这一行,但它仍然重定向!
<default-action-ref name="index" />
当我使用以下网址时:
http://localhost:8080/MyWebApp/fhgfhfhfhgfhgfhfhfh.jsp
Struts只会显示一个空白屏幕,并且不会处理任何请求(没有拦截器,没有重定向…)。我也觉得这很奇怪,因为我看不到该请求的无效内容(不存在的.jsp文件除外)
所以我想我需要修改struts.xml以便覆盖一些默认的重定向行为(我不希望通过转到首页来掩盖404错误),并且我的web.xml也可以处理任何晦涩的套利请求(因此,用户键入的任何url都会得到处理,而不仅仅是显示空白屏幕。我的配置中缺少什么?
PS:我不是在谈论Java异常/错误,而只是在谈论HTTP错误。hava异常得到了正确处理,就像我希望它们表现那样。
我找到了它不显示的原因。
空白屏幕的问题如下:我的404页面的路径不正确。它应该是从webContent文件夹开始的路径,并以斜杠“ /”开头。
默认操作的问题可能是服务器重新启动或缓存问题。我关闭浏览器和IDE,然后重新启动一切。然后default-action-ref真的消失了。
我还发现了另一个有趣的怪癖:struts2仅处理动作映射,例如:
http://www.mywebsite.com/webapp/whatever http://www.mywebsite.com/webapp/whatever.action
但它不会像这样处理服务器资源(注意文件扩展名)
http://www.mywebsite.com/webapp/whatever.zip http://www.mywebsite.com/webapp/whatever.jsp http://www.mywebsite.com/webapp/whatever.html
您可以通过在web.xml文件中添加其他过滤器映射来解决此问题:
<filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/error/*</url-pattern> <dispatcher>ERROR</dispatcher> </filter-mapping>