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 :

[struts] Nested a longeur variable


Sujet :

Struts 1 Java

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut [Résolu] [struts] Nested a longeur variable
    Bonjour,

    Je souhaite gérer une collection d'objet dont je ne connaît pas le nombre exact d'élément.

    Dans ma page JSP, j'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     <nested:iterate property="itiRoute">
        <li><nested:image page="/images/inserer.gif" property="action" value="insertnode"/>
            <bean:message key="label.form.testApp.Node"/>
            <nested:text property="nameNode" />
            <nested:select property="nameTypeNode" >
               <nested:options property="nodeTypes" />
            </nested:select></li>
      </nested:iterate>
    Le problème se produit lors du submit, mon objet form est crée par struts, mais il ne connaît le nombre d'élément de ma collection et par conséquent il ne peut pas initialiser les objets dans ma collection.
    Il en résulte l'exception suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
        at java.util.ArrayList.RangeCheck(ArrayList.java:508)
        at java.util.ArrayList.get(ArrayList.java:320)
    Si vous avez une idée.

  2. #2
    Membre expérimenté
    Avatar de RanDomX
    Profil pro
    sans
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 1 407
    Points
    1 407
    Par défaut
    oui il faut que tu utilises l'attribut indexId du tag iterate pour generer l'id du nested bean a resneigner et que tu références tes sous beans par monsousbean[${indexId}].mapropriétédemonsousbean ...


    @+

  3. #3
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour la réponse , mais j'ai essayé cette méthode ,et le code généré dans ma page html est la même !
    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
     
    <li><input type="image" name="itiRoute[0].action" 
            src="/images/inserer_noeud.gif" value="insertnode">
          Noeud
          <input type="text" name="itiRoute[0].nameNode" value="">
          <select name="itiRoute[0].nameTypeNode">
           <option value="ituName" selected="selected">ituName</option>
           <option value="longName">longName</option>
           <option value="shortName">shortName</option>
          </select></li>
    <li><input type="image" name="itiRoute[1].action" 
            src="/srconduit_test/images/inserer_noeud.gif" value="insertnode">
          Noeud
          <input type="text" name="itiRoute[1].nameNode" value="">
          <select name="itiRoute[1].nameTypeNode">
           <option value="ituName">ituName</option>
           <option value="longName">longName</option>
           <option value="shortName">shortName</option>
         </select></li>
    L'orsque je fais submit(), il essaye de trouver dans la collection itiRoute l'élément 0 ou 1 qui n'existe pas. !
    Comment je peut faire pour que cette collection soit initialisée.
    Peut'on faire une méthode genre getItiRoute( int pos ) ou autre , qui initialiserai ma collection?

  4. #4
    Membre expérimenté
    Avatar de RanDomX
    Profil pro
    sans
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 1 407
    Points
    1 407
    Par défaut
    Voici un copier coller d'une reponse qui avait été donnée....


    Cela concerne une liste de personne dont on veut fixer les noms et prénoms.
    listPersonnes est une liste de bean Personne qui se trouve dans la propriété listePersonne du bean monForm:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <logic:iterate id="listePersonne" name="monForm" property="listePersonne" indexId="iPersonne">       
    <TR> 
    <TD align="right"> Nom : <html:text name="monForm" property="listePersonne[${iPersonne}].nom" /></TD> 
    <TD align="right"> Prenom : <html:text name="monForm" property="listePersonne[${iPersonne}].prenom" /></TD> 
     
    </TR>
    ... etc



    du coup quand tu submit ton form tu le récupère simplement ave le get de ton form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Personne[] tab = (Personne[]) form.get("listePersonne");

    et dans tab tu as chaque personne avec son nom et son prénom saisie dans le form

    Pour l'initialiser c'est la meme chose, tu alloues dans chaque poste un objet Personne avec tes données initiales et tu le set dans le form


    @+

  5. #5
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Le problème reste toujours le même !

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     <html:submit/><html:reset/><br>
     <logic:iterate property="itiRoute" id="itiRoute" name="ItiForm" indexId="ctr">       
       <li><html:image page="/images/inserer_noeud.gif" property="action" value='<%= "insertRoute " + ctr %>'/>
             <bean:message key="label.form.testApp.Node"/>
             <html:text property='<%= "itiRoute["+ctr +"].nameNode" %>' />
             <html:select property='<%= "itiRoute["+ctr +"].nameTypeNode" %>' >
    	   <html:options property='<%= "itiRoute["+ctr +"].nodeTypes" %>' />
    	 </html:select></li>
          </logic:iterate>
    La page HTML que j'obtient est la suivante :
    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
     
     <input type="submit" value="Submit">
     <input type="reset" value="Reset"><br>     
     <li><input type="image" name="action" src="/images/inserer_noeud.gif" value="insertRoute 0">
           Noeud
           <input type="text" name="itiRoute[0].nameNode" value="toto">
           <select name="itiRoute[0].nameTypeNode">
            <option value="ituName" selected="selected">ituName</option>
            <option value="longName">longName</option>
            <option value="shortName">shortName</option>
           </select></li>
     <li><input type="image" name="action" src="/images/inserer_noeud.gif" value="insertRoute 1">
           Noeud
           <input type="text" name="itiRoute[1].nameNode" value="">
           <select name="itiRoute[1].nameTypeNode">
            <option value="ituName">ituName</option>
            <option value="longName">longName</option>
            <option value="shortName">shortName</option>
           </select></li>
    En suivant en mode debug, voici le cheminement :
    Lorsque je fait un submit de ma page:
    Il crée bien mon bean itiForm
    Il essaye trouver l'element itiRoute[1], pour cela:
    - il prend la collection avec getItiRoute() et non getItiRoute(int pos).
    - Puis il prend l'élément en position 1 de ma collection. Mais comme la collection ne contient aucun element ( ils ne sont pas initialisés, c'est ce que j'aimerai faire) , il me fait une exception IndexOutOfBound.

    Donc comment faire cette initialisation, alors que je ne connait pas a l'avance le nombre d'élément de ma collections. C'est la page HTML qui le connait ce nombre.

    Ps:
    j'ai mis '<%= "itiRoute["+ctr +"].nameNode" %>' au lieu de 'itiRoute[${ctr}].nameNode' car cela ne fonctionnai pas!

    Merci encore pour vos réponses

  6. #6
    Membre expérimenté
    Avatar de RanDomX
    Profil pro
    sans
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 1 407
    Points
    1 407
    Par défaut
    tu confonds deux choses là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <input type="text" name="itiRoute[0].nameNode" value="toto"> 
           <select name="itiRoute[0].nameTypeNode">
    tu utilises itiRoute deux fois pour deux balises différentes.

    Tu dois avoir d'un coté tes valeurs possible et de l'autre la valeur selectionnée qui sera transmise.

    Ce qui importe ici ce n'est pas les valeurs possibles mais les valeurs selectionnées.

    Tu dois fournir un mutateur pour ta collection sous forme d' un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    set(String[] itiRoute)
    {
      this.itiRoute = itiRoute;
    }
    c la dessus que tu vas iterer.

    Les valeurs possibles sont tirées d'ailleurs.


    @+

  7. #7
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par RanDomX
    tu confonds deux choses là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <input type="text" name="itiRoute[0].nameNode" value="toto"> 
           <select name="itiRoute[0].nameTypeNode">
    tu utilises itiRoute deux fois pour deux balises différentes.
    Oui, car mon objet itiRoute n'est pas un simple tableau de String.
    Il contient plusieurs informations, le nom de la route "nameNode" et son type "nameTypeNode" et puis plein d'autres choses ( si cela fonctionne ).

    Voici la définition de mes beans ( simplifié )

    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
    public class ItiForm extends ActionForm
    {
      private String action = "";
      .....
      private Collection itiRoute = new ArrayList();
     
      ....
      public Collection getItiRoute() {
        if ( itiRoute == null ) {
          itiRoute = new ArrayList();
        }
        return itiRoute;
      }
     
      public void setItiRoute(Collection itiRoute) {
        this.itiRoute = itiRoute;
      }
    }
     
    public class ItiRoute extends ActionForm
    {
      private String action = "";
      private String nameNode = "";
      private String nameTypeNode = "";  
      private Collection nodeTypes = new ArrayList();
     
    .. avec les getter et setter associé et l'initialisation de nodeTypes 
    }
    Si j'initialise en dur dans ItiForm, un nombre d'ItiRoute suffisant, cela fonctionne.
    Mais je recherche un système dynamique sans sauvegarde dans la session.

    Mais cela n'est peut être pas possible

  8. #8
    Membre expérimenté
    Avatar de RanDomX
    Profil pro
    sans
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 1 407
    Points
    1 407
    Par défaut
    mais ct pour l'exemple.

    tu n'as qu'a mettre un tableau d'ItiForm : ItiForm[]

  9. #9
    Candidat au Club
    Inscrit en
    Septembre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'ai résolut le problème, en initialisant une certain nombre d'itiRoute et le bean fait la gestion du surplus.
    Ce n'est pas très propre mais cela à le mérite de fonctionner .

    Merci de votre aide

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

Discussions similaires

  1. [Struts] Nested
    Par cosmos38240 dans le forum Struts 1
    Réponses: 3
    Dernier message: 24/04/2009, 17h02
  2. [Struts][nested]request.getSession().getAttribut()
    Par Invité dans le forum Struts 1
    Réponses: 5
    Dernier message: 26/04/2006, 10h42
  3. Réponses: 26
    Dernier message: 24/03/2006, 13h44
  4. [STRUTS] Nested tags validation - Client side
    Par SEMPERE Benjamin dans le forum Struts 1
    Réponses: 3
    Dernier message: 18/07/2005, 13h21
  5. [STRUTS][NESTED] et OptionCollection
    Par hamed dans le forum Struts 1
    Réponses: 15
    Dernier message: 03/02/2004, 12h27

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