FAQ JSFConsultez toutes les FAQ
Nombre d'auteurs : 8, nombre de questions : 70, dernière mise à jour : 10 juin 2008 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci.
La création d'un validator personnalisé passe par les étapes suivantes :
- créer une classe qui implémente l'interface javax.faces.validator.Validator ;
- déclarer cette classe dans faces-config.xml en lui associant un identifiant.
Par exemple, on souhaite saisir le nom, le prénom et l'âge d'une personne dans un seul champ texte avec le format « prénom nom âge », et on va créer un validator qui valide une saisie :
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | public class PersonValidator implements Validator { private Pattern p = Pattern.compile("[a-zA-Z]+\\s+[a-zA-Z]+\\s+[0-9]+"); public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { Matcher m = p.matcher((String) value); if (!m.matches()) throw new ValidatorException(new FacesMessage( FacesMessage.SEVERITY_ERROR, "Entrée non valide", "Entrée non valide")); } } |
Code xml : | Sélectionner tout |
1 2 3 4 | <validator> <validator-id>personValidator</validator-id> <validator-class>validators.PersonValidator</validator-class> </validator> |
Code xml : | Sélectionner tout |
1 2 3 | <h:inputText value="#{control.name}" id="name"> <f:validator validatorId="personValidator" /> </h:inputText> |
- context: permet d'accéder à l'environnement JSF ;
- component: le composant parent de notre validator ;
- value: la valeur saisie par l'utilisateur.
Si l'entrée n'est pas valide, il faut lancer une exception du type ValidatorException qui prend un message comme paramètre.
Un message est composé de :
- gravité : l'une des valeurs suivantes : SEVERITY_FATAL, SEVERITY_ERROR, SEVERITY_WARN et SEVERITY_INFO ;
- sommaire : version courte du message d'erreur ;
- détail : version détaillée du message d'erreur.
JSF offre une méthode plus simple pour créer des validators personnalisés et ce, en acceptant une méthode de validation dans un managed bean.
Par exemple, si on veut refaire le validator présenté dans la question précédente, il suffit de déclarer la méthode validate (avec la même signature) dans son managed bean au lieu d'une classe séparée :
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | public void validatePerson(FacesContext context, UIComponent component, Object value) throws ValidatorException { Pattern p = Pattern.compile("[a-zA-Z]+\\s+[a-zA-Z]+\\s+[0-9]+"); Matcher m = p.matcher((String) value); if (!m.matches()) throw new ValidatorException(new FacesMessage( FacesMessage.SEVERITY_ERROR, "Entrée non valide", "Entrée non valide")); } |
Pour utiliser ce validator dans les pages JSF, on passe le nom de la méthode de validation comme valeur de l'attribut validator du composant à valider :
Code xml : | Sélectionner tout |
1 2 | <h:inputText value="#{control.name}" id="name" validator="#{control.validatePerson}" /> |
La création d'un converter personnalisé passe par les étapes suivantes :
- créer une classe qui implémente l'interface javax.faces.convert.Converter ;
- déclarer cette classe dans faces-config.xml en lui associant un identifiant.
Par exemple, on souhaite afficher une classe Person contenant trois champs (firstName, lastName et age) via un seul appel au composant <h:outpoutText />, avec le format "prénom nom âge", on crée un converter :
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class PersonConverter implements Converter { public Object getAsObject(FacesContext context, UIComponent component, String value) { return null; } public String getAsString(FacesContext context, UIComponent component, Object value) { Person person = (Person) value; return person.getFirstName() + " " + person.getLastName() + " " + person.getAge(); } } |
Notez que dans ce cas précis de figure, on s'est contenté d'implémenter la méthode getAsString vu qu'on souhaite seulement afficher une personne. Si on souhaite transformer la valeur d'un champ texte en une instance de Person, il faut alors implémenter la méthode getAsObject qui effectue le traitement inverse. |
Code xml : | Sélectionner tout |
1 2 3 4 | <converter> <converter-id>personConverter</converter-id> <converter-class>converters.PersonConverter</converter-class> </converter> |
Code xml : | Sélectionner tout |
1 2 3 | <h:outputText value="#{control.person}"> <f:converter converterId="personConverter" /> </h:outputText> |
Dans faces-config.xml :
Code xml : | Sélectionner tout |
1 2 3 4 | <converter> <converter-for-class>model.Person</converter-for-class> <converter-class>converters.PersonConverter</converter-class> </converter> |
Code xml : | Sélectionner tout |
<h:outputText value="#{control.person}">
- context : permet d'accéder à l'environnement JSF ;
- component : le composant parent de notre validator ;
- value : l'instance de Person à afficher.
Il est possible de spécifier le converter à utiliser dans un composant en utilisant l'attribut converter qui doit pointer vers une instance implémentant javax.faces.convert.Converter.
Code xml : | Sélectionner tout |
<h:outputText value="#{control.person}" converter="#{control.personConverter}">
L'avantage avec cette méthode est que le converter utilisé peut être modifié dynamiquement. |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.