关于这个问题,我已经没有想法,如果可能的话,我会很感激:
我的xhtml页面中有以下内容:
<h:panelGroup id="globalMesgArea" styleClass="globalMesgArea" layout="block">
<h:panelGrid columns="1">
<h:messages for="globalMesgArea" layout="table" globalOnly="true" infoClass="infMsgs" errorClass="errMsgs"/>
</h:panelGrid>
</h:panelGroup>
我可以通过globalMesgArea StyleClass的定义来定位消息内容:
#globalMesgArea {
overflow: auto;
width:800px;
height:50px;
position:absolute;
bottom: 1em;
left:95px;
}
但是(总有一个但是......)如果我的faces-config.xml中存在页面导航规范错误,则错误消息会在页面的下方显示为<ul>
而不是{{1 }}。此外,如果我没有在h:messages中指定“for”属性,则错误不会“出现”,但可以在页面查看源中的相同(错误)位置看到。我只能说......“arrgghh!” :-)
来自网页浏览来源的HTML代码段为:
<table>
答案 0 :(得分:4)
您已使用messages
和for
属性定义了globalOnly
代码。根据{{3}},这些属性是互斥的 - 如果为for
属性指定值,则全局消息(没有客户端标识符)将不会显示在呈现标记的正文中。根据文档,当您为两者指定值时,for
属性优先。页面导航规范错误没有与之关联的任何客户端标识符。这可以解释您问题中所述的行为:
另外,如果我没有在h:messages中指定“for”属性,那么错误不会“出现”,但可以在页面视图源中的相同(错误)位置看到。
此外,当您的项目阶段在web.xml
中设置为“开发”而非“生产”时,FacesContext中尚未显示现有messages
标记的任何邮件将以不同的方式显示messages
标记(在Mojarra中标识为“javax_faces_developmentstage_messages”)。此外,此messages
标记始终在开发模式下创建(即使没有要显示的消息),因为写入MessagesRenderer
始终在渲染 - 响应阶段发出此类标记。
所有messages
代码都在HTML中呈现为无序列表<ul>
。页面中的panelgrid
标记在呈现的响应中创建HTML表(table
)。这解释了您的评论:
如果我的faces-config.xml中存在页面导航规范错误,则错误消息会在页面的下方显示为
<ul>
,而不是<table>
如果要纠正此行为,可以执行以下任一操作:
Production
而不是Development
。所有未处理的消息现在都将显示在服务器日志中。当Mojarra在生产模式下运行时,Mojarra将不再在响应中呈现标识为messages
的{{1}}标记;相反,它会将消息(包含消息的clientId,严重性,摘要和详细信息值)写入日志。javax_faces_developmentstage_messages
标记,{{1} } attribute设置为messages
;现在,您的页面导航规范错误等所有消息都会显示在此globalOnly
标记中。您可以单独设置此标记的样式。这种方法有利有弊:
true
标记如果没有显示任何其他内容则是多余的。messages
/ messages
,messages
/ style
,styleClass
/ {{1来设置infoStyle
标记和内容的样式},infoClass
/ warnStyle
和warnClass
属性。此外,您应该考虑使用errorStyle
标记的errorClass
/ fatalStyle``fatalClass
属性来设置邮件的样式,而不是依赖父元素的样式(可能因人而异)包含元素到另一个)。