2011-12-14 20 views
6

Tengo un modelo con una lista de temas seleccionados. Todos los temas se pueden presentar en una sala y hay más habitaciones que deben elegirse dependiendo de la disponibilidad. El usuario puede establecer el espacio preferido para la presentación. Si no está disponible, pero hay algún otro disponible, en el momento seleccionado debe haber un mensaje de información que indique que la sala ha cambiado. Algo así como el:Mostrar mensajes de información en jsp para Spring WebFlow 2.0

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

bucle es un atributo varStatus en c: etiqueta foreach
añado los mensajes a los MessageContext así: trabaja

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

La etiqueta de error si los agrego como errores, pero no son errores. ¿Hay alguna manera de que pueda mostrar esos mensajes de información de una manera elegante como los errores?

Respuesta

5

Desde el DefaultMessageContext he visto que hay un comprador para todos los mensajes que le da una gran variedad de los mensajes en el contexto del mensaje y que haciendo un bucle sobre la matriz puedo encontrar los mensajes para el campo que está prestando actualmente:

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

Pero de esta forma la iteración de todos los mensajes se realiza para cada campo que se debe renderizar y si tiene muchos campos, esto puede ser lento.

Otra forma en que esto se puede lograr es obtener el mapa de mensajes que se encuentra en el contexto del mensaje. Este es un ejemplo del contexto outputed en JSP, que solía $ {} 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']]]] 

Hay un mapa sourceMessages que mantiene todos los mensajes para un campo que se pueden recuperar con la fuente como una llave. Pero el problema es que no hay getter para el mapa en la implementación org.springframework.binding.message.DefaultMessageContext. Sin embargo, existe un método getMessagesBySource (fuente java.lang.Object) que proporciona una matriz de mensajes para la fuente especificada. Entonces podemos usar eso en la expresión EL.

¡IMPORTANTE! Pasar los argumentos del método en EL es solo por las especificaciones EL soportadas en EL 2.2. EL 2.2 se envía por defecto en los contenedores Servlet 3.0/JSP 2.2. Ver JSTL or JSP 2.0 EL for getter with argument

Así que ahora la información se puede visualizar con:

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

Si es necesario utilizar la versión anterior de Servlet 3.0/JSP 2.2 contenedores que yo creo que la mejor manera es reconstruir las sourceMessages mapa y insértelo en flashScope antes de renderizar la vista.

Cuestiones relacionadas