Struts2自定义404错误页面永远不会显示

时间:2014-06-08 12:33:03

标签: jsp struts2 http-status-code-404 web.xml

我使用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异常被正确处理,就像我希望它们的行为一样。

3 个答案:

答案 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未知处理程序,它可能会处理您的操作或结果。