Voir Creating a Custom Validator dans le JEE5 Tutorial. La section Creating a Custom Tag détaille comment implémenter votre classe ValidatorELTag
.
for="myControl"
Je doute que vous aurez besoin de cet attribut (je ne sais pas comment vous en faire usage). Le validateur sera défini sur le contrôle parent. Les attributs for
sont généralement utilisés uniquement lorsqu'un contrôle fait référence à un autre, comme dans le composant d'étiquette.
EDIT: J'ai mal interprété la question; la réponse ci-dessus s'applique aux JSP (ces classes liées au tag dans JSF 1.2 sont pour JSP uniquement; Facelets a son propre système de balises, la bonne nouvelle est que vous n'avez pas besoin d'une classe Java spécifiquement pour définir la balise).
Exemple validateur:
public class RegexValidator implements Validator, StateHolder {
private boolean isTransient;
private String regex;
public String getRegex() { return regex; }
public void setRegex(String regex) { this.regex = regex; }
public void validate(FacesContext context, UIComponent component, Object value)
throws ValidatorException {
//TODO: throw ValidatorException if not valid
}
//TODO: implement remaining StateHolder methods...
}
Ce validateur est alors enregistré dans le faces-config.xml
:
<validator>
<validator-id>regex.validator</validator-id>
<validator-class>val.RegexValidator</validator-class>
</validator>
Vous pouvez ensuite add a tag library à l'application (par exemple WEB-INF/facelets/foo.taglib.xml
):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet">
<namespace>http://demo</namespace>
<tag>
<tag-name>regexValidator</tag-name>
<validator>
<validator-id>regex.validator</validator-id>
</validator>
</tag>
</facelet-taglib>
Ajouter un xmlns:demo="http://demo"
déclaration à tout Vues Facelets que vous souhaitez utiliser dans la bibliothèque de balises; votre tag de validation commencera sous la forme <demo:regexValidator ...
; les attributs seront récupérés grâce à l'introspection de la classe validator.
Il ne trouve pas
En outre, pourquoi implémentez-vous StateHolder? –
L'erreur est une erreur d'analyse XML - le préfixe d'espace de noms 'demo' est défini en ajoutant le' xmlns: demo = "" 'où' 'correspond à l'espace de noms de la bibliothèque de balises.En ce qui concerne 'StateHolder', les composants de la vue (et leurs attributs) ne peuvent pas être conservés en RAM entre les requêtes, les valeurs de propriété doivent donc être sauvegardées via' StateManager' - dans le code de démonstration, la valeur de regex devrait être sauvé ou il serait 'null' quand la vue a été restaurée quand le formulaire a été soumis; il ne sera pas redéfini à partir de la définition XML. –
McDowell