2

我在 Java EE 6 应用程序服务器(GlassFish v3)中使用 JSF 2.0 和 Facelets。我在 web.xml 中为异常配置了一个错误页面:

<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/error-all.xhtml</location>
</error-page>

这是/error-all.xhtml测试页面:

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                template="/resources/templates/decorator.xhtml">

    <ui:define name="title">Title</ui:define>

    <ui:define name="body">
        <h1>Body</h1>
    </ui:define>
</ui:composition>

我实现了一个托管 bean,当我单击其中一个 commandLink 时,它会故意抛出 RuntimeException。发生这种情况时,会显示 /error-all.xhtml 页面的内容,但它不会通过 Facelets 获取进程,因此不会应用template="/resources/templates/decorator.xhtml"

使用谷歌浏览器,我只看到“标题”和“正文”,结果没有布局。如果我让 Chrome 检查元素,我会得到完整的源代码,其中包括ui:compositionui:define标签,Chrome 显然不理解这些标签。这证实了我的理论,即 Facelets 页面没有被处理。

所以,我的问题是,如何解决这个问题?如何使错误页面得到处理并返回作为模板与错误页面内容组合结果的 HTML 代码?

4

2 回答 2

5

换句话说,错误页面上的请求没有通过FacesServlet?您需要location相应地更新以使其这样做。

例如,如果是url-pattern,那么您需要更新以成为而不是 "plain XHTML" 。FacesServlet*.jsflocation/error-all.jsf/error-all.xhtml

于 2010-06-08T15:14:07.660 回答
-2
 <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>


<error-page>
        <error-code>500</error-code>
        <location>/faces/error.xhtml</location>
</error-page>

尝试这样做,对我来说效果很好。将 faces servlet 的 url 模式放在错误页面位置的前面,而不是 error.xhtml 它将是 /faces/error.xhtml

于 2012-06-26T22:04:03.573 回答