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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

Validation d'un formulaire


Sujet :

JSF Java

  1. #1
    Membre actif
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Points : 270
    Points
    270
    Par défaut Validation d'un formulaire
    Bonjour,

    Je me tourne vers vous car il y a des choses qui m'échappent dans la validation d'un formulaire.

    Admettons que j'ai un formulaire avec 5 champs :
    - 2 inputText (montant travaux, montant honoraires)
    - 1 calendar (date de fin)
    - 1 selectBooleanCheckbox (est archivé)
    - 1 autocomplete (Lieu)
    - 1 bouton pour enregistrer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    <p:inputText id="montantTravaux" value="#{saisirMandatForm.montantTravaux}" size="50" maxlength="15" style="width:200px" 
    	disabled="#{saisirMandatForm.userLectureSeule}" immediate="true" />
     
    <p:inputText id="montantHono" value="#{saisirMandatForm.montantHonorairesFrais}" size="50" maxlength="15" style="width:200px" 
    	disabled="#{saisirMandatForm.userLectureSeule}" />
     
    <p:calendar id="dateFin" value="#{saisirMandatForm.dateFin}" size="25" label="fin" pattern="dd.MM.yyyy" mask="true" 
    	disabled="#{saisirMandatForm.userLectureSeule}" navigator="true" immediate="true" />
     
    <p:selectBooleanCheckbox itemLabel="Archivé" value="#{saisirMandatForm.archive}" 
    	disabled="#{saisirMandatForm.userLectureSeule}" immediate="true" />
     
    <p:autoComplete id="lieudomaine" value="#{saisirMandatForm.societeLieuDomaineComp}" completeMethod="#{saisirMandatForm.completeLieuxDomaines}"
    	var="lieu" itemLabel="#{lieu}" itemValue="#{lieu}" converter="SocieteLieuDomaineCompConverter" 
    	forceSelection="true" size="25" disabled="#{saisirMandatForm.userLectureSeule}" 
    	required="true" requiredMessage="#{msg['DonneesDeBase']} - #{msg['LieuDomaineDeCompetenceEstObligatoire']}"
    	validator="#{saisirMandatForm.validerSaisie}"
    	queryDelay="1000" >
    </p:autoComplete>
     
    <p:commandButton value="#{msg['Enregistrer']}" icon="ui-icon-check"
    	style="margin:15px" action="#{saisirMandatForm.enregistrerMandat}" rendered="#{not saisirMandatForm.userLectureSeule}" />
    J'aimerais pourvoir valider ce formulaire avant de l'enregistrer, en respectant ces tests :
    - Date de fin est obligatoire si "est archivé" est coché
    - Montant travaux est doit être entre 100.- et 10'000.- si Lieu correspond à l'objet XX

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public void validerSaisie(FacesContext context, UIComponent uiComponent, Object objet) {
    	if (getArchive() && getDateFin() == null) {
    		FacesMessage message = Messages.getMessage("LaDateDeFinEstObligatoire",
    			FacesMessage.SEVERITY_ERROR, null);
    		throw new ValidatorException(message);
    	}
     
    	if (getSocieteLieuDomaineComp().equals(XX)) {
    		if (getMontantTravaux() < 100 || getMontantTravaux() > 10000) {
    			FacesMessage message = Messages.getMessage("MontantTravauxHorsNormes",
    				FacesMessage.SEVERITY_ERROR, null);
    			throw new ValidatorException(message);
    		}
    	}
    }
    J'ai essayé toute sorte de chose, avec l'attribut validator="validerSaisie" sur les différents champs et onChange="submit();" .... mais des fois les données arrivent coté serveur, d'autres fois non.
    Faut-il mettre onChange="submit();" sur chacun des champs qui doivent être validés ? Y'a-t-il mieux à faire ?
    Sur quels champs faut-il mettre le validator="..." ?

    Bref, comment est-ce que je peux faire pour que la validation se fasse correctement ?

  2. #2
    Membre éclairé Avatar de Lorantus
    Homme Profil pro
    Consultant développeur indépendant / Java/VB/C(++)/ObjectPal
    Inscrit en
    Août 2007
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant développeur indépendant / Java/VB/C(++)/ObjectPal

    Informations forums :
    Inscription : Août 2007
    Messages : 599
    Points : 882
    Points
    882
    Par défaut
    Personnellement je ferai les choses suivantes : Pas de "immediate=true", car j'ai besoin de valider les champs.

    Ensuite, au choix,
    1/ Implémenter l'interface Validator pour les champs (mais pas simple dans votre cas)

    ou
    2/ (JSF 2.0)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <f:event listener="#{bean.validerSaisie}" type="postValidate" />
    J'ajouterai quand même des validator dans les champs de saisie afin que les dates, par exemple, ne soient pas l'an 0.

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Bon ben déjà, il faut enlever tes immediate="true" parce que le principe là est justement d'éviter la phase de validation

    Pour le contrôle, dans la mesure où tu as des dépendances entre plusieurs champs, j'opterais pour une validation du formulaire.
    Sinon, tu as la possibilité d'utiliser quelque chose comme ça sur tes champs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <p:inputText value="..." validator="unValidator">
       <p:ajax event="change" process="@this"/>
    </p:inputText>
    Pour les dépendances, tu peux récupérer le composant associé dans ton validator par son id si tu l'as spécifié...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre actif
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Points : 270
    Points
    270
    Par défaut
    Bonjour,

    Je me suis à nouveau penché sur mon problème de validation.

    J'ai utilisé l'interface javax.faces.validator.Validator pour valider mes champs mais j'ai dû créer autant de classe Validator que je n'ai de champs métier à valider.
    Il n'y a pas un moyen de valider le formulaire d'un seul coup car ça me parait un peu laborieux, non ? Après, je suis peut-être encore trop focalisé sur les comportements que l'on a avec une appli de bureau en swing

    Merci pour votre aide

  5. #5
    Membre éclairé Avatar de Lorantus
    Homme Profil pro
    Consultant développeur indépendant / Java/VB/C(++)/ObjectPal
    Inscrit en
    Août 2007
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant développeur indépendant / Java/VB/C(++)/ObjectPal

    Informations forums :
    Inscription : Août 2007
    Messages : 599
    Points : 882
    Points
    882
    Par défaut
    A priori, il y a autant de validateur de que type de champ: date, email, etc. Mais pas plus.

    Il existe déjà des validateurs qui permettent de contrôler les chaînes vides, les nombres 0 (zéro) ou les dates incorrectes.

    Il est exceptionnel d'avoir 1 objet validateur par champ.

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par doons Voir le message
    Il n'y a pas un moyen de valider le formulaire d'un seul coup car ça me parait un peu laborieux, non ?
    Si, bien sûr, tu peux valider ton formulaire en une fois, tu peux regarder ici les différentes solutions possibles.
    A priori, la plus simple serait celle-ci :
    Dans ton managedBean, tu ajoutes une méthode de ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public void validate(ComponentSystemEvent event) 
        {
            System.out.println("Validation");
        }
    et dans ta page, tu ajoutes dans ton formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <f:event listener="#{tonManager.validate}" type="postValidate"/>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre éclairé Avatar de Lorantus
    Homme Profil pro
    Consultant développeur indépendant / Java/VB/C(++)/ObjectPal
    Inscrit en
    Août 2007
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant développeur indépendant / Java/VB/C(++)/ObjectPal

    Informations forums :
    Inscription : Août 2007
    Messages : 599
    Points : 882
    Points
    882
    Par défaut
    Est-ce que je perds mon temps à répondre ? J'ai l'impression que mes réponses ne sont pas lu ????????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <f:event listener="#{tonManager.validate}" type="postValidate"/>

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Lorantus Voir le message
    Est-ce que je perds mon temps à répondre ? J'ai l'impression que mes réponses ne sont pas lu ????????
    Je ne sais pas, tu verras avec lui...

    Ceci dit, il est parfois judicieux de détailler un peu plus, surtout dans cet exemple puisqu'il faut encore avoir la bonne signature côté ManagedBean.
    L'effet "jeu de piste" est parfois pénible, surtout si on a affaire à des débutants...
    (je ne critique pas le principe, apprendre à rechercher par soi même est une excellente chose )
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre actif
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Points : 270
    Points
    270
    Par défaut
    @Lorantus : Non tu ne perds pas ton temps, c'est très appréciable que des gens prennent du temps à essayer d'aider ceux qui ont des problèmes et plus particulièrement les débutants ou ceux pour lesquels tout n'est pas évident. Je ne me permettrais donc pas d'ignorer certaines réponses.

    Je ne suis pas au point dans ce domaine et à la première vue j'ai pensé que ça s'appliquait à un champ et non pas au formulaire c'est pourquoi je suis parti sur le Validator (qui lui aussi s'applique à un champ .... j'en ai choisi un des 2).

    Maintenant je vois que c'est ce que j'ai besoin et je suis parti la-dessus. La précision de OButterlin m'a bien aidé pour la signature de la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void validate(ComponentSystemEvent event) 
        {
            System.out.println("Validation");
        }
    Par contre la récupération des valeurs des composants me pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private static final String CHAMP_ARCHIVE       = "archive";
    
    
    FacesContext fc = FacesContext.getCurrentInstance();
    
    UIComponent components = event.getComponent();
    
    // Est Archivé
    UIInput uiInputArchive = (UIInput) components.findComponent(CHAMP_ARCHIVE);
    boolean estArchive = uiInputArchive.getLocalValue() == null ? false : (Boolean) uiInputArchive.getLocalValue();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <p:selectBooleanCheckbox id="archive" itemLabel="#{msg['Archiv_eacute']}" value="#{saisirMandatForm.archive}" 
    	disabled="#{saisirMandatForm.userLectureSeule}" />
    uiInputArchive est null ou n'importe quel autre composant que j'essaie de récupérer. Pourtant c'est le même code que celui de l'exemple de mykong

    Vous avez une idée de quoi ça peut venir ?
    Encore merci pour votre aide

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Ce n'est pas le même code, tu passes par Primefaces.
    L'id des composants est dépendant des "conteneurs" au dessus. Dans le cas le plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <h:form id="form1">
       <h:outputLabel value="Un texte"/>
       <p:inputText id="champ1" value="..."/>
    </h:form>
    tu devras chercher "form1:champ1" et non pas "champ1" seulement.

    Si tu veux connaître l'id dans la page, tu fais click-droit sur la page dans ton navigateur -> Code source de la page et tu regardes l'id réel
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre actif
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Points : 270
    Points
    270
    Par défaut
    Ah oui ça marche mieux :-)

    Merci beaucoup à vous 2 pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 03/04/2006, 09h42
  2. Javascript : Empecher la validation d'un formulaire
    Par otb82 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 17/01/2006, 09h46
  3. Ouvrir une popup lors de la validation d'un formulaire
    Par pod1978 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 23/11/2005, 15h47
  4. Vérification de validation d'un formulaire
    Par tom06440 dans le forum Langage
    Réponses: 8
    Dernier message: 21/09/2005, 14h29
  5. Réponses: 11
    Dernier message: 16/09/2004, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo