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 :

Probleme de scope sur une collection


Sujet :

Struts 1 Java

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 94
    Par défaut Probleme de scope sur une collection
    Bonjour,

    D'abord je m'excuse pour le doublon de message, je viens devoir qu'il y avait un forum spécifique à struts.

    Voila mon problème:

    Dans ma page JSP, j'ai qqch qui ressemble à ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <c:forEach var="i" items="${monForm.monVector}">
              <tr> 
                <td>
                  Mon test
                <td>
              </tr>
    </c:forEach>
    Bien sur sa ne marche pas, la page ne se remplit pas.
    Si je change le nom de ma collection (pour rigoler), pas de prob, la page s'affiche...mais sans les données bien sur.

    Donc avec mon EDI, en mode debug, je vérifie que monVector est bien présent dans la session, et il y est bien, même pas vide en plus !

    Dans mon action (struts) la variable est mise dans la session de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_session.setAttribute( "monForm", instanceDeMonForm );
    Il semble donc qu'il s'agisse d'un problème de scope(portée), enfin c'est ce que m'as dit mon boss en me conseillant de passer cette variable par "response". Comme ca on est sur d'avoir la variable dans le scope "page".

    Mon problème est donc:

    Vous pensez que c'est la bonne solution?

    Et si oui comment on fait pour mettre une variabledans "response"? J'ai beau chhercher, j'ai pas trouvé.


    Merci de votre aide.

  2. #2
    Expert confirmé

    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
    Par défaut
    Tout d'abord, dans ta jsp, as-tu codé la directive taglib qui pointe sur la librairie core de la JSTL ?

    Ensuite, normalement, pour mettre ton Vector dans le scope via le form-bean, il faut procéder comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TonActionForm instanceDeTonForm = (TonActionForm) form ;
    instanceDeTonForm.setTonVector(tonVector) ;
    le scope (request ou session) étant défini dans le mapping de cette Action.

    Sinon, que contient ton Vector ? Si c'est un Vector de String, pour afficher son contenu, il faut coder ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <c:forEach items="${monForm.monVector}" var="item">
       <c:out value="${item}"/>
    </c:forEach>

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 94
    Par défaut
    Bonjour,

    Oui, j'ai bien la directive tag lib correspondante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>

    instanceDeTonForm.setTonVector(tonVector) ;
    En fait mon vector est une propriété de mon form, donc je n'ai pas de set a faire me semble il?

    Ensuite, normalement, pour mettre ton Vector dans le scope via le form-bean, il faut procéder comme ceci :
    En fait ce n'est pas le vector que je souhaite mette dans le scope mais le form lui meme. Pour ce faire je procede comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_session.setAttribute( monForm.ID, instanceDeMonForm);
    ...En fait je pense que mon Form est bien dans le scope car si dans ma jsp je fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <c:out value="1:${FormLstPrsBean}"/>
    A l'affichage j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lu.alti.igss.ceo.web.beans.Form_LstPrsBean@15b15ab
    Form_LstPrsBean étant le nom de mon form. Donc il est bien présent en mémoire.

    Mon form possède des vecteurs dont(pour un test) celui ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     public String myTab[] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi"};
    ...et en vrai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private Vector vLstPersData;
    Pour résumer si je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <c:out value="1:${FormLstPrsBean}"/>
    , sa marche.

    Et si je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <c:out value="1:${FormLstPrsBean.myTab}"/>
    Ou alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <c:out value="1:${FormLstPrsBean.vLstPersData}"/>
    , il est plus content du tout et ma page ne s'affiche plus complétement.

    Seb pas comprendre

  4. #4
    Expert confirmé

    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
    Par défaut
    As-tu essayé avec le code que je t'ai donné précédemment, soit comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <c:forEach items="${FormLstPrsBean.vLstPersData}" var="item">
       <c:out value="${item}"/>
    </c:forEach>
    Et peux-tu montrer comment tu initialises le vecteur vLstPersData ?

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 94
    Par défaut
    oui, j'ai essayé de cette manière mais sa marche pas, ma page ne se construit pas dynamiquement en fait voici l'erreur que donne mon debuggeur

    Messages : An error occurred while evaluating custom action attribute "value" with value "${FormLstPrsBean.vLstPersData}": Unable to find a value for "vLstPersData" in object of class "lu.alti.igss.ceo.web.beans.Form_LstPrsBean" using operator "." (null)
    Pour l'initialisation je fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public Vector myTab2 = new Vector();
    Et dans le constructeur du form:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        myTab2.addElement("lundi");
        myTab2.addElement("mardi");
        myTab2.addElement("mercredi");

  6. #6
    Expert confirmé

    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
    Par défaut
    Je ne comprends pas bien.
    Dans le message d'erreur, le vecteur s'appelle vLstPersData et dans le code de l'ActionForm que tu as posté, le vecteur s'appelle myTab2.
    Donc, tu devrais coder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <c:forEach items="${FormLstPrsBean.myTab2}" var="item">
       <c:out value="${item}"/>
    </c:forEach>
    Sinon, dans le message d'erreur, il dit que tu utilises l'opérateur "." dans l'attribut value.
    Dans mon exemple, ce n'est pas le cas.
    Il semblerait que tu aies codé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       <c:out value="${FormLstPrsBean.vLstPersData}"/>
    Peux-tu nous montrer le code du c:forEach correspondant au message d'erreur ?

    Et enfin, d'après ton exemple, myTab2 est un vecteur de String.
    Et vLstPersData, c'est un vecteur de String également ou un vecteur de bean ?

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 94
    Par défaut
    En effet,je n'ai pas été forcément trés clair,
    En fait au depart, j'ai dans ma classe form un vecteur vLstPersData qui contient des objets.

    Pour éviter de poluer mon test avec le contenu de vLstPersData, j'ai initialisé a la main un second vecteur myTab2.

    Le code de mon for each est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <c:forEach var="i" items="${FormLstPrsBean.vLstPersData}">
              <tr> 
                <td>
                  test
                <td>
              </tr>        
    </c:forEach>
    Le message d'erreur est alors:
    An error occurred while evaluating custom action attribute "items" with value "${FormLstPrsBean.vLstPersData}": Unable to find a value for "vLstPersData" in object of class "lu.alti.igss.ceo.web.beans.Form_LstPrsBean" using operator "." (null)
    Si je change la valeur items pour myTab2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <c:forEach var="i" items="${FormLstPrsBean.myTab2}">
              <tr> 
                <td>
                  test
                <td>
              </tr>        
    </c:forEach>

    Le message d'erreur est alors:
    An error occurred while evaluating custom action attribute "items" with value "${FormLstPrsBean.myTab2}": Unable to find a value for "myTab2" in object of class "lu.alti.igss.ceo.web.beans.Form_LstPrsBean" using operator "." (null)
    Donc finalement, le même mis a part le nom de la variable.

    Pour repondre à ton post précédent j'ai effectivement éfféctué un test du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <c:out value="${FormLstPrsBean.vLstPersData}"/>
    Simplement pour voir si il avait accès à la propriété vLstPersData de l'objet, l'objectif étant à terme de le mettre dans une boucle for each...Mais pour l'instant j'ai même pas accès à la collection.

  8. #8
    Expert confirmé

    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
    Par défaut
    Tu es en J2EE 1.3 ou en J2EE 1.4 ?

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 94
    Par défaut
    J2EE 1.4

    Bon, j'ai trouvé la solution, ou plutôt qq'un me l'a donnée.

    En fait dans la balise JSTL, moi j'essayait de faire appel à une propriété de mon objet (qui était dans la session). Or en fait il faut faire appel au getter de cette propriété(sans le get) qui dans mon cas s'écrivait :

    getVLstPersData()

    Donc quand je fait référence à mon vecteur je doit écrire ${FormLstPrsBean.VLstPersData}

    Avec une #!!$$"## de majuscule !!!

    Quoi qu'il en soit merci a toi c_nvy pour ton aide

  10. #10
    Expert confirmé

    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
    Par défaut
    Ben non, normalement, tu fais référence à la propriété, donc la première lettre doit être en minuscule, soit par exemple unePropriete et lui, il sait qu'il doit faire appel à la méthode getUnePropriete().

    Par contre, normalement, quand une propriété est constituée de plusieurs mots, on met une majuscule à chaque nouveau mot.
    Je pense donc que le nom de ta propriété pose problème parce que la deuxième lettre est une majuscule et que pour lui, v n'est pas un mot.

    Tu peux faire un essai en renommant la propriété vLstPersData en vectorLstPersData et en codant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <c:forEach items="${FormLstPrsBean.vectorLstPersData}" var="item">
    et là, je suis certaine que ça fonctionnera mieux.

    Par contre, il y a un truc qui m'échappe.
    ça aurait dû fonctionner avec la propriété myTag2.

    Mais si tu es en J2EE 1.4, l'uri à coder dans la directive taglib ne serait pas plutôt ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://java.sun.com/jsp/jstl/core

  11. #11
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 94
    Par défaut
    Ok, il faudra que je teste ça, tout est pas encore bien clair pour moi au niveau des getters/Setters (je debute...)

    En tout cas merci de ton aide.

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

Discussions similaires

  1. [MySQL 4.1] probleme d'accents sur une requete SQL
    Par tatayoyo dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/11/2005, 16h06
  2. [Struts] <logic:iterate> sur une collection d objets c
    Par trax020 dans le forum Struts 1
    Réponses: 2
    Dernier message: 12/05/2005, 00h11
  3. probleme de texture sur une sphère
    Par sebpp dans le forum OpenGL
    Réponses: 2
    Dernier message: 12/04/2005, 19h46
  4. Mount / fstab - Problème de droit sur une partition
    Par Chance666 dans le forum Administration système
    Réponses: 5
    Dernier message: 17/01/2005, 15h57
  5. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26

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