如何在JSF中控制<h:messages>的位置?</h:messages>

时间:2011-08-14 10:56:26

标签: jsf-2

关于这个问题,我已经没有想法,如果可能的话,我会很感激:

我的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>

1 个答案:

答案 0 :(得分:4)

您已使用messagesfor属性定义了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 / messagesmessages / stylestyleClass / {{1来设置infoStyle标记和内容的样式},infoClass / warnStylewarnClass属性。

此外,您应该考虑使用errorStyle标记的errorClass / fatalStyle``fatalClass属性来设置邮件的样式,而不是依赖父元素的样式(可能因人而异)包含元素到另一个)。