Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
Allez toujours plus loin avec les Xpages
14 septembre 2010

Créer un validateur personnaliser

Avec les Xpages sont introduit le concept de validateur. Auparavant nous disposions de l'evenement inputValidation qui nous permettait lors de la soumission d'un document d'en vérifier la conformité champ par champ. Le principal grief que l'on pouvait avoir est la répetitivité de cette tache.  Ainsi si nous avons 15 champs avec la meme validation, nous devons copier/coller 15 fois ce même code. Ce n'est pas forcement compliqué mais il faut avouer qu'il y a des choses plus passionnante a faire...
Je vous propose donc de découvrir la nouvelle interface de validation introduite avec les xpages.
Tout d'abord il faut savoir que dorénavent il existe deux types de validation:

  • La validation coté client en javascript
  • La validation coté serveur en java

Je ne fait jamais confiance au client, pour diverse raison la principale etant que je ne maitrise pas son environnement. Je n'aborderais donc pas la validation coté client.
1-Préparation
Première chose a faire: Désactivé la validation client, pour cela il faut se rendre dans les propriétés de l'application et dans la partie Client Validation mettre "off":
ScreenHunter_02_Sep



Maintenant nous allons nous attaquer à la création d'un validateur pour les nombres. Les xpages n'offre en effet pas la possibilité de tester le format d'un nombre (enfin si avec les expressions régulière mais bon en va faire comme si, sinon y'as plus besoin du tuto ;-).

Ensuite il faut basculer de perspective pour ouvrir la perspective java

 ScreenHunter_03_Sep





ScreenHunter_04_Sep

Il va falloir maintenant inclure dans la base domino un nouveau repertoire dans lequel nous inclurons notre source java. Dans un premier temps nous allons creer un repertoire src (ou ce que vous voulez) dans  le répertoire WebContent/WEB-INF, pour cela un simple clic droit sur le repertoire en question et ensuite c'est pas plus compliqué que de creer un repertoire sous windows:
ScreenHunter_05_Sep







Ensuite il faut preciser au designer que nous souhaitons utiliser ce repertoire pour stocker notre source java. Pour cela il faut aller dans les propriétés de la base NSF, Dans la partie "Java build path" onglet source, nous cliquons sur ajouter répertoire et on le sélectionne dans l'arborescence:
ScreenHunter_06_Sep









2-Code JAVA

Nous allons pouvoir entrer dans le vif du sujet, à savoir créer notre classe ! Enfin...
Ce coups ci on se positionne dans le repertoire en haut qui vient d'etre creer par le designer et on clique nouvelle classe.
Premiere chose, verifier que le "source folder" pointe bien sur le repertoire que vous venez de créer. Si vous mettez votre source dans le répertoire par défaut (local), vous perdrez tout votre travail à  la première modification des xpages.
Il faut ensuite prendre pour habitude d'organiser ces classes dans les packages. Donc n'hesitez pas à mettre des noms explicite a votre package et a votre classe. Les developpeurs qui prendront votre suite vous en remercie d'avance ;-)
Enfin vous remarquerez que ma classe implemente l'interface "Validator",  c'est le plus important !
ScreenHunter_07_Sep









Voila donc le code généré :

package com.xpages.validateurs;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

public class NombreValidateur implements Validator {

   

public void validate(FacesContext arg0, UIComponent arg1, Object arg2)
            throws ValidatorException {
        // TODO Auto-generated method stub

    }

}

Il va falloir donc faire nos différents test dans cette méthode. En cas d'erreur il faudra generer une exception de type validatorException.

Dans notre cas nous souhaitons savoir si nous avons à faire à un nombre, nous allons creer une nouvelle méthode isNumber(Object value):

   

private boolean isNumber(Object value) {

           try {

                    new Long(value);

                    return true;

           } catch (Exception e) {

                   return false;

           }

    }

Il ne reste plus qu'a tester cette methode dans notre validate:

    public void validate(FacesContext context, UIComponent component, Object value)
            throws ValidatorException {

       if( ! isNumber((String) value))
            throw new ValidatorException(new FacesMessage("Erreur de format, ce champ doit etre numérique"));
    }

3-Exposition de notre validateur

Avant de pouvoir utiliser le validateur depuis les xpages, il va falloir "l'exposer". Pour cela il faut modifier le fichier WebContent/WEB-INF/faces-config.xml et ajouter le paragraphe suivant:

  [validator]
    [validator-id]NombreValidateur[/validator-id]
    [validator-class]net.icao.core.NombreValidateur[/validator-class]
  [/validator]

 

L'id du validateur peut correspondre au nom de votre classe mais ce n'est pas obligatoire.

4-Consommation de notre validateur

Nous pouvons maintenant changé de perspective et retourner dans la perspective domino (window/open perspective/other...)

Dans une xpage dans laquelle nous aurions au prealable ajouter un champ de type texte (j'y reviendrait plus tard), j'accole un composant "Error message", je n'oublie pas de donner comme source a mon message mon champ.

ScreenHunter_08_Sep

Enfin j'utilise mon validateur en l'ajoutant dans les validateurs

ScreenHunter_09_Sep





Au final, je devrait obtenir le code suivant (onglet source)

[xp:inputText id="ope_cp" value="#{dominoDocument.ope_cp}" maxlength="5"]
     [xp:this.validators]
          [xp:validator validatorId="monvalidateur" /]
     [/xp:this.validators]
[/xp:inputText]
[xp:message id="message2" for="ope_cp" styleClass="lotusMessage"/]

Voila votre validateur fonctionne meme si dans notre cas il ne sert a pas grand chose.

5-Mais pourquoi j'ai creer un champ de type texte si je veu valider un nombre???

Question légitime. En fait le cycle de vie de JSF effectue la conversion avant la validation. Dans notre cas, si nous mettons que c'est un nombre et bien JSF genere une erreur lors de la conversion et nous n'effectuons jamais la validation. C'est pour ça que je disait que ce validateur ne sert a rien en fait ^^. Par contre la démarche est bonne si vous avez un validateur metier à mettre en place. Dans une prochaine note j'expliquerai comment creer un converter (l'equivalent de input translate de domino).

 

Publicité
Publicité
Commentaires
P
Salut le blog !<br /> Félicitation pour le site et vos articles.<br /> C'est un véritable bonheur de venir vous lire régulièrement.<br /> Féliciations :-)
Allez toujours plus loin avec les Xpages
Publicité
Publicité