2010-07-16 5 views
5

Sur ma page JSF2, j'utilise des messages d'erreur internationalisés.JSF <h: outputFormat>: utilise des valeurs de tableau en tant que paramètres

Dans mon grain de soutien, je mets les messages dans le flash Portée:

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

Sur la page, cette chaîne se traduit ainsi:

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

fonctionne très bien.

Maintenant, je veux être également en mesure de mettre (un nombre arbitraire de) paramètres dans le texte du message, qui sont insérés dans les espaces réservés dans la propriété i18n dans mon message.properties. Par conséquent, je mets les paramètres comme un tableau de chaînes dans le champ d'application Flash, comme ceci:

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

Maintenant, je veux aussi pouvoir utiliser ce tableau String en tant que paramètres pour un élément outputFormat, pour les insérer dans une propriété comme Welcome, {0} {1}. donc j'ai essayé de le faire en utilisant ui: répéter:

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

Malheureusement, la valeur de PARAM est ignorée et les espaces réservés du i18n-propriété ne sont pas remplacés, de sorte que la sortie est rendu Welcome, {0} {1}. Lorsque vous utilisez un répéteur "normal", en affichant les éléments du tableau comme un texte en sortie, cela fonctionne. Ainsi, la balise outputFormat ne semble pas prendre en charge l'utilisation d'une répétition en tant qu'enfant. Merde, si proche;) Quelqu'un sait-il un bon moyen de faire ce que je veux, ou y at-il une bibliothèque de composants supportant quelque chose comme ça?

Répondre

7

Le problème ici est que ui:repeat est un enfant de h:outputFormat de rendu qui n'est en effet pas du tout supporté. Vous souhaitez placer plusieurs éléments f:param directement en tant qu'enfants de h:outputFormat pendant la construction. Le c:forEach convient à cette tâche. Les balises de cœur JSTL (qui sont déjà incluses dans Facelets, donc vous n'avez pas besoin d'installer de JAR supplémentaires) font leur travail pendant la construction de l'arbre de vue, juste avant que JSF passe à processus/render l'arborescence de vue.

<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

Fonctionne comme un charme. Merci beaucoup!!! – ifischer

+1

De rien. Cas d'utilisation intéressant de la portée du flash btw. – BalusC

+0

Oui, je viens de le découvrir il y a quelques jours. J'ai eu des problèmes avec FacesMessages car ils ne survivent pas aux redirections (ce que je fais souvent), donc j'utilise Flash-Scope à la place, ce qui est un remplacement idéal. – ifischer

Questions connexes