h:使用FullAjaxExceptionHandler时未重新呈现正文

时间:2017-04-05 07:29:15

标签: jsf omnifaces

我正在使用OmniFaces FullAjaxExceptionHandler来显示错误页面。错误页面显示正确,但我对这些页面的样式存在问题。

我的应用程序使用的模板在body元素上定义了CSS类。这些类对于普通页面和错误页面是不同的:

正常页面:

<h:body styleClass="main-body layout-compact">

错误页面:

<h:body styleClass="exception-body error-page">

当FullAjaxExceptionHandler处理异常时,将执行转发到错误页面(基于<error-page>中的web.xml机制)。显然这不会重新呈现<h:body>标记,因为在检查HTML输出时,我可以看到<body>标记仍然包含来自普通页面的CSS类(而不是错误页面的类)

似乎原始<h:body>的内容已替换为错误页面<h:body>的内容,而不是仅替换完整的<h:body>。我不知道这是否是默认的JSF / FullAjaxExceptionHandler行为。

有没有办法让<h:body>使用正确的CSS类进行渲染?将CSS类从<h:body>移开是不可取的。

1 个答案:

答案 0 :(得分:3)

不幸的是,#34;设计&#34;。执行ajax导航时,JSF不会替换整个文档,但它只会替换单个<head><body>元素的子元素,而不会影响父元素。这样做是出于历史原因;较旧的Internet Explorer版本,并不支持完全替换它们。

我自己完成的工作就是简单地将样式放入<main>元素中。无论如何,<header><footer>在最终的HTML输出中通常是相同的。基本上是:

<html>
    <head>
        <title>...</title>
    </head>
    <body>
        <header>...</header>
        <main class="#{page.type}">...</main>
        <footer>...</footer>
    </body>
</html>

如果您确实需要修改<body class>,那么最好的办法是通过错误页面模板中嵌入的JavaScript来实现。{/ p>

<h:outputScript rendered="#{faces.ajaxRequest}">
    document.body.className = "exception-body error-page";
</h:outputScript>

注意:#{faces}仅在OmniFaces 2.5之后可用,如果您使用的是旧版本,请使用#{facesContext.partialViewContext.ajaxRequest})。