Canalblog Tous les blogs Top blogs Technologie & Science Tous les blogs Technologie & Science
Suivre ce blog Administration + Créer mon blog
MENU

Allez toujours plus loin avec les Xpages

Publicité
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é
27 août 2010

Installer un decompiler Java dans l'environnement de travail Domino

Domino Designer est aujourd'hui une extension d'Eclipse. Si certain se plaignent de la lourdeur que cela engendre, il y a aussi quelques avantages. Le premier est la possibilité d'ajouter des "plugins" qui peuvent etre de nouvelles perspectives ou bien, comme ici une nouvelle fonctionnalité.
Tout d'abord nous devons "débrider" domino qui par défaut ne permet pas d'ajouter ces plugins. Pour cela il suffit d'aller dans le menu File/Preferences dans la partie Domino Designer/General, il suffit de cocher la case "Enable Eclipse plug-in install" :

enableInstall


























Une fois cette opération effectué (redémarrer le designer), nous pouvons nous attaquer à notre soucis: installer le decompiler. J'utilise JD-Eclipse (http://java.decompiler.free.fr), la procédure d'installation est indiqué pour un Eclipse standard. Pour Domino designer, cela change un tout petit peu, Il faut en effet aller dans le  menu File/Application install pour obtenir l'ecran de mise à jour. Ensuite c'est la procédure pour Eclipse 3.5 qui est a suivre:
Search for new features to install
Add remote location
Mettre l'url de JD-Eclipse (http://java.decompiler.free.fr/jd-eclipse/update)
Ensuite c'est du Ok/next...

19 août 2010

Managed Bean - Des limitations ou un bug !?

Il y a des jours ou rien ne marche comme l'on veut. En me basant sur l'excellent article de Mindoo Blog sur la gestion des managed bean, j'etait en train de creer mon petit environnement mvc. Etant un peu faineant sur les bords, j'ai creer une classe heritant de ArrayList. Mal m'en as pris. J'ai passé des heures à chercher pourquoi cela ne marchait pas. A chaque fois que j'appeler mon Bean, j'obtenais le message d'erreur suivant:

javax.faces.el.ReferenceSyntaxException: L'opérateur "." a été fourni avec une valeur d'index de type "java.lang.String" à appliquer à une liste ou un tableau, mais cette valeur ne peut être convertie en un nombre entier.

L'opérateur "." a été fourni avec une valeur d'index de type "java.lang.String" à appliquer à une liste ou un tableau, mais cette valeur ne peut être convertie en un nombre entier.


L'origine de ce problème vient d'une ou plusieurs méthodes dans l'interface List, je n'ai pas pris le temps de toutes les tester, mais en supprimant l'heritage et l'implémentation de cette interface, le problème est résolu.

18 août 2010

Expression language vs SSJS (Server side Javascript)

J'ajouterais au fil du temps les differentes informations pertinentes que j'aurais tester sur l'utilisation de ces deux technologies afin de savoir laquelle utilisée en fonction de son contexte.

1- Initialisation des managed bean
Pour acceder a nos managed bean nous disposons de deux possiblitées:
Le javascript
L'expression Language
Pour l'initalisation, l'avantage reviens aux EL qui instancie automatiquement le Bean. Dans le cas de Javascript, si le bean n'est pas initialisé au prealable, vous obtenez une erreur 500.
A moins d'avoir prevue une application avec un controleur qui initialise vos beans à l'ouverture de session, utilisez SSJS est donc risqué pour l'acces aux Bean.


Publicité
Allez toujours plus loin avec les Xpages
Publicité
Publicité