2009-10-12 4 views
2

Je passais en revue le suivant link et a découvert que javax.faces.webapp.ValidatorTag est obsolète et remplacé par ValidatorELTag, mais je ne trouve pas de bonnes informations à ce sujet.Création de vos propres validateurs dans JSF 1.2 avec Facelets 1.1.12

Je souhaite créer un validateur d'expressions régulières qui accepte les entrées: regex et message d'erreur.

Signification Je voudrais avoir un contrôle comme celui-ci:

<regexValidator for="myControl" check="([a-Z]^)" errorMessage="Your input contained incorrect characters" /> 

Maintenant, le lien donné ci-dessus montre comment faire une petite partie de cela, mais beaucoup a changé depuis qui a été écrit et les méthodes sont déconseillé, comment puis-je aborder ce problème?

Répondre

3

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.

+0

Il ne trouve pas

+0

En outre, pourquoi implémentez-vous StateHolder? –

+0

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

0

Voici le morceau que j'oublié d'ajouter à mon code qui me fait trébucher ...

<context-param> 
    <param-name>facelets.LIBRARIES</param-name> 
    <param-value>/WEB-INF/faces/foo.taglib.xml</param-value> 
</context-param> 

Vous aussi changer check="([a-Z]^)"-regex="..."

J'aime cette approche parce qu'il n'y a pas besoin pour étendre ValidatorELTag. Je suis un très grand fan des facelets et c'est une fonctionnalité encore plus cool.

Questions connexes