从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中。