【问题标题】:Display info messages in jsp for Spring WebFlow 2.0在 Spring WebFlow 2.0 的 jsp 中显示信息消息
【发布时间】:2012-01-20 06:20:28
【问题描述】:

我有一个包含选定主题列表的模型。每个主题都可以在一个房间中呈现,并且需要根据可用性选择更多房间。用户可以设置首选的演示房间。如果它不可用,但有其他可用,则在选定的时间应该有一条信息消息,告知房间已更改。类似的东西:

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

loop 是 c:foreach 标签中的一个 varStatus 属性
我将消息添加到 messageContext 中,如下所示:

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

如果我将它们添加为错误,则错误标记有效,但它们不是错误。有什么方法可以像错误一样优雅地显示这些信息消息?

【问题讨论】:

    标签: java jsp spring-webflow


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-11-18
      • 2013-11-08
      • 2011-04-20
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多