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 :

Tableaux modifiables dans un formulaire


Sujet :

Struts 1 Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 13
    Par défaut Tableaux modifiables dans un formulaire
    Bonjour à tous,

    Je suis nouveau développement web avec Struts (1.3) et je suis face à un problème depuis quelque jours qui me semble pourtant simple à réaliser.

    J'ai besoin d'afficher une liste d'objet dans ma jsp, ces objets ont des propriétés modifiables. Il s'agit donc d'un formulaire. Ce que je ne comprend pas c'est pour l'affichage tout ce passe correctement, je retrouve bien les données de mes objets. Par contre lorsque je sauve mon formulaire, les propriétés modifiées ne sont pas sauvées, je ne les récupère pas au niveau de mon action. Bien entendu je n'ai aucune erreur (au niveau de mon validate).
    Je pense alors que je m'y prend mal, mais en vérité je ne vois pas vraiment à quel niveau ...

    Pour vous donner une idée plus précise voici ma config ...

    struts-config.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <struts-config>
        <form-beans>
            <form-bean name="myActionForm" type="test.MyActionForm"/>
        </form-beans>
        <action path="/testFrom" name="myActionForm" type="test.MyAction" input="/forumlaire.jsp">
            <forward name="success" path="/success.jsp"/>
        </action>	
    </struts-config>
    MyActionFrom.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class MyActionForm extend ActionForm {
        private List myList;
        //les getter et setter sont standard (public) et contiennent des objets Personne
    }
    Personne.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Personne {
        private String fisrtName;
        private String lastName;
        //les getter et setter sont standard (public)
    }
    Rien de particulier n'est fait dans MyAction qui extends Action et qui return "success".

    formulaire.jsp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
    <html:from action="/testFrom">
        ...
        <logic:iterate id="pers" name="myActionForm" property="myList" type="test.Personne">
            <html:text property="fisrtName" name="pres" size="100" />
            ...
            <html:text property="lastName" name="pres" size="100" />
        </logic:iterate>
        ...
    </html:from>
    ...
    Avez-vous une idée?

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Il manque indexed="true" au niveau <html:text>.

    Je n'utilise pas ces tags donc il se peut qu'il faille coder quelque chose d'autre mais c'est un début...
    (j'utilise struts-layout qui possède un composant <layout:datagrid> pour ce genre de choses)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 13
    Par défaut
    Merci mais malheureusement ajouter indexed="true" ne change rien à mon problème.

    Si je le peut j'aimerais évité d'utiliser DataGrid avec struts:layout. Je fais la mise à jour d'une application qui ne l'utilise pas encore et j'aimerais garder les standard utilisé dans l'existant.

    Donc si il y a quelqu'un qui connait un autre moyen qui utilise les bases de struts, je suis preneur!

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Bon, finalement, c'est très null
    Voilà ce qui devrait fonctionner dans ton cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <logic:iterate id="myList" name="myActionForm" property="myList" type="test.Personne">
        <html:text name="myList" property="fisrtName" indexed="true" size="100" />
        ...
        <html:text name="myList" property="lastName" indexed="true" size="100" />
    </logic:iterate>
    avec l'id de <logic:iterate> "myList" du même nom que la propriété List<Personne> de ton ActionForm
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    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
    Avec indexed="true", cela ne peut fonctionner que si tu codes getter et setter indexés sur l'objet de type Personne dans l'ActionForm.

    Sinon, pour éviter d'ajouter getter et setter indexés dans l'ActionForm, je te conseille d'utiliser les tags nested comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        <nested:iterate name="myActionForm" property="myList">
            <nested:text property="fisrtName" size="100" />
            ...
            <nested:text property="lastName"size="100" />
        </nested:iterate>

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par c_nvy Voir le message
    Avec indexed="true", cela ne peut fonctionner que si tu codes getter et setter indexés sur l'objet de type Personne dans l'ActionForm.
    Non, j'ai testé, ça fonctionne. La contrainte étant qu'il faut mettre le nom de la liste comme id de <logic:iterate>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 13
    Par défaut
    Merci OButterlin cela fonction maintenant.

    Mais je suis face à un autre problème maintenant ...

    Dans ma classe Personne une liste de projets liés:
    Les projets ont cette tête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Project {
        private String name;
        private Date dateBegin;
        private Date dateEnd;
        //les getter et setter sont standard (public)
    }
    Je dois également afficher ces projets et permettre la modification.
    Malheureusement un simple logic:iterate dans mon premier ne me set pas mais modifications.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <logic:iterate id="myList" name="myActionForm" property="myList" type="test.Personne">
        <html:text name="myList" property="fisrtName" indexed="true" size="100" />
        ...
        <html:text name="myList" property="lastName" indexed="true" size="100" />
        ...
        <logic:iterate id="projects" name="myList" property="projects" type="test.Project">
            <html:text name="projects" property="name" indexed="true" size="100" />
            <html:text name="projects" property="dateBegin" indexed="true" size="10" />
            <html:text name="projects" property="dateEnd" indexed="true" size="10" />
        </logic:iterate>
    </logic:iterate>
    J'ai également testé avec ceci ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <logic:iterate id="myList" name="myActionForm" property="myList" type="test.Personne" indexId="i">
        <html:text name="myList" property="fisrtName" indexed="true" size="100" />
        ...
        <html:text name="myList" property="lastName" indexed="true" size="100" />
        ...
        <logic:iterate id="projects" name="myList" property='<%= "myList[" + i + "].projects" %>' type="test.Project">
            <html:text name="projects" property="name" indexed="true" size="100" />
            <html:text name="projects" property="dateBegin" indexed="true" size="10" />
            <html:text name="projects" property="dateEnd" indexed="true" size="10" />
        </logic:iterate>
    </logic:iterate>
    ou encore ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <logic:iterate id="myList" name="myActionForm" property="myList" type="test.Personne">
        <html:text name="myList" property="fisrtName" indexed="true" size="100" />
        ...
        <html:text name="myList" property="lastName" indexed="true" size="100" />
        ...
        <nested:iterate id="projects" name="myList" property="projects" type="test.Project">
            <nested:text name="projects" property="name" indexed="true" size="100" />
            <nested:text name="projects" property="dateBegin" indexed="true" size="10" />
            <nested:text name="projects" property="dateEnd" indexed="true" size="10" />
        </nested:iterate>
    </logic:iterate>
    Mais rien n'y fait, lors que je modifie le nom d'un projet par exemple rien n'est modifié dans mon objet correspondant.

    Une aide serait encore la bien venue!

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Là, c'est un peu plus compliqué, il faudrait utiliser l'attribut "index" de la première boucle pour le nom dans la seconde.
    J'avais vu une discussion où c_nvy proposait une solution mais je n'arrive plus à la retrouver (c'est sur ce forum ).
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    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
    OButterlin, je suis épatée par ta solution avec le nom de la liste dans l'id.
    Je ne l'avais jamais testé celle-là.

    Bon, sinon, dans le cas d'iterate imbriqués, il faut effectivement utiliser les index comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <logic:iterate id="myList" name="myActionForm" property="myList" type="test.Personne" indexId="index1">
        <html:text name="myList" property="fisrtName" indexed="true" size="100" />
        ...
        <html:text name="myList" property="lastName" indexed="true" size="100" />
        ...
        <logic:iterate id="projects" name="myList" property="projects" type="test.Project" indexId="index2">
            <html:text name="myActionForm" property="myList[${index1}].projects[${index2}].name" size="100" />
            <html:text name="myActionForm" property="myList[${index1}].projects[${index2}].dateBegin" size="10" />
            <html:text name="myActionForm" property="myList[${index1}].projects[${index2}].dateEnd" size="10" />
        </logic:iterate>
    </logic:iterate>

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par c_nvy Voir le message
    OButterlin, je suis épatée par ta solution avec le nom de la liste dans l'id.
    Je ne l'avais jamais testé celle-là.
    Je suis un fainéant, tu le sais bien
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 13
    Par défaut
    Un grand merci pour la réponse mais ça n'a pas fonctionné du premier coup ...

    J'ai eu cette erreur ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.lang.IllegalArgumentException: Invalid indexed property 'myList[${i}]' on bean class 'class test.Personne' Invalid index value '${index1}'
    Je me demande si il ne faut pas ajouté quelque chose pour utiliser la notation ${} ... Je n'utilise rien d'autre que struts, tiles et les taglibs suivants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>
    <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
    <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
    <%@ taglib uri="http://struts.apache.org/tags-nested" prefix="nested"%>
    J'ai donc fait une petit recherche sur le net et j'ai tenté la solution suivant qui a fonctionné...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:text name="myActionForm" property='<%= "myList[" + index1 +"].projects["+ index2 +"}].name" %>' size="100" />
    Je suis curieux de savoir comment la solution de c_nvy qui est plus élégante peut fonctionner?

  12. #12
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Tu utilises quelles versions des composants ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 13
    Par défaut
    J'utilise les tld et tiles fournis avec la version 1.3 de Struts ...

  14. #14
    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
    Citation Envoyé par karibouci Voir le message
    Je suis curieux de savoir comment la solution de c_nvy qui est plus élégante peut fonctionner?
    J'ai oublié de préciser que, pour que ma solution avec les EL fonctionne, il faut que l'appli soit définie en J2EE 1.4 (JSP 2.0/Servlet 2.4), ce qui manifestement n'est pas le cas.

    Sinon, tu peux utiliser la tld struts-html-el.tld à la place de la tld struts-html.tld.

    Citation Envoyé par OButterlin Voir le message
    Je suis un fainéant, tu le sais bien
    C'est vrai, j'avais oublié.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 13
    Par défaut
    En effet cela ne pouvait pas fonctionner car je suis en JSP 1.2 ...

    En tout cas un grand merci à vous 2!
    Mon problème est enfin résolut!!!!!

    Je peux maintenant retourner au boulot () et me plonger sur un autre problème...

    Et comme disaient les martiens dans Toy Story:
    Nous leur devons une reconnaissance éternelle!
    Encore merci!

  16. #16
    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
    De rien.

    Bon courage pour la suite.

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

Discussions similaires

  1. Zone de liste modifiable dans le formulaire
    Par erikac dans le forum Access
    Réponses: 5
    Dernier message: 11/05/2006, 12h00
  2. listes modifiables dans un formulaire
    Par lolo_bob2 dans le forum Access
    Réponses: 4
    Dernier message: 24/04/2006, 11h22
  3. Réponses: 1
    Dernier message: 06/12/2005, 20h40
  4. Réponses: 5
    Dernier message: 30/09/2005, 16h42
  5. [Tableaux] tableau dans un formulaire
    Par Elo13 dans le forum Langage
    Réponses: 4
    Dernier message: 26/09/2005, 17h28

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