从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输出的上下文示例,我使用了${flowRequestContext.messageContext}:
[DefaultMessageContext@2de69e99 sourceMessages = map[[null] -> list[[empty]], 'selectedTopics[2].room' -> list[[Message@12329bcb source = 'selectedTopics[2].room', severity = INFO, text = 'Room changed from ALU1-M1 to ALU1-M2']], 'selectedTopics[4].room' -> list[[Message@87abf31 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。