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

Struts 2 Java Discussion :

Saisie de date et validation


Sujet :

Struts 2 Java

  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Par défaut Saisie de date et validation
    Bonjour,

    je cherche à faire entrer une date par l'utilisateur dans ma jsp dans un textfield

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <label for="dateDemande">Date de la demande:</label>
    <input type="text" id="dateDemande" name="rechercheDemande.dateDemande" />
    Je souhaite ensuite valider cette date dans mon fichier DemandeAction-validation.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	<field name="rechercheDemande.dateDemande">
    		<field-validator type="date">
    			<param name="min">01/01/1990</param> 
            	<param name="max">01/01/2010</param>
            	<message>Mauvaise date</message>
    		</field-validator>
    </field>
    mais n'y arrive pas. Si l'utilisateur entre "toto" dans le textfield ça plante avec l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Unexpected Exception caught setting 'rechercheDemande.dateDemande' on 
    'class DemandeAction: Error setting 
    expression 'rechercheDemande.dateDemande' 
    with value '[Ljava.lang.String;@a6dbf3'
    J'ai trouvé sur ce forum dans la section struts1 la solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <var><var-name>datePatternStrict</var-name><var-value>dd/MM/yyyy</var-value></var>
    mais cette solution ne marche pas avec Struts2, la dtd de validation.xml ne reconnaît pas <var>.

    Savez-vous comment faire ?

    Autre question : j'ai vu la balise struts2 datepicker mais je ne peux pas utiliser Ajax, peut-on utiliser cette balise sans Ajax ? Si oui comment ?

    Merci d'avance pour vos réponses.

    Marc

  2. #2
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 60
    Par défaut
    Citation Envoyé par Cram_N7 Voir le message
    Bonjour,

    je cherche à faire entrer une date par l'utilisateur dans ma jsp dans un textfield

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <label for="dateDemande">Date de la demande:</label>
    <input type="text" id="dateDemande" name="rechercheDemande.dateDemande" />
    Je souhaite ensuite valider cette date dans mon fichier DemandeAction-validation.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	<field name="rechercheDemande.dateDemande">
    		<field-validator type="date">
    			<param name="min">01/01/1990</param> 
            	<param name="max">01/01/2010</param>
            	<message>Mauvaise date</message>
    		</field-validator>
    </field>
    mais n'y arrive pas. Si l'utilisateur entre "toto" dans le textfield ça plante avec l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Unexpected Exception caught setting 'rechercheDemande.dateDemande' on 
    'class DemandeAction: Error setting 
    expression 'rechercheDemande.dateDemande' 
    with value '[Ljava.lang.String;@a6dbf3'
    J'ai trouvé sur ce forum dans la section struts1 la solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <var><var-name>datePatternStrict</var-name><var-value>dd/MM/yyyy</var-value></var>
    mais cette solution ne marche pas avec Struts2, la dtd de validation.xml ne reconnaît pas <var>.

    Savez-vous comment faire ?

    Autre question : j'ai vu la balise struts2 datepicker mais je ne peux pas utiliser Ajax, peut-on utiliser cette balise sans Ajax ? Si oui comment ?

    Merci d'avance pour vos réponses.

    Marc
    Tu vois l'exception dans les logs seulement ou est-ce ca fait planté ton application aussi ?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 716
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 716
    Par défaut
    Bonsoir

    j'ai teste ceci qui fonctionne

    <%@ page language="java" %>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <%@ taglib prefix="sx" uri="/struts-dojo-tags" %>



    <html>
    <head>
    <sx:head/>
    </head>

    <body>
    <sx:datetimepicker name="employe.joiningdate" label="Format (yyyy-MM-dd)" displayFormat="yyyy-MM-dd"/>

  4. #4
    Membre averti
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Par défaut
    Bonjour et merci pour vos réponses.

    @jreeman :
    Je vois cette exception dans les logs uniquement. L'application ne plante pas, mais la validation n'est pas faite et on est redirigé vers la page "success" et non vers "input". Le champ rechercheDemande.dateDemande est vide.
    En revanche la validation marche si on entre une date correcte, en dehors de la fourchette min/max.

    @pcouas :
    Oui j'avais vu ce tag déjà mais il est dans la librairie "Ajax Tags" de Struts et je ne peux pas utiliser Ajax pour mon application, malheureusement

  5. #5
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 60
    Par défaut
    Citation Envoyé par Cram_N7 Voir le message
    Bonjour et merci pour vos réponses.

    @jreeman :
    Je vois cette exception dans les logs uniquement. L'application ne plante pas, mais la validation n'est pas faite et on est redirigé vers la page "success" et non vers "input". Le champ rechercheDemande.dateDemande est vide.
    En revanche la validation marche si on entre une date correcte, en dehors de la fourchette min/max.
    C'est bien ce que je pensais, si ton format de date n'est pas correct alors STRUTS va essayer d'apeller la méthode get ayant un string pour paramétre (au lieu de date) dans la signature de la méthode et comme cette méthode n'existe pas, quelque part dans le code spaggethi de struts, struts log cette exception dans les traces.

    Pourquoi fait-il cela ? Je dirais que de manière général STRUTS essaye d'être intelligent, alors il fait un peu tout ce pour quoi on pourrait lui demander d'être intelligent. Pour moi c'est clairement pas comme cela que je conçois un framework, à force d'être prévu pour faire tout et n'importe quoi, rien n'est plus simple et propre.

    Rien à voir, mais il y a aussi un bug sur les locales, struts ne convertit pas correctement ta string en date en fonction de la locale de la requete cliente http://jira.opensymphony.com/browse/XW-670 (6 mois pour corriger un pauvre bug, ca cache quand même que le code ne doit pas être simple...).

    Tu dis que la validation marche pour la fourchette mais pas pour le format de la date ? Bizarre jamais rencontré ce problème. Mais moi je fais les validations dans les validate, j'ai passé l'age de ces .... d'ailleurs je pense que tu n'arriveras jamais à gérer correctement les dates dans struts dans la version actuelle. Je te laisse regardé ce post : http://www.developpez.net/forums/d77...-correctement/

  6. #6
    Membre averti
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Par défaut
    en effet jreeman j'ai finalement opté pour le validate de cette manière, le champ du formulaire s'appelle maintenant dateFormulaire et écrit dans une String de l'action, qui essaye ensuite d'en faire une date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public void validateResultatRechercheDemande() {
    	if (((dateFormulaire)!=null)&&(!"".equals(dateFormulaire))){
    		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    		try {
    			Date date = sdf.parse(dateFormulaire);
    			rechercheDemande.setDateDemande(date);
    		}
    		catch (ParseException pe) {
    			addActionError("Veuillez entrer une date au bon format");
    		}
    	}
    }
    Je suis aussi déçu que le xml ne puisse pas (à ma connaissance) gérer cela.

    Merci pour ton aide, je mets un TAG résolu même si je reste sur ma faim

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Par défaut
    Salut,
    si tu veux pouvoir déclarer une Date dans ton action, il faut que tu crées un Converter pour expliquer comment transformer ta String en Date, et vice-versa.
    J'ai rencontré le problème suivant : si la date entrée est incorrecte, le Converter retournait null. Il était alors impossible niveau validation de savoir si l'utilisateur n'avait pas entré la date, ou bien entré une date incorrecte. J'ai résolu le problème en créant une classe ValidationDate qui contient une Date, et un booléen valid.
    Mon converter crée une ValidationDate en passant en paramètre la String entrée par l'utilisateur. Si celle-ci est valide, le ValidationDate crée une date et passe valid à true, sinon il passe valid à false. J'ai ensuite défini un validateur qui se contente de tester date.isValid(). Dans mon action, là où j'ai besoin d'utiliser la date, je fais myValidationDate.getDate().
    Ca m'a aussi permis, accessoirement, de stocker dans la ValidationDate la String entrée par l'utilisateur, de manière à pouvoir l'afficher dans une jsp en cas d'erreur.
    Je sais pas si j'ai été clair, n'hésite pas à me poser des questions

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Par défaut
    Perso je n'en ai pas eu besoin, mais ensuite rien ne t'empêche de créer un Validator qui va vérifier que la date est comprise entre 2 bornes.

  9. #9
    Membre averti
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Par défaut
    non c'est assez clair comme tu l'expliques, au final ça ressemble pas mal à ce que j'ai fait. Récupérer une String, essayer d'en faire une date et invalider le submit si on échoue.

    L'idée du Converter est bonne aussi !

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Par défaut
    En effet c'est assez ressemblant. La différence est que ça utilise un peu mieux les briques fournies par struts :
    - la conversion string <-> date se fait dans un converter et non dans ton action
    - la validation se fait via un validateur, qui est déclaré dans un xml de validation, au lieu d'avoir lieu dans ton action encore une fois

    La seule petite chose qui reste pas très jolie est d'avoir une ValidationDate dans l'action, et non pas une Date tout court. Je l'ai fait pour deux raisons :
    - j'y place en fait le type d'erreur (erreur de syntaxe != erreur de validité, genre 29/02 qui n'existe pas tous les ans)
    - je veux réafficher dans mon formulaire la valeur (fausse) entrée par l'utilisateur.

    Si tu n'as besoin ni de l'un ni de l'autre, tu peux directement déclarer une Date dans ton action. Il faudra simplement veiller à ce qu'en cas d'erreur de conversion, ton converter ne retourne pas "null" (sinon struts essayera d'appeler setDate(String)), mais une "IllegalDate" qui est une classe que tu crées et qui hérite de Date. Reste à ton validateur à tester 'date instanceof IllegalDate' pour renvoyer true ou false.

    Ouais, bon, j'avoue, c'est de la bidouille, mais ça marche et c'est relativement propre quand même

  11. #11
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 60
    Par défaut
    Citation Envoyé par brassouille Voir le message
    - la validation se fait via un validateur, qui est déclaré dans un xml de validation, au lieu d'avoir lieu dans ton action encore une fois
    Il me semble que c'est plutôt le converter interceptor qui remonte des erreurs sur le format des dates, je n'ai pas essayé avec un xml de validation mais avec des annotations mais à mon avis, c'est la même chose.


    Citation Envoyé par brassouille
    J'ai rencontré le problème suivant : si la date entrée est incorrecte, le Converter retournait null
    C'est pas grave car struts utilise pas la valeur retournée par le converter pour réafficher le champ dans la JSP lorsqu'il y a des erreurs. STRUTS gère correctement cela pour afficher les données saisies par l'utilisateur dans la requête.

    Citation Envoyé par brassouille Voir le message
    La seule petite chose qui reste pas très jolie est d'avoir une ValidationDate dans l'action, et non pas une Date tout court.
    Oui cet objet ou un mécanisme générique devrait être fourni, à mon sens dans STRUTS.


    Citation Envoyé par brassouille Voir le message
    - je veux réafficher dans mon formulaire la valeur (fausse) entrée par l'utilisateur.
    J'avais essayé et ca marchait par contre, je perdais le formattage que je voulais mettre sur la date dans le textfield (STRUTS utilise un format par défaut SimpleDateFormat.SHORT qq chose come ca je crois, qui n'est pas obligatoirement celui de ton application).

    Citation Envoyé par brassouille Voir le message
    - j'y place en fait le type d'erreur (erreur de syntaxe != erreur de validité, genre 29/02 qui n'existe pas tous les ans)
    C'est pas ton converter qui devrait faire cela ? (c'est à dire mettre la bonne erreur dans les field errors)

    Citation Envoyé par brassouille Voir le message
    Si tu n'as besoin ni de l'un ni de l'autre, tu peux directement déclarer une Date dans ton action.
    Afficher la valeur saisie erronée, fait quand même partie des pré requis en vue d'une utilisation un minimum pratique d'une application, il me semble. C'est d'ailleurs ce que STRUTS essaie de faire plus ou moins.

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

Discussions similaires

  1. validation saisie de date en fonction de la locale
    Par Watier_53 dans le forum Struts 1
    Réponses: 34
    Dernier message: 23/10/2008, 15h32
  2. [Composant] Composant de saisie de date
    Par seb_asm dans le forum Composants
    Réponses: 6
    Dernier message: 03/10/2005, 14h36
  3. Saisie des dates
    Par J-P-B dans le forum XMLRAD
    Réponses: 5
    Dernier message: 04/07/2003, 11h08
  4. Réponses: 3
    Dernier message: 19/03/2003, 15h19
  5. tester si une date est valide
    Par Andry dans le forum Langage
    Réponses: 5
    Dernier message: 17/09/2002, 11h54

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