我使用struts2框架进行webapp。在尝试创建自定义404错误页面时,我发现Struts2正在为我做更多工作。
我只使用struts.xml和web.xml文件。在web-xml文件中,我添加了以下代码:
<error-page>
<error-code>404</error-code>
<location>/error/Error404.jsp</location>
</error-page>
现在,当我启动我的webapp时,它会像往常一样进入主页。当我尝试这种类型的网址时(所有不存在的网址):
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到还可以处理任何晦涩难懂的请求(因此用户输入的任何网址都会被实际处理,而不是只显示空白屏幕。我的配置中缺少什么?
PS:我不是在讨论java异常/错误,而是只讨论http错误。 hava异常被正确处理,就像我希望它们的行为一样。
答案 0 :(得分:4)
我找到了它没有显示的原因。
空白屏幕的问题如下:我的404页面的路径不正确。它应该是从webContent文件夹开始的路径,并以斜杠&#34; /&#34;开头。
默认操作的问题可能是服务器重启或缓存问题。我关闭浏览器和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>
答案 1 :(得分:3)
要解决此问题,您只需添加默认命名空间并创建一个引用为*的操作。如果没有匹配的动作,它将默认执行。将以下代码添加到struts.xml。它应该工作正常。
<package name="serveAll" namespace="" extends="struts-default">
<action name="*">
<result>/error.jsp</result>
</action>
</package>
答案 2 :(得分:1)
Struts 2也可以配置为处理未知操作或结果,即使没有default-action-ref
标记,它也会提供处理此类请求的配置。
通常,您可以使用struts2 xml配置和引用处理程序的unknown-handler-stack
标记。您应该检查提供了com.opensymphony.xwork2.UnknownHandler
的内容。另请参阅此答案How to define unknown handler bean。
如果您使用的是常规插件,它默认提供convention
未知处理程序,它可能会处理您的操作或结果。