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 :

Validateurs en comparant deux champs date


Sujet :

JSF Java

  1. #1
    mame06
    Invité(e)
    Par défaut Validateurs en comparant deux champs date
    Bonjour tout le monde. je travaille sur un projet e j2EE, jsf 1.2 et richfaces 3 et voici mon problème: j'ai un formulaire de saisie avec deux champs dates (dateDebut et dateFin). maintenant je cherche à valider la saisie en vérifiant que dateFin est bien supérieur à dateDebut et pour cela voilà ce que j'ai fait:
    ma page jsp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <h:panelGrid columns="3">
                                        <h:outputText value="Du  :" />
                                        <rich:calendar  id="dateDebut" required="true" requiredMessage="Champ vide"    value="#{controleMB.dateDebut}" 
                                                        datePattern="dd/MM/yyyy" >                                                               
                                        </rich:calendar>
                                        <rich:message for="dateDebut" />
                                        <h:outputText value="Au  :" />
                                        <rich:calendar  id="dateFin" required="true" requiredMessage="Champ vide" validator="#{ControleMB.validatordates}"
                                                        value="#{ControleMB.dateFin}" datePattern="dd/MM/yyyy" >
                                        </rich:calendar>
                                        <rich:message for="dateFin" />
                                        <h:commandButton  action="#{ControleMB.generation()}" value="Générer" style="font-size:13px"/>
                                    </h:panelGrid>
    et dans la manged Bean controleMB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void validatordates(FacesContext context, UIComponent component, Object object) throws ValidatorException {
            Date daten2 = (Date) object;        
            if ((dateDebut==null)||(dateDebut.after(daten2))) {
                    FacesMessage message = new FacesMessage("Dates incorrectes");                
                    message.setSeverity(FacesMessage.SEVERITY_ERROR);
                    throw new ValidatorException(message);
                }
     
        }
    sachant que dateDebut est la variable qui contient dateDebut de la page jsp. Quand je mets des dates incorrectes il écrit le message"dates incorrectes" mais après quand je mets des dates correctes il affiche toujours le même message. sauriez-vous d'où vient lle problème???? merci d'avance.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Par défaut
    Bonjour,
    as tu vérifié que dateDebut est bien affecté au moment de ta validation ?

    sinon, tu peux le récupérer de cette façon :
    Date dateDebut= (Date) component.getAttributes().get("dateDebut");

  3. #3
    mame06
    Invité(e)
    Par défaut
    Citation Envoyé par kox2ee Voir le message
    Bonjour,
    as tu vérifié que dateDebut est bien affecté au moment de ta validation ?

    sinon, tu peux le récupérer de cette façon :
    J'ai essayé ça mais tjrs le même problème. Merci quand même

  4. #4
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Par défaut
    Affiche dateDebut et daten2 dans le message pour savoir si les 2 dates sont correctement affectées

  5. #5
    mame06
    Invité(e)
    Par défaut
    @Kox2ee effectivement j'ai affiché sur la console et seule daten2 contient une valeur dateDebut et toujours nulle.

  6. #6
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Par défaut
    peut être avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UIInput dateDebutCal= (UIInput) context.getViewRoot().findComponent("dateDebut");
    Date dateDebut= (date) dateDebutCal.getSubmittedValue();

  7. #7
    mame06
    Invité(e)
    Par défaut
    Citation Envoyé par kox2ee Voir le message
    peut être avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UIInput dateDebutCal= (UIInput) context.getViewRoot().findComponent("dateDebut");
    Date dateDebut= (date) dateDebutCal.getSubmittedValue();
    j'ai fait ça et je me retrouve avec un java.lang.nullpointerexception au niveau du jsp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <rich:calendar  id="dateFin" required="true" requiredMessage="Champ vide" validator="#{ControleMB.validatordates}"
                                                        value="#{ControleMB.dateFin}" datePattern="dd/MM/yyyy" >
                                        </rich:calendar>

  8. #8
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Par défaut
    Bonjour,
    il semble qu'on ait du mal à localiser dateDebut

    on peut essayer comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UIInput dateDebutCal= (UIInput) component.getParent().findComponent("dateDebut");
    Date dateDebut= (date) dateDebutCal.getSubmittedValue();
    Une question, ton calendar est dans un formulaire ou pas ?
    s'il est dans un formulaire d'id formId, il faudrait faire :
    findComponent("formId:dateDebut")

  9. #9
    mame06
    Invité(e)
    Par défaut
    Citation Envoyé par kox2ee Voir le message
    Bonjour,
    il semble qu'on ait du mal à localiser dateDebut

    on peut essayer comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UIInput dateDebutCal= (UIInput) component.getParent().findComponent("dateDebut");
    Date dateDebut= (date) dateDebutCal.getSubmittedValue();
    Une question, ton calendar est dans un formulaire ou pas ?
    s'il est dans un formulaire d'id formId, il faudrait faire :

    oui il est dans un formulaire et j'ai fait la méthode avec formId maintenant il y'a une exception: java.lang.ClassCastException: java.lang.String connot be cast to java.util.Date

  10. #10
    mame06
    Invité(e)
    Par défaut
    ça c'est produit quand j'ai renseigné le champ dateFin et le champ dateDebut étant vide. y'aurait-il un moyen de vérifier le contenu de dateDebut avant de faire la conversion en date???

  11. #11
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Par défaut
    Dans ton Bean ControlMB, as-tu bien mis le type Date sur dateDebut ?

    Peux tu mettre le code complet du Bean ? merci

    Dans ta jsp, tu fais référence des fois à #{controleMB...} et d'autres fois à #{ControlMB...} avec majuscule, c'est bizarre

  12. #12
    mame06
    Invité(e)
    Par défaut
    voici le code complet du validateur:
    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
     private Date dateDebut;
        private Date dateFin;
     
        public void validatordates(FacesContext context, UIComponent component, Object object) throws ValidatorException {
            UIInput dateDebutUIInput = (UIInput) component.getParent().findComponent("formId:dateDebut");
            Date daten1 = (Date) dateDebutUIInput.getSubmittedValue();
            Date daten2 = (Date) object;
            System.out.println(daten1 + "    " + daten2);
            if (daten1 == null) {
                return;
            }
            if (daten1.after(daten2)) {
                FacesMessage message = new FacesMessage("Dates incorrectes");
                message.setSeverity(FacesMessage.SEVERITY_ERROR);
                throw new ValidatorException(message);
            }
        }
    il y'a bien sur les getters et setters des deux dates. Le managed Bean ControleMB est bien déclaré dansle faces-config et managed-bean-scope à request.
    voici le formulaire jsp complet:
    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
     
     
       <p> 
                            <h:form id="formId">
                                <rich:panel header="Fiche de contrôle "  style="width:60%">
                                    <h:panelGrid columns="3">
                                        <h:outputText value="Du  :" />
                                        <rich:calendar  id="dateDebut" required="true" requiredMessage="Champ vide"    value="#{ControleMB.dateDebut}" 
                                                        datePattern="dd/MM/yyyy" >                                                               
                                        </rich:calendar>
                                        <rich:message for="dateDebut" />
                                        <h:outputText value="Au  :" />
                                        <rich:calendar  id="dateFin" required="true" requiredMessage="Champ vide"  value="#{ControleMB.dateFin}" datePattern="dd/MM/yyyy"
                                                        validator="#{ControleMB.validatordates}">
                                        </rich:calendar>
                                        <rich:message for="dateFin" />
                                        <h:commandButton  action="#{ControleMB.genereration()}" value="Générer" style="font-size:13px"/>
                                    </h:panelGrid>
                                </rich:panel>
                            </h:form>
                        </p>
    et le managed Bean c ControleMB avec majuscule

  13. #13
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Par défaut
    Tu peux essayer en faisant une conversion de la date plus orthodoxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    Date daten1;
    UIInput dateDebutUIInput = (UIInput) component.getParent().findComponent("formId:dateDebut");
    try {
    	daten1= sdf.parse(dateDebutUIInput.getSubmittedValue());
    } catch (ParseException e) {
    	//A gérer
    }

  14. #14
    mame06
    Invité(e)
    Par défaut
    Ok je vais faire ça pour voir

  15. #15
    mame06
    Invité(e)
    Par défaut
    je pensais que la méthode parse() prenait en paramètre un string. Mais le problème c'est surtout quand dans le formulaire dateFin est renseigné(donc appel du validateur) et dateDebut non renseigné apparement l'attribut required="true" ne gère pas ça. Comment je peux vérifier que le champs dateDebut est renseigné dans ce cas.

  16. #16
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Par défaut
    Bonjour,
    oui, le parse prend bien un String, mais le getSubmittedValue a l'air d'en retourner un d'après ce que tu m'as dit :
    Citation Envoyé par mame06 Voir le message
    il y'a une exception: java.lang.ClassCastException: java.lang.String connot be cast to java.util.Date
    tu peux faire un test sur :
    dateDebutUIInput.getSubmittedValue()!=null

  17. #17
    mame06
    Invité(e)
    Par défaut
    Citation Envoyé par kox2ee Voir le message
    Bonjour,
    oui, le parse prend bien un String, mais le getSubmittedValue a l'air d'en retourner un d'après ce que tu m'as dit :


    tu peux faire un test sur :
    dateDebutUIInput.getSubmittedValue()!=null
    Ok je vais faire ça

  18. #18
    mame06
    Invité(e)
    Par défaut
    Voici ce que j'ai fait pour vérifier la valeur retournée avant de convertire:
    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
     
    public void validatordates(FacesContext context, UIComponent component, Object object) throws ValidatorException {
            UIInput dateDebutUIInput = (UIInput) component.getParent().findComponent("formId:dateDebut");
            Date daten1 = null;
            Date daten2 = (Date) object;
            if (dateDebutUIInput.getSubmittedValue() != null) {
                daten1 = (Date) (dateDebutUIInput.getSubmittedValue());
                 System.out.println(daten1 + "  " + daten2);
                if ((daten1.after(daten2))) {
                    FacesMessage message = new FacesMessage("Dates incorrectes");
                    message.setSeverity(FacesMessage.SEVERITY_ERROR);
                    throw new ValidatorException(message);
                }
            } else {
                System.out.println("  Valeur retournée nulle  ");
                System.out.println(daten1 + "  comparée à  " + daten2);
                FacesMessage message = new FacesMessage("Dates incorrectes");
                message.setSeverity(FacesMessage.SEVERITY_ERROR);
                throw new ValidatorException(message);
            }
        }


    mais même si je renseigne dateDebut dans le formulaire c'est ce code qui est exécuté:
    else {
    System.out.println(" Valeur retournée nulle ");
    System.out.println(daten1 + " comparée à " + daten2);
    FacesMessage message = new FacesMessage("Dates incorrectes");
    message.setSeverity(FacesMessage.SEVERITY_ERROR);
    throw new ValidatorException(message);
    }
    Ceci je pense que la récupération de dateDebut ne s'est bien faite
    Dernière modification par mame06 ; 14/02/2013 à 12h35.

  19. #19
    mame06
    Invité(e)
    Par défaut
    ne s'est pas bien faite

  20. #20
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Par défaut
    Je n'ai aucune confiance en cette ligne avec le form218400 :
    UIInput dateDebutUIInput = (UIInput) component.getParent().findComponent("form218400:dateDebut");
    Pourquoi ne nommes tu pas explicitement le formulaire en lui attribuant un id ?

    PS : tu peux éditer un de tes messages du forum pour le modifier (ou le supprimer) si tu as oublié des bouts de phrases dedans...

Discussions similaires

  1. comparer deux champs d un formulaire
    Par williams59 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/12/2007, 11h38
  2. Editeur de recherche - comparer deux champs
    Par sscouby dans le forum 4D
    Réponses: 1
    Dernier message: 17/10/2007, 12h08
  3. Comment réunir deux champs date?
    Par Sunsawe dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 20/07/2007, 10h57
  4. [SQL] un champ Timestamp ou deux champs Date et Heure?
    Par davmaster62 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 25/02/2006, 23h04
  5. comparer des champs date time
    Par HULK dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 25/01/2005, 14h02

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