2010-07-16 10 views
5

sulla mia pagina JSF2, sto usando i messaggi di errore internazionalizzati.JSF <h: OutputFormat>: valori di matrice uso come parametri

Nel mio backing bean, sto mettendo i messaggi in ambito Flash:

flash.put("error", exception.getType()); 

Nella pagina, questa stringa viene tradotta in questo modo:

<h:outputText value="#{bundle[flash.error]}"/> 

funziona bene.

ORA voglio anche essere in grado di inserire (un numero arbitrario di) parametri nel testo del messaggio, che viene inserito nei segnaposti nella proprietà i18n nel mio message.properties. Pertanto, sto mettendo i parametri come un array di stringhe in ambito Flash, in questo modo:

//exception.getParameters returns String[] 
flash.put("errorParams", exception.getParameters()) 

ora voglio anche essere in grado di utilizzare questo array String come parametri per un elemento OutputFormat, per inserirli in una proprietà come Welcome, {0} {1}. così ho cercato di raggiungere questo obiettivo utilizzando ui: repeat:

<h:outputFormat value="#{bundle[flash.error]}" rendered="#{! empty flash.error}" class="invalid"> 
    <ui:repeat value="#{flash.errorParams}" var="_param"> 
    <f:param value="#{bundle[_param]}"/> 
    <!-- also doesn't work: <f:param value="#{_param}"/>--> 
    </ui:repeat> 
</h:outputFormat> 

Purtroppo, il valore param viene ignorato e i segnaposto del i18n-proprietà non sono sostituiti, in modo che l'output di rendering è Welcome, {0} {1}. Quando si utilizza un ripetitore "normale", visualizzando gli elementi dell'array come un testo di output, funziona. Quindi il tag outputFormat non sembra supportare l'uso di una ripetizione da bambino. Dannazione, così vicino;) Qualcuno sa un buon modo per fare quello che voglio, o c'è qualche libreria di componenti di supporto una cosa del genere?

risposta

7

Il problema qui è che ui:repeat è un figlio in fase di rendering di h:outputFormat che in realtà non supporta affatto. Vuoi mettere più f:param elementi direttamente come figli del h:outputFormat durante il tempo di costruzione.

Il c:forEach è adatto per questo compito. I tag principali JSTL (che sono già inclusi in Facelets, quindi non è necessario installare JAR aggiuntivi) fanno il loro lavoro durante lo edificio l'albero delle viste, subito prima del turno JSF al processo/rendering l'albero delle viste.

<html xmlns:c="http://java.sun.com/jsp/jstl/core"> 
... 
<h:outputFormat value="#{bundle[flash.error]}" rendered="#{! empty flash.error}" class="invalid"> 
    <c:forEach items="#{flash.errorParams}" var="_param"> 
    <f:param value="#{bundle[_param]}"/> 
    </c:forEach> 
</h:outputFormat> 
+0

Funziona come un fascino. Grazie mille!!! – ifischer

+1

Prego. Interessante caso d'uso dello scope flash btw. – BalusC

+0

Sì, l'ho appena scoperto qualche giorno fa. Ho avuto problemi con FacesMessages in quanto non sopravvivono redirect (che faccio spesso), quindi sto utilizzando il flash-Scope, invece, che è un sostituto ideale. – ifischer

Problemi correlati