如何编写和配置自定义小面孔以覆盖 h:messages



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

我尝试使用很好的标签,但是现有消息框架的样式和逻辑不适合此输出。

JSF 中是否有选项允许我创建自定义标记,该标记不仅会输出消息,还会对它们执行条件逻辑?

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

另外,我需要将消息显示为框并设置样式,而不是每条消息,并且某些详细信息需要具有条件CSS类。

如果您使用的是 JSF 2.x,则可以循环遍历FacesContext#getMessageList()。每个项目都是一个FacesMessage,而又有几个获取者。

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

这允许在消息周围进行更细粒度的 HTML 标记。

如果您仍在 JSF 1.x 上,并且在 FacesContext 中缺少此方法,那么您需要先借助一些实用程序 bean 甚至 EL 函数在List<FacesMessage>中收集FacesContext#getMessages()

List<FacesMessage> messageList = new ArrayList<FacesMessage>();
Iterator<FacesMessage> messages = FacesContext.getCurrentInstance().getMessages();
while (messages.hasNext()) {
    messageList.add(messages.next());
}

然后,您可以使用相同的方式在视图中循环访问此messageList <ui:repeat>

我最终在我的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>

注意没有样式...

最新更新