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 :

collection via formulaire sous Struts


Sujet :

Struts 1 Java

  1. #21
    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
    Lorsque tu imbriques des nested tu n est pas obliger d'utiliser l'attribut name.
    J'ai modifié ma réponse pendant que tu écrivais.
    Si on ne code pas l'attribut name, il faut bien que Struts fasse le lien entre la classe Indicateur et la collection.
    Le nom de la collection n'est-il donc pas important dans ce cas-là ?
    Et donc l'appeler indicateurs avec un "s" plutôt que lstIndicateur ?

  2. #22
    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
    Pardon, j'ai fait une petite erreur de raisonnement tout à l'heure :

    L'attribut name dans le logic:iterate fait référence à l'ActionForm et non à la collection.
    C'est l'attribut id qui fait référence à la collection.

    Donc, je reformule ma question :

    Si on n'a pas besoin de coder d'attribut id dans le tag nested:iterate, comment fait-il pour faire le lien entre la collection et la classe, soit lstIndicateur et Indicateur dans le cas évoqué ? peut-être tout simplement grâce aux méthodes que l'on code dans l'ActionForm ?

    Je vais chercher de la doc à ce sujet pour comprendre le mécanisme.

    Jusqu'à présent, je n'utilisais que les tags jstl et plus particulièrement dans ce cas, le c:forEach avec html:text indexed="true".

  3. #23
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut
    Citation Envoyé par c_nvy
    Pardon, j'ai fait une petite erreur de raisonnement tout à l'heure :

    L'attribut name dans le logic:iterate fait référence à l'ActionForm et non à la collection.
    C'est l'attribut id qui fait référence à la collection.

    Donc, je reformule ma question :

    Si on n'a pas besoin de coder d'attribut id dans le tag nested:iterate, comment fait-il pour faire le lien entre la collection et la classe, soit lstIndicateur et Indicateur dans le cas évoqué ? peut-être tout simplement grâce aux méthodes que l'on code dans l'ActionForm ?

    Je vais chercher de la doc à ce sujet pour comprendre le mécanisme.

    Jusqu'à présent, je n'utilisais que les tags jstl et plus particulièrement dans ce cas, le c:forEach avec html:text indexed="true".
    Je n'utilise pour ma part que les nested et c'est leur simplicité qui les sort du lot... Enfin je reconfirme que tu nas pas a utiliser l'attribut name dans des nested imbriqués d'ailleurs la tld ne le declare pas comme obligatoire

  4. #24
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut
    Voici un petit exemple de code d'une de mes jsp

    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
    25
    26
    27
     
    <nested:iterate property="listeDico"><tr>
    <td>
       <font class="result-text"><nested:text property="code" disabled="true"/></font>
    </td>
    <td>
       <font class="result-text"><nested:text property="label"/></font>
    </td>
    <td>
       <font class="result-text"><nested:text property="abreviation" styleClass="date-field" maxlength="20"/></font>
    </td>
    <td>
       <font class="result-text"><nested:text property="numero" styleClass="quantity-field" maxlength="3"/></font>
    </td>
    <td>
       <font class="result-text"><nested:text property="hierarchie" styleClass="quantity-field" maxlength="3"/></font>
    </td>
    <td>
       <font class="result-text">
          <bean:message key="global.Oui"/>
          <nested:radio property="actif" value="true"/>
          <bean:message key="global.Non"/>
          <nested:radio property="actif" value="false"/>
       </font>
    </td>				
    </tr>
    </nested:iterate>
    Dans ce cas un Dico est un javabean composé d'un code, d'un label, d'une abréviation, d'un numéro, d'une hiérarchie, d'un état d'activité...

  5. #25
    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
    En fait, j'étais très fatiguée hier soir et je me rends compte que finalement, c'est simple !

    Si on se base sur ton exemple, tu as un objet Dico, composé d'un code,label et autres et une collection listeDico, composée d'objets Dico.

    Et dans le cas de plaf, il a un objet Indicateur, composé d'un certain nombre de propriétés, et une collection lstIndicateur, composée d'objets Indicateur.

    Le tag <nested:iterate property="lstIndicateur"> va permettre automatiquement de balayer les objets Indicateur composant la collection lstIndicateur et le <nested:hidden property="nom" indexed="true"> d'afficher la propriété nom de l'objet Indicateur avec la possibilité de la modifier.

    Ton problème, plaf, est donc je pense au niveau du tag indexé.
    As-tu modifié les getters et setters de ton ActionForm comme je te l'ai indiqué ?
    Si oui, est-ce que ça marche mieux ?!!!

  6. #26
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    donc pour le moment tout fonctionne mais effectivement je vais peut-être tester en session pour voir, mais de tte facon je peux pas voir si ca a un impact avec une montée en charge
    sinon les ArrayList c'est mieux que les Vector ? merci pr l'info je vais faire une ptite conversion
    en fait finalement j'ai supprimé mon paramètre en indexed=true, ca marche aussi. J'ai rajouté les attributs d'indicateurs non affichés et non modifiés en hidden mais dt je me sers pr repeupler mon vecteur d'indicateurs
    mon code actuel est le suivant :

    <nested:iterate property="lstIndicateur">
    <tr>
    <nested:hidden property="nom"/>
    <nested:hidden property="uo"/>
    <nested:hidden property="ind_desc"/>
    <nested:hidden property="type_qtql"/>
    <td width="400" class="Forminput"> <nested:write property="ind_desc"/></td>
    <td width="300" class="Forminput"> <nested:write property="uo"/></td>
    <td width="100" class="Forminput"> <nested:text property="realise" size="10" maxlength="150"/></td>
    </tr>
    par contre si je maintiens la liste en request je vais écrire le nombre d'indicateurs vide à initialiser ds la méthode reset() de mon actionform en dur ds le fichier externe de config. Ca me semble être une bonne alternative au scope session (d'ailleurs si qqn a qqles infos sur les différences entre scope session et request ?)

  7. #27
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut
    Citation Envoyé par c_nvy
    En fait, j'étais très fatiguée hier soir et je me rends compte que finalement, c'est simple !

    Si on se base sur ton exemple, tu as un objet Dico, composé d'un code,label et autres et une collection listeDico, composé d'objets Dico.

    Et dans le cas de plaf, il a un objet Indicateur, composé d'un certain nombre de propriétés, et une collection lstIndicateur, composé d'objets Indicateur.

    Le tag <nested:iterate property="lstIndicateur"> va permettre automatiquement de balayer les objets Indicateur composant la collection lstIndicateur et le <nested:hidden property="nom" indexed="true"> d'afficher la propriété nom avec la possibilité de la modifier.

    Ton problème, plaf, est donc je pense au niveau du tag indexé.
    As-tu modifié les getters et setters de ton ActionForm comme je te l'ai indiqué ?
    Si oui, est-ce que ça marche mieux ?!!!
    tu as tout compris
    Par contre comme vous pouvez le remarquer, je n ai a aucun moment d'attribut indexed="true" de déclaré

  8. #28
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    j'avais pas lu ton post c_nvy
    tu as bien compris le fct du nested:iterate, ca permet en effet de sous entendre bcp de choses, ca allège l'écriture (mais j'ai eu du mal à capter au début, c perturbant tout ces trucs implicites! )
    sinon j'ai aucune idée de l'utilité de mettre une property en indexed=true. J'ai viré ca et ca marche encore (ms au départ je l'avais juste rajouté pcq je croyais qu'il y avait une erreur à cause de ca). Si vs savez à quoi sert ce indexed ?

  9. #29
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut
    Citation Envoyé par plaf
    Ca me semble être une bonne alternative au scope session (d'ailleurs si qqn a qqles infos sur les différences entre scope session et request ?)
    Cela peu peut etre te convenir
    http://java.developpez.com/faq/j2ee/...SSIONS_PORTEES

  10. #30
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    oui je vois bien que c'est la portée qui diffère, tout objet en session est maintenu en mémoire de tomcat pr chaque utilisateur connecté pendant toute leur session. En fait ce que je me demandais c'est si ca influencait bcp les perfs, ms bon ca dépend de la mémoire du serveur tomcat, du nbre de gens qui se connectent en même temps... en fait ds mon cas ca doit pas changer grd chose
    tt ca pr dire que j'en sais rien!
    mntnt je vais tester en session, ca se trouve ce pb de indexoutofboundexception ne vient même pas de là
    je vous tiens au courant

  11. #31
    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
    En fait, indexed="true" est utilisé lorsqu'on veut pouvoir modifier une propriété dans un formulaire et non pas seulement l'afficher.

    Si par exemple, tu codes indexed="true" sur la propriété nom, cela permet à Struts de savoir le nom de quel indicateur a été modifié.
    Mais pour cela, il faut coder les bons getter et setter sur l'indicateur avec l'utilisation d'un index comme indiqué dans mon message.

  12. #32
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    oui mais là j'ai enlevé le indexed=true et je peux modifier mes données (pourvu que j'initialise des indicateurs vides dans ma liste). dc apparement il arrive qd même à voir quel indicateur a été modifié

  13. #33
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut
    Citation Envoyé par c_nvy
    En fait, indexed="true" est utilisé lorsqu'on veut pouvoir modifier une propriété dans un formulaire et non pas seulement l'afficher.

    Si par exemple, tu codes indexed="true" sur la propriété nom, cela permet à Struts de savoir le nom de quel indicateur a été modifié.
    Mais pour cela, il faut coder les bons getter et setter sur l'indicateur avec l'utilisation d'un index comme indiqué dans mon message.
    C'est donc uniquement une alternative au nested, rien d'autre, non?

  14. #34
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    bon gros échec, je viens de constater que l'astuce qui consister à initialiser un nbre d'indicateurs vide suffisamment grand ne marche que si on a initialisé avec pile le nombre d'indicateurs de la tache. Par ex en voulant tester les modifs sur une tache comportant 12 indicateurs, il faut initialiser 12 indicateurs vide ds le reset(), pas 11 ni 13! et après ttes les autres taches qui ont pas 12 indicateurs marchent plus

    dc c pas interessant, je vais tester le scope session

  15. #35
    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
    En fait, je me suis mal exprimée.
    Il est vrai que le tag <nested:text> te permet aussi de modifier une propriété, tout comme le <html:text>.
    Mais lorsque celui-ci est dans un tag <nested:iterate>, je pensais que tu étais obligé de coder indexed="true" pour qu'il sache quel indicateur a été modifié.
    Ce qui est certain, c'est que indexed="true" doit être codé si on utilise un tag <html:text> imbriqué dans un tag <html:iterate>.
    Mais peut-être que nested fonctionne automatiquement sans coder indexed="true" comme il fonctionne sans coder name !

    Mais je pense qu'il faut quand même coder les getters et setters avec gestion d'index dans l'ActionForm pour qu'il s'y retrouve, non ?
    quoique par sûr...

    Il est vraiment fortiche ce nested !

    En tout cas, moi, sans nested, avec <c:forEach>, <html:text indexed="true"> et une ActionForm avec les bons getters et setters, je n'ai pas besoin d'initialiser quoi que ce soit pour que ça fonctionne !

  16. #36
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    tout à fait, à mon avis le nested déclare implicitement un indexed=true

    ah oui ? et ton actionform tu l'as en session ou request ?
    parce que si tu l'as en request je vais ptet essayer le forEach, mais ca m'étonnerait pcq le nested ne doit être qu'un "habillage" équivalent au forEach, dc fondamentalement ca change pas la nécessité d'enregistrer en session

  17. #37
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    tout à fait, à mon avis le nested déclare implicitement un indexed=true

    ah oui ? et ton actionform tu l'as en session ou request ?
    parce que si tu l'as en request je vais ptet essayer le forEach, mais ca m'étonnerait pcq le nested ne doit être qu'un "habillage" équivalent au forEach, dc fondamentalement ca change pas la nécessité d'enregistrer en session

  18. #38
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut
    Citation Envoyé par c_nvy
    Mais je pense qu'il faut quand même coder les getters et setters avec gestion d'index dans l'ActionForm pour qu'il s'y retrouve, non ?
    quoique par sûr...
    Ben non pas du tout je l'utilise comme ca!! Sans aucune autre adjonction

  19. #39
    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
    Pourtant, j'ai vu l'exemple suivant sur le net :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    public class ClassForm extends ValidatorActionForm {
      private String name;
      private List students = new ArrayList();
      ...
      public String getName() {
        return name;
      }
      public void setName(String name) {
        this.name = name;
      }
      public List getStudents() {
        return students;
      }
      public Student getStudent(int index) {
        return (Student) students.get(index)l
      }
      ...
    }
    public class Student {
      private String name;
      ...
      public String getName() {
        return name;
      }
      public void setName(String name) {
        this.name = name;
      }
      ...
    }
     
    In your JSP you'd have something like:
    <html:form action="updateClass">
      Class: <nested:text property="name"/><br/>
      Students:<br/>
      <nested:iterate property="students">
        Name: <nested:text property="name"><br/>
        ...
      </nested:iterate>
    </html:form>
    Il y a bien un getter avec utilisation d'index.

    Mais plaf, as-tu quand même essayé en ajoutant les getter et setter comme je te l'ai indiqué ?

  20. #40
    Futur Membre du Club
    Inscrit en
    Avril 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 26
    Points : 7
    Points
    7
    Par défaut
    ton exemple est interessant c_nvy! j'ai copié le get avec index exactement de la même manière que ton exemple ds mon actionform pr voir, j'ai la même chose ds la jsp mais j'obtiens une erreur de ce genre :
    cause mère

    java.lang.IndexOutOfBoundsException: Index: 2, Size: 0
    at java.util.ArrayList.RangeCheck(ArrayList.java:508)
    at java.util.ArrayList.get(ArrayList.java:320)
    at org.apache.commons.beanutils.PropertyUtils.getIndexedProperty(PropertyUtils.java:468)
    at org.apache.commons.beanutils.PropertyUtils.getIndexedProperty(PropertyUtils.java:375)
    at org.apache.commons.beanutils.PropertyUtils.getNestedProperty(PropertyUtils.java:709)
    at org.apache.commons.beanutils.PropertyUtils.getProperty(PropertyUtils.java:741)
    at org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:560)
    at org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:504)
    at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:966)
    est-ce que tu as l'exemple complet avec la méthode reset() de l'actionform ? et est-ce que tu sais si l'actionform est en session ou en request ?[/quote]

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Envoi données via formulaire sous wordpress
    Par panda25 dans le forum Langage
    Réponses: 7
    Dernier message: 24/10/2014, 09h14
  2. [XL-2007] Suppression lignes excel via formulaire sous vba
    Par nanousik dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/10/2012, 07h00
  3. Réponses: 6
    Dernier message: 31/03/2010, 00h09
  4. Ouvrir un Formulaire via un sous-formulaire
    Par pouii dans le forum IHM
    Réponses: 8
    Dernier message: 17/04/2008, 15h52
  5. message box via un sous formulaire
    Par fa310428 dans le forum IHM
    Réponses: 8
    Dernier message: 02/10/2007, 14h31

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