2011-12-14 42 views
6

我有一个包含选定主题列表的模型。每个主题都可以放在一个房间里,并且有更多的房间需要根据可用性来选择。用户可以设置提示的首选空间。如果它不可用,但其他可用,则在选定时间应该有一个信息消息,指出房间已更改。有点像:在jsp中为Spring WebFlow 2.0显示信息消息

<form:errors path="selectedTopics[${loop.index}].room" /> 

循环是在C varStatus属性:的foreach标签
我的消息添加到MessageContext的是这样的:

MessageContext messages = context.getMessageContext(); 
String source= "selectedTopics[" + i + "].room"; 
messages.addMessage(new MessageBuilder().info() 
      .source(source) 
      .code("topic.room.changed") 
      .build()); 

错误标签的作品,如果我将它们添加作为错误,但它们不是错误。有什么方法可以像错误一样以优雅的方式显示这些信息消息吗?

回答

5

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