Les données affichées dans une page JSF possèdent deux représentations :
-
Côté client (code HTML), elles existent sous la forme de chaînes de caractères
-
Côté serveur (dans les backing beans), les données peuvent en revanche être typées (entier, date…)
Il est donc nécessaire de pouvoir convertir ces données depuis le modèle Java vers le modèle HTML (composants d’affichage et de saisie) et réciproquement (cela concerne les composants de saisie lors du submit d’un formulaire).
Convertisseurs standards
JSF est livré avec un ensemble de convertisseurs standards.
Convertir une valeur numérique
Le NumberConverter
Ce convertisseur donne la possibilité de convertir des numériques suivant trois types différents : number (type par défaut), currency ou percent (et non pas percentage comme indiqué dans certaine documentation). En fonction du type retenu, on peut appliquer un formatage particulier, comme par exemple :
-
Affichage d’un prix
<h:inputText value="#{produitBean.prix}">
<f:convertNumber type="currency"
groupingUsed="true"
currencyCode="EUR"
currencySymbol="€"
maxIntegerDigits="5"
maxFractionDigits="2"/>
</h:inputText>
-
Affichage d’un pourcentage
<h:outputText value="#{produitBean.tva}">
<f:convertNumber type="percent"
minFractionDigits="1"
maxFractionDigits="1"/>
</h:outputText>
Remarque : dans le cas de composants de saisie, ce convertisseur ne fonctionne qu’avec les types double et long. Pour les autres types (float, int, short…), il faut utiliser le tag <f:converter>
Autres convertisseurs numériques
En lecture seule (composants d’affichage tel que <h:outputText/>), les types int,short et float étant compatibles avec les types long et double, il est possible d’utiliser le tag <f:convertNumber/>. En revanche, une IllegalArgumentException est levée avec les composants de saisie, car le ConvertNumber génère un long si la valeur saisie est un entier, et un double si la valeur saisie est un réel. Ces valeurs ne peuvent donc pas être injectées dans des variables dont les types sont de moindre précision (int, short, float). Il convient donc d’utiliser un autre converter dans ce cas. Il existe plusieurs possibilités pour utiliser le convertisseur souhaité :
-
Attribut converter
<h:inputText value="#{produitBean.quantite}"
converter="javax.faces.convert.IntegerConverter" />
-
Tag <f:converter/>
<h:inputText value="#{produitBean.quantite}"
converter="Integer" />
Cette solution nécessite d’incrire le convertisseur dans le fichier de configuration JSF :
<converter>
<converter-id>Integer</converter-id>
<converter-class>javax.faces.convert.IntegerConverter</converter-class>
</converter>
Convertisseurs personnalisés
Il est possible d’étendre l’API afin d’ajouter ses propres convertisseurs.