我正在重写一个最初用 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>
注意没有样式...