2011-12-14 11 views
6

Ho un modello con un elenco di argomenti selezionati. Ogni argomento può essere presentato in una stanza e ci sono più stanze che devono essere scelte in base alla disponibilità. L'utente può impostare la stanza preferita per la presentazione. Se non è disponibile, ma è disponibile un altro, al momento selezionato dovrebbe esserci un messaggio di informazione per modificare la stanza. Qualcosa di simile al:Visualizza messaggi info in jsp per Spring WebFlow 2.0

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

loop è un attributo varStatus in c: tag foreach
aggiungo i messaggi alle MessageContext in questo modo:

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

Il tag errore funziona se li aggiungo come errori, ma non sono errori. C'è un modo in cui posso visualizzare questi messaggi di informazione in modo elegante come gli errori?

risposta

5

Dal DefaultMessageContext ho visto che c'è un getter per tutti i messaggi che dà una serie di messaggi nel contesto del messaggio e che da loop sopra la matrice posso trovare i messaggi per il campo che sta attualmente Rendering:

Ma in questo modo l'iterazione su tutti i messaggi viene eseguita per ogni campo che deve essere renderizzato e se si dispone di molti campi, questo potrebbe essere lento.

Un altro modo per ottenere ciò è ottenere la mappa dei messaggi nel contesto del messaggio. Ecco un esempio del contesto in output in jsp, ho usato $ {} 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']]]] 

C'è una mappa sourceMessages che detiene tutti i messaggi per un campo che possono essere recuperati con la fonte come chiave. Ma il problema è che non c'è getter per la mappa nell'implementazione org.springframework.binding.message.DefaultMessageContext. Tuttavia, esiste un metodo getMessagesBySource (origine java.lang.Object) che fornisce una matrice di messaggi per l'origine specificata. Quindi possiamo usarlo nell'espressione EL.

IMPORTANTE! Passare gli argomenti del metodo in EL è solo con le specifiche EL supportate in EL 2.2. EL 2.2 è fornito per impostazione predefinita in contenitori Servlet 3.0/JSP 2.2. Si veda JSTL or JSP 2.0 EL for getter with argument

Così ora informazioni possono essere visualizzati 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> 

Se è necessario utilizzare la versione precedente di Servlet 3.0/JSP 2.2 contenitori di quanto penso che il modo migliore è quello di ricostruire le sourceMessages mappa e inseriscilo in flashScope prima di renderizzare la vista.

Problemi correlati