2011-12-14 80 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中。