我在 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:composition和ui:define标签,Chrome 显然不理解这些标签。这证实了我的理论,即 Facelets 页面没有被处理。
所以,我的问题是,如何解决这个问题?如何使错误页面得到处理并返回作为模板与错误页面内容组合结果的 HTML 代码?