從DefaultMessageContext我看到存在其通過循環陣列上我可以找到當前正在呈現的字段的消息給出的消息上下文和比訊息陣列中的所有消息的getter:
<c:forEach var="topic" items="${model.selectedTopics}" varStatus="loop">
//omitted displaying of topic details
<c:forEach items="${flowRequestContext.messageContext.allMessages}" var="message">
<c:set var="msgSrc" value="selectedTopics[${loop.index}].room"></c:set>
<c:if test="${message.source eq msgSrc}">
<c:if test="${message.severity eq 'INFO'}">
<span class="infoText">${message.text}</span>
</c:if>
</c:if>
</c:forEach>
</c:forEach>
但是通過這種方式,所有消息的迭代都是爲每個必須呈現的字段完成的,並且如果您有很多字段,則這可能會很慢。
這可以實現的另一種方式是獲取消息上下文中的消息映射。下面是在JSP outputed上下文的樣品,我用$ {flowRequestContext.messageContext}:
[[email protected] sourceMessages = map[[null] -> list[[empty]], 'selectedTopics[2].room' -> list[[[email protected] source = 'selectedTopics[2].room', severity = INFO, text = 'Room changed from ALU1-M1 to ALU1-M2']], 'selectedTopics[4].room' -> list[[[email protected] source = 'selectedTopics[4].room', severity = INFO, text = 'Room changed from ALU1-M1 to ALU2-M1']]]]
有一個地圖sourceMessages保持可與源作爲檢索一個字段的所有消息鍵。但問題是在實現org.springframework.binding.message.DefaultMessageContext中沒有getter的地圖。但是,有一個方法getMessagesBySource(java.lang.Object source),它爲指定的源提供一組消息。所以我們可以在EL表達式中使用它。
重要!在EL中傳遞方法參數只能通過EL 2.2支持EL規範。 EL 2.2默認在Servlet 3.0/JSP 2.2容器中提供。見JSTL or JSP 2.0 EL for getter with argument
所以,現在的信息可以用顯示:
<c:forEach var="message" items="${flowRequestContext.messageContext.getMessagesBySource(msgSrc)}">
<c:if test="${message.severity eq 'INFO'}">
<span class="info">${message.text}</span></td>
</c:if>
</c:forEach>
如果您需要使用以前的版本比的Servlet 3.0/JSP 2.2的容器比我認爲最好的辦法是重建sourceMessages地圖和在渲染視圖之前將其插入到flashScope中。