如何编写和配置自定义facelet以覆盖h:消息?

我正在重写最初用Weblogic Beehive写入JSF 2.0的站点,我遇到了一个问题,那就是我需要将新站点生成的消息转换为完全匹配输出的格式现有网站。

我已经尝试过使用这个很好的标签,但现有的消息框架的样式和逻辑并不适合这个输出。

有没有JSF中的选项可以让我创建一个自定义标签,它不仅会输出消息,还会对它们执行条件逻辑?

例如,我一直使用摘要和详细信息字符串创建FacesMessages,但旧网站的格式只显示最高的摘要。 例如,我添加4条消息,每条消息具有相同的摘要消息以及不同的详细信息。 我只想显示最高严重性的摘要。

此外,我需要将消息显示和样式化为一个框,而不是每个消息和一些细节都需要有条件的CSS类。


如果您使用的是JSF 2.x,那么您可以循环遍历FacesContext#getMessageList() 。 每个项目都是一个FacesMessage ,它又有几个getter。

<ui:repeat value="#{facesContext.messageList}" var="facesMessage">
    Severity: #{facesMessage.severity}<br />
    Summary: #{facesMessage.summary}<br />
    Detail: #{facesMessage.detail}<br />
    <br />
</ui:repeat>

这允许在消息周围使用更精细的HTML标记。

如果你仍然使用FacesContext缺少这种方法的JSF 1.x,那么你需要在一个List<FacesMessage>中的FacesContext#getMessages()中首先在一些实用bean或EL函数的帮助下收集:

List<FacesMessage> messageList = new ArrayList<FacesMessage>();
Iterator<FacesMessage> messages = FacesContext.getCurrentInstance().getMessages();

while (messages.hasNext()) {
    messageList.add(messages.next());
}

然后,您可以使用<ui:repeat>以相同的方式遍历视图中的这个messageList


我结束了这个在我的JSF页面(xhtml)中:

            <c:set var="messageList" value="#{facesContext.messageList}" />
            <c:set var="maxSev" value="#{facesContext.maximumSeverity.ordinal}" />
            <ui:repeat value="${messageList}" var="fm" >
                <c:choose>
                     <c:when test="${fm.severity.ordinal eq 0}">
                         <c:set var="summaryStyleClass" value="outcome"/>
                         <c:set var="detailStyleClass" value="outcome_details"/>
                     </c:when>
                     <c:when test="${fm.severity.ordinal eq 1}">
                         <c:set var="summaryStyleClass" value="warning_title"/>
                         <c:set var="detailStyleClass" value="warning"/>
                     </c:when>
                     <c:when test="${fm.severity.ordinal eq 2}">
                         <c:set var="summaryStyleClass" value="error_title"/>
                         <c:set var="detailStyleClass" value="error"/>
                     </c:when>
                     <c:when test="${fm.severity.ordinal eq 3}">
                         <c:set var="summaryStyleClass" value="fatal"/>
                         <c:set var="detailStyleClass" value="fatal_details"/>
                     </c:when>
                </c:choose>
            </ui:repeat>
            <div class="${detailStyleClass}" >
                 <div class="${summaryStyleClass}">
                        <ui:repeat value="${messageList}" var="fm" >
                             <c:choose>
                                 <c:when test="${fm.severity.ordinal eq maxSev}">
                                     ${fm.summary}
                                 </c:when>
                             </c:choose>
                        </ui:repeat>
                 </div>
                  <ul>
                     <ui:repeat value="${messageList}" var="msg">
                         <li><h:outputText value="${msg.detail}"/></li>
                     </ui:repeat>
                </ul>
            </div>

我敢肯定,我在这里打破了一个模式,但该部分似乎并没有解决summaryStyleClass和detailStyleClass vars的问题。 我在遍历它们,因为我需要根据页面的最严重消息的样式来设置消息的样式。 这是我在浏览器页面中获得的呈现输出:

            <div>
                 <div>Warning:</div>
                 <ul>
                      <li>Warning message.</li>
                </ul>
            </div>

注意没有样式...

链接地址: http://www.djcxy.com/p/71655.html

上一篇: How do I write and configure a custom facelet to override h:messages?

下一篇: Different CSS style for JSF messages