3

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

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

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

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

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

4

2 回答 2

3

如果您使用的是 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,那么您需要首先FacesContext#getMessages()List<FacesMessage>一些实用程序 bean 甚至 EL 函数的帮助下收集:

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

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

然后,您可以使用相同的方式messageList在您的视图中对其进行迭代。<ui:repeat>

于 2011-08-09T19:05:40.463 回答
0

我最终在我的 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 变量的地方工作。我正在遍历它们,因为我需要根据页面的最高严重性消息来设置消息样式。这是我在浏览器页面中得到的渲染输出:

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

注意没有样式...

于 2011-08-15T18:26:02.853 回答