【问题标题】:web.xml error-pages are not working, why?web.xml 错误页面不起作用,为什么?
【发布时间】:2011-11-09 04:26:39
【问题描述】:

现在我的想法已经不多了,不知道还能尝试什么。关键是甚至没有一个错误页面在工作,我只是想知道,我做错了什么?,这里是代码:

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/sessionexpired.xhtml</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/500.xhtml</location>
</error-page>

当我的 web.xml 中有这段代码时,我会收到这条消息:

XML 读取错误:未找到元素

这条消息是什么意思?我该如何解决这个问题?谢谢。

顺便说一句,我也尝试使用过滤器来处理 ViewExpiredException,然后它在我第一次发送 POST 消息并重定向到 sessionexpired.xhtml 时工作。但是,如果我向后单击然后再次发出 POST 调用 BAM!我再次得到 ViewExpiredException。

2011 年 11 月 30 日更新 --[替代解决方案]-------------------------------- -----

一段时间后,我发现为了使其正常工作,您必须指定 .html 或 .jsp 文件的位置,所以它最终会是:

<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/sessionexpired.html</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/500.jsp</location>
</error-page>

【问题讨论】:

  • 嗨 Bresh Gurung,是的,这是一个非常详细的答案,但也没有用。问题是它抛出的消息“XML 读取错误:找不到元素 - 位置 localhost:8080/XXXXXXX - 行号 1 列 1”,知道是什么原因造成的吗?
  • 哪个 Glassfish 版本?您的 &lt;web-app&gt; 根声明是什么样的?谁在给出错误信息?你的编辑还是 Glassfish 本身?那个错误真的没有更多了吗?我也希望看到行号和列号。
  • 我使用的是 Glassfish 3.1;错误信息由浏览器显示;是的,有一个第 1 行第 1 列。我最终创建了一个 ExceptionHandlerFactory,这样我就可以捕获 ViewExpiredException。正如我在论坛上看到的,这似乎是 Glassfish 3.1 中的一个错误,他们说他们会在下一个版本中修复它。
  • 您究竟在何时何地收到此错误?毕竟有些模棱两可。当保存 web.xml 或 IDE 验证 web.xml 或容器想要解析 web.xml 时,您是否会收到此信息?还是您在错误页面本身中收到此错误?
  • 我已经回答了这个问题,错误显示在浏览器中。我将会话超时设置为 1,然后测试应用程序并强制它显示 sessionexpired.xhtml,我最终在“浏览器 [Firefox 和 IE]”中收到该错误(XML 读取错误:未找到元素 - 位置localhost:8080/XXXXXXX - 行号 1 列 1) 而不是 sessionexpired.xhtml 页面。稍后我将使用 ExceptionHandlerFactory 发布解决方案。

标签: java jsf glassfish web.xml


【解决方案1】:

好吧,对于那些使用 Glassfish 3.1 来解决这个问题的人,你可以按照这篇文章来处理这个问题,即使我最后改用 sendRedirect()的 JSF 导航器来呈现 sessionexpired.xhtml 文件,但这是您的选择,它工作正常。给你:

http://weblogs.java.net/blog/edburns/archive/2009/09/03/dealing-gracefully-viewexpiredexception-jsf2

【讨论】:

  • 你知道有一个ExternalContext#redirect() 方法吗?不再有不必​​要的 javax.servlet 导入。
  • 我的 标记仅解析 *.jsp 页面,而不是 *.html 页面。任何想法,为什么会这样?
  • @SajibAcharya(不确定但)我认为 *.html 不被 JSF 处理,只有 *.jsp。
【解决方案2】:

可能有些问题,试试这个可能会有所帮助..
&lt;error-page&gt; 标记位于 &lt;servlet-mapping&gt; 元素之后。

<web-app>
...
<servlet>
 ...
  </servlet>
  <servlet-mapping>
    .....
  </servlet-mapping>
  ...
  <welcome-file-list>
  ...
   </welcome-file-list>
  <error-page>
    <error-code>404</error-code>
    <location>/errorpages/html404.html</location>
  </error-page>
 <taglib>
 ...
 </taglib>
 ...
</web-app>

【讨论】:

  • 嗨 SUMIT SINGH,感谢您的回答,但是是的,在 servlet 映射之后我已经有了错误页面。当我放置 error-place 子句时,它只会抛出错误“XML 读取错误:未找到元素”。是什么原因造成的?
  • 自 Servlet 2.4(带有 XSD)以来,顺序不再重要。在此之前,带有 DTD 和更早版本的 Servlet 2.3,排序很重要。但是现在谁在使用超过 10 年的 API?
【解决方案3】:

当我的 web.xml 中有这段代码时,我会收到这条消息:

 XML read error: no element found

根据 cmets,事实证明您在浏览器中看到的是这个,而不是预期的错误页面。由于web.xml 中的语法错误,我最初将其解释为您的 IDE/编辑器提到的。你的问题并不完全清楚。

好吧,解决方案很简单:确保&lt;error-page&gt; 的&lt;location&gt; 与FacesServlet 的URL 模式匹配。最简单的方法是将FacesServlet 映射到*.xhtml 的URL 模式上。


顺便说一句,我也尝试使用过滤器来处理 ViewExpiredException,然后它在我第一次发送 POST 消息并重定向到 sessionexpired.xhtml 时工作。但是,如果我向后单击然后再次发出 POST 调用 BAM!我再次收到 ViewExpiredException。

这只是由于从浏览器缓存而不是直接从服务器请求页面造成的。另请参阅此答案以获取具体解决方案:browser back + viewscope beans。

【讨论】:

  • 嗨 BalusC,感谢您的回答,但它仍然无法正常工作。我对 FacesServlet 的 URL 模式是 *.xhtml (像往常一样), > 与上面在我的问题中发布的相同,它在带有黄色背景的浏览器中显示相同的错误顺便说一句。
  • 该错误是特定于浏览器的。您似乎正在使用 FF,它确实会出现这样的 XML 错误。好吧,右键单击页面并查看源代码。你看到了什么?是空的吗?还是未解析?使用 Firebug 并检查请求/响应标头。他们说什么?尤其是响应内容类型。
  • 它得到 HTTP/1.1 500 Internal Server Error 作为结果,结果的源代码以 开头。我还尝试从 web.xml 中捕获错误代码 500,但它只是没用,没有错误页面从那里工作。可能我应该尝试使用另一台机器,或者我使用的 Glassfish 安装可能有问题,我真的不知道。它尝试使用 web.xml 捕获错误,但在解析 XML 文件时会导致另一个错误,这就是我所知道的。
  • 啊,对,错误页面模板本身似乎包含一个 XHTML 语法错误,Facelets 在解析它时感觉到了它。当您通过在浏览器地址栏中输入其 URL 直接打开错误页面时,是否也会发生这种情况?您是否可以尝试编辑您的问题以包含仍然重现问题的错误页面的最小可能但完整的 sn-p?
  • Np,如果我直接从 URL 访问,页面 (sessionexpire.xhtml) 呈现正常。正如我告诉过你的,这个问题现在已经使用 ExceptionHandlerFactory 解决了,直到 Glassfish 的人决定发布这个 3.1 版本的修复程序;我稍后会发布解决方案。感谢您的努力。
【解决方案4】:

更改web.xml后,是否进行了ear或war重新部署? 如果你直接去服务器修改文件,一些应用服务器可能会缓存 web.xml 的旧副本。 希望它可以工作。 :)

【讨论】:

    猜你喜欢
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 2013-06-15
    相关资源
    最近更新 更多