我正在使用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>
移开是不可取的。
答案 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}
)。