| Astuce | ||
|---|---|---|
| ||
Sommaire :
| Sommaire | ||
|---|---|---|
|
...
Exemple
L'écriture des formulaires JSF ne déroutera pas l'habitué des formulaires JSP. On utilisera par exemple :
...
| exercice | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
Ajouter une classe contrôleur Test1Controller (la créer à partir de AboutController), ajouter à cette classe une méthode callback() qui renvoie la chaîne gotoWelcome, et appeler cette méthode en réaction au bouton de la page test1.jsp.
|
Messages d'erreur
Dans une page JSP les balises <h:messages> et <h:message> permettent d'afficher des messages d'erreur à l'utilisateur.La balise <h:messages> permet d'afficher l'ensemble des messages d'erreurs. La balise <h:message> permet d'afficher les messages d'erreurs relatifs à une balise <h:inputText> particulière. Elle dispose, à cet effet, d'un attribut for qui lui permet de faire le lien avec un attribut id d'une balise <h:inputText> donnée. Ce mécanisme est notamment utilisé quand l'attribut required de la balise <h:inputText> est positionné à true ou bien quand un validateur (cf. ci-dessous) lui est associé.Il est aussi possible, dans une callback d'un contrôleur, de remonter des messages d'erreurs vers la vue. Ces messages seront généralement rendus grâce à la balise <h:messages>. Typiquement, la callback renverra null, c'est-à-dire que la page affichée à l'utilisateur restera la même (celle où s'est produite l'erreur de saisie). Dans l'exemple suivant, on affiche un message si l'utilisateur correspondant à l'identifiant donné est déjà administrateur :
...
| exercice | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||
Ajouter une boîte de saisie (id="myInput") au dessus du bouton dans le formulaire, lier le contenu de la boite à une propriété myInput de test1Controller, et modifier la méthode callback() pour qu'elle ne renvoie vers la page d'accueil que si myInput a au moins deux caractères ou sinon, reste sur la vue test1.jsp en affichant le message d'erreur TEST1.MESSAGE.SHORT.
|
Validation des formulaires
Validation au niveau des JSP
Utilisation des validateurs prédéfinis
Il existe des validateurs par défaut dans JSF (validateLength, validateLongRange et validateDoubleRange), par exemple :
...
| exercice | ||||||
|---|---|---|---|---|---|---|
| ||||||
Ajouter un validateur prédéfini à la boite de saisie et supprimer le code correspondant de la méthode callback() (utiliser le validateur validateLength)
|
Développement de validateurs personnalisés
Il est aussi possible d'écrire ses propres validateurs. Leur mise en œuvre est relativement simple, par exemple :
...
| exercice | ||||||
|---|---|---|---|---|---|---|
| ||||||
Ajouter un validateur personnalisé validateMyInput() à la boite de saisie qui se charge de lancer une exception à la place de la méthode callback().
|
Validation au niveau des beans (JSR 303)
http://www.jmdoudoux.fr/java/dej/chap-validation_donnees.htm
http://musingsofaprogrammingaddict.blogspot.com/2009/01/getting-started-with-jsr-303-beans.html
http://www.touilleur-express.fr/2008/06/06/jsr-303-vous-avez-valide-votre-bean/
http://www.openscope.net/2010/02/08/spring-mvc-3-0-and-jsr-303-aka-javax-validation
...
On peut également imaginer un bean qui cumulerait les annotations nécéssaires à la validation et les annotations nécessaires à la persistance.
Intégration Hibernate
http://www.hibernate.org/subprojects/validator.html
Implémentation hibernate validator intègre la validation du bean au niveau de la persistance.
elle propose quelques contraintes supplémentaires à celles de la spécifictation JSR 303 comme :
- @CreditCardNumber : doit être un numéro de carte bleue
- @Email : doit être un e-mail
- @Length(min=, max=) : doit avoir un taille comprise entre min et max (taille de la colonne en base sera max)
- @NotBlank : ne doit pas être null ou vide ou composée d'espace (pour une chaîne)
- @NotEmpty : ne doit pas être null ou vide
- @URL(protocol=, host=, port=) : doit être une URL
- @Range(min=, max=) : doit avoir une valeur comprise entre Min et Max
Intégration JSF
JSF 2 intègre par défaut la validation des beans (JSR 303)
http://www.mastertheboss.com/web-interfaces/293-jsf-validation-tutorial.html?start=2
Dès lors, les pages JSF n'ont plus besoin de contenir les information de validation du bean. Lorsque une validation de contrainte échoue, les messages d'erreur associés sont automatiquement traduits en FacesMessage par l'implementation JSF.
...
| Bloc de code |
|---|
<h:inputText value="#{sampleBean.userName}">
<f:validateBean disabled="true" />
</h:inputText>
|
Mise à jour de propriétés par les formulaires (updateActionlistener)
updateActionListener est une balise de la librairie JSF Tomahawk qui est particulièrement utile. C'est un listener qui est associé à une balise permettant une action (bouton, lien) qui, au moment où ce dernier est activé, va lire le contenu de son attribut value pour l'assigner à la référence contenue dans son attribut property.On utilisera par exemple :
...
| Remarque | ||
|---|---|---|
| ||
|
Conversion des types complexes
Il existe des convertisseurs par défaut dans JSF (DateTimeConverter et NumberConverter). Ils permettent de transformer une date ou un nombre suivant différentes règles, par exemple :
...
La classe LocaleConverter implémente l'interface Converter de JSF.
JSF et accessibilité
Un des objectifs de l'utilisation de JSF est, via un standard de haut niveau, de tendre vers plus d'accessibilité (WAI : Web Accessibility Initiative). L'accessibilité des applications doit être une préoccupation constante des programmeurs, qui ne doivent pas hésiter à tester leurs applications en utilisant des navigateurs pauvres tels que Lynx. En règle générale, on évitera absolument d'utiliser les balises h:commandLink qui, à cause de l'utilisation de Javascript, brisent toutes les règles de l'accessibilité. On préfèrera dans tous les cas des boutons (h:commandButton). Javascript peut néanmoins être utilisé pour améliorer l'IHM des applications, en faisant attention à ce que les navigateurs ne parlant pas Javascript puissent quand même utiliser l'application. Nous montrons ici à titre d'exemple comment on peut soumettre un formulaire par simple changement de la valeur d'une boite déroulante :
...