IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

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.

SommaireExtension (4)
précédent sommaire suivant
 

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")); 
	} 
}
Il faut ensuite déclarer ce validator dans faces-config.xml :

Code xml : Sélectionner tout
1
2
3
4
<validator>		 
	<validator-id>personValidator</validator-id> 
	<validator-class>validators.PersonValidator</validator-class> 
</validator>
Et enfin, pour utiliser le validator dans les pages JSF, on procède comme suit :

Code xml : Sélectionner tout
1
2
3
<h:inputText value="#{control.name}" id="name"> 
	<f:validator validatorId="personValidator" /> 
</h:inputText>
À chaque fois qu'on remplit un champ texte et qu'on valide, JSF va invoquer la méthode validate de notre Validator en lui passant les paramètres suivants :

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

Mis à jour le 12 février 2008 djo.mos

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")); 
}
Plus besoin alors de déclarer le validator dans faces-config.xml.

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}" />

Mis à jour le 12 février 2008 djo.mos

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.
Il faut ensuite déclarer ce converter dans faces-config.xml en lui associant un identifiant :

Code xml : Sélectionner tout
1
2
3
4
<converter> 
		<converter-id>personConverter</converter-id> 
		<converter-class>converters.PersonConverter</converter-class> 
	</converter>
Et enfin, pour utiliser le validator dans les pages JSF, on procède comme suit :

Code xml : Sélectionner tout
1
2
3
<h:outputText value="#{control.person}"> 
	<f:converter converterId="personConverter" /> 
</h:outputText>
Alternativement, on peut spécifier lors de la définition d'un converter dans faces-config.xml à quel type ce converter s'applique. Dans ce cas, plus besoin d'indiquer explicitement le converter à utiliser dans un composant : JSF invoquera automatiquement le conveter adapté :

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>
Et dans la page :

Code xml : Sélectionner tout
<h:outputText value="#{control.person}">
À chaque fois qu'on essaie d'afficher une instance de Person, JSF va invoquer la méthode getAsString de notre Validator en lui passant les paramètres suivants :

  • context : permet d'accéder à l'environnement JSF ;
  • component : le composant parent de notre validator ;
  • value : l'instance de Person à afficher.

Mis à jour le 12 février 2008 djo.mos Sniper37

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.

Mis à jour le 12 février 2008 djo.mos

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


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2022 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.