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 1 Java Discussion :

<html:errors/> dans des <logic:iterate> [FAQ]


Sujet :

Struts 1 Java

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 949
    Points : 1 857
    Points
    1 857
    Par défaut <html:errors/> dans des <logic:iterate>
    Bonjour,

    J'ai un formulaire qui doit afficher une liste via <logic:iterate />, chaque ligne comportant un libellé et un champ texte à saisir. Le code suivant vous éclairera peut - être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <!-- Liste de champs dynamique -->
    <logic:iterate id="element" name="form" property="liste">
        <!-- Nom du champ -->
        <bean:write name="element" property="libelle" />
        :
        <!-- Champ input text -->
        <html:text name="element" property="champASaisir" />
        <br/>
    </logic:iterate>
    Ou chaque élément est un bean Java classique avec deux champs libelle et champASaisir :
    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
    24
     
    // Element de la liste de champs dynamique.
    class Element {
        // Nom du champ
        private String libelle;
        // Valeur du champ
        private String champASaisir;
     
        public String getLibelle() {
            return this.libelle;
        }
     
        public void setLibelle(String libelle) {
            this.libelle = libelle;
        }
     
        public String getChampASaisir() {
            return this.champASaisir;
        }
     
        public void setChampASaisir(String champASaisir) {
            this.champASaisir = champASaisir;
        }
    }
    Je voudrais savoir comment afficher, à chaque ligne, un message d'erreur en face de chaque champ erroné. La balise <html:errors/> permet d'afficher un message d'erreur, mais son attribut property ne me permet pas de préciser quelle ligne est concernée. Autrement dit, le code :
    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
     
    <!-- Liste de champs dynamique -->
    <logic:iterate id="element" name="form" property="liste">
        <!-- Nom du champ -->
        <bean:write name="element" property="libelle" />
        :
        <!-- Champ input text -->
        <html:text name="element" property="champASaisir" />
        &nbsp;
        <!-- Messages d erreur relatifs au champ input text de cette ligne -->
        <!-- Début code à faire -->
        <html:errors property="champASaisir" />
        <!-- Fin code à faire -->
        <br/>
    </logic:iterate>
    ... afficherait le même message d'erreur à chaque ligne, quel que soit le champ qui a provoqué l'erreur!
    Ce n'est pas non plus <html:errors name="element" property="champASaisir" />, car name doit pointer vers une liste d'erreur Struts, pas vers le bean qui contient le champ en question.

    Je dois probablement rater quelque chose d'évident. Quelqu'un sait-il comment faire?

    Merci d'avance.

  2. #2
    Expert éminent

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Dans la méthode validate de l'ActionForm, tu peux par exemple distinguer les messages d'erreurs en passant en paramètre de l'ActionMessage le libellé du champ à saisir et en ajoutant l'index de la ligne courante au nom de la propriété que tu passes en paramètre de la méthode add de l'objet ActionErrors.
    Pour que cela fonctionne, il faut aussi ajouter getter et setter indexé sur l'objet Element.

    Cela donnerait quelque chose du style :
    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
    public void setElement(int i,Element element)
    {
    	this.liste.set(i,element) ;
    }
    public Element getElement(int i)
    {
    	return (Element) this.liste.get(i);
    }
     
    public ActionErrors validate(ActionMapping mapping,HttpServletRequest request)
    {
    	ActionErrors errors = new ActionErrors() ;
    	for (int i=0 ; i < this.liste.size() ; i++)
    	{
               if ( this.getElement(i).getChampASaisir() == null || this.getElement(i).getChampASaisir().length() == 0  )
    	   {
    		ActionMessage message = new ActionMessage("errors.champASaisir",this.getElement(i).getLibelle());
    		errors.add("champASaisir"+i,message) ;
    	   }
    	}
    	return(errors) ;
    }
    dans le fichier properties :
    errors.champASaisir=Le champ {0} doit être renseigné.
    et dans la jsp, ajouter l'attribut indexed="true" dans le tag html:text, pour permettre la mise à jour du champ indexé, et aussi l'attribut indexId dans le tag logic:iterate, pour pouvoir indexer le nom de la propriété dans le tag html:errors, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <logic:iterate id="element" name="form" property="liste" indexId="index">
        <bean:write name="element" property="libelle" />
        :
        <html:text name="element" property="champASaisir" indexed="true"/>
        &nbsp;
        <html:errors property="champASaisir${index}" />
        <br/>
    </logic:iterate>
    Petite précision : l'EL ${index} utilisée dans le tag html:errors ne fonctionnera que si tu es en J2EE 1.4 ou plus.
    Sinon, il faut utiliser la tld struts-html-el.tld :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        <html-el:errors property="champASaisir${index}" />
    sans oublier d'ajouter au début de la jsp la directive taglib qui pointe sur cette tld.

    A tester.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 949
    Points : 1 857
    Points
    1 857
    Par défaut
    Merci, je vais tester tout ça. Ca ferait un bon article pour la FAQ je pense.

  4. #4
    Expert éminent

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Tout à fait d'accord.
    As-tu réussi à le mettre en oeuvre ?

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 949
    Points : 1 857
    Points
    1 857
    Par défaut
    Il faudra attendre pour le savoir : le mainframe sur lequel je dois me connecter est en panne, et ça n'a pas l'air de vouloir s'arranger. Mais je reviendrais vous dire si ça a marché.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 949
    Points : 1 857
    Points
    1 857
    Par défaut
    Eh bien, ça n'aura pris qu'un mois! (OK, j'aurai dû répondre il y a deux semaines...)

    Toujours est-il que ça a marché! Pour l'affichage des erreurs du moins.

    En revanche, il a fallut, pour l'accès à la liste des éléments, avoir à la fois la méthode getListe() et getElement(int index) ! La première sert à la création de la page via iterate, et la seconde à l'écriture de la saisie de l'utilisateur. Struts ne sait en effet pas faire la correspondance tout seul à moins d'utiliser html-el.

  7. #7
    Expert éminent

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Il est vrai que je n'avais pas mis le getter et setter sur liste dans le code que j'avais posté mais ça tombait sous le sens étant donné que dans le logic:iterate, on fait référence à la propriété liste de l'ActionForm.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <logic:iterate id="element" name="form" property="liste" indexId="index">
    Quand on définit une propriété dans l'ActionForm, on doit également coder getter et setter sur cette propriété.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/02/2010, 19h55
  2. [HTML:ERROR] affichage dans une popup dédiée
    Par jdvacheron dans le forum Struts 1
    Réponses: 4
    Dernier message: 12/02/2008, 12h17
  3. Réponses: 31
    Dernier message: 27/07/2006, 13h51
  4. [HTML][FORMULAIRE] Probleme dans la récupération des données
    Par baddounet dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 15/08/2005, 18h51
  5. [HTML] affichage du contenu des balises 'alt' dans une iframe
    Par etarip dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 11/08/2005, 14h08

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