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 1.3] iterate imbriqués et multibox


Sujet :

Struts 1 Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Par défaut [Struts 1.3] iterate imbriqués et multibox
    Salut à tous,

    J'ai encore un soucis avec mon appli struts. J'ai une liste d'objets, qui contiennent eux même chacun une liste d'objet. La situation ressemble pas mal à un autre sujet (http://www.developpez.net/forums/d21...ns-imbriquees/), dont la lecture m'a aidé pour la première partie. Mon formulaire m'affiche donc bien mes données, mais quand je modifie et que je valide, le formulaire n'est pas rempli par struts, et je me retrouve avec une liste vide.


    L'idée est d'associerà un utilisateur donné les niveau de zoom accessibles pour chaque cartographie.

    Voici mon formulaire (simplifié) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class UtilisateurPage2Form extends ActionForm {
    	private static final long serialVersionUID = 5631359010744584015L;
    	private List<CartoZoom> zoomsUtilisateurs;
    	private int id;
    	private String login;
    	private boolean creation;
    	//tous les accesseurs, la méthode reset....
    }
    Ma classe CartoZoom est très simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class CartoZoom {
    	private String nom;
    	private int id; //identifiant de ma cartographie
    	private List<LabelValueBean> zooms; //permet de stocker tous les niveaux de zoom
    	private String[] selection; //permet de stocker les niveaux de zoom possibles pour l'utilisateur.
     
    	//tous les accesseurs
    }
    Enfin voici ma JSP simplifiée

    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
     
    <html:form action="/UtilisateurPage2.do">
    	<html:hidden property="login" />
    	<html:hidden property="id" />
    	<logic:iterate name="zoomsUtilisateurs" id="carto" indexId="index">
    		<div class="zoomCarto">
    			<bean:write name="carto" property="nom" />
    			<logic:iterate id="zoom" name="carto" property="zooms">
    				<html:multibox name="carto[index]" property="selection"><bean:write name="zoom" property="value"/></html:multibox><bean:write name="zoom" property="label"/><br/>
    			</logic:iterate><br />
    		</div><!-- fin de la carto -->
    	</logic:iterate>
     
    	<html:submit><bean:message key="utilisateur.creation.page2.valider" /></html:submit>
    </html:form>
    Si quelqu'un a une idée ça serai vraiment sympa !

    Merci

  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
    Pour mettre à jour la liste zoomsUtilisateurs du formulaire, il faut utiliser l'attribut property dans le logic:iterate et non l'attribut name.
    Et il faut modifier le tag multibox comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <logic:iterate name="nomDuFormBean" property="zoomsUtilisateurs" id="carto" indexId="index">
    	<div class="zoomCarto">
    		<bean:write name="carto" property="nom" />
    		<logic:iterate name="carto" property="zooms"  id="zoom">
    			<html:multibox property="zoomsUtilisateurs[${index}].selection"><bean:write name="zoom" property="value"/></html:multibox><bean:write name="zoom" property="label"/><br/>
    		</logic:iterate><br />
    	</div><!-- fin de la carto -->
    </logic:iterate>
    Et comme seules les valeurs des checkbox cochées sont transmises au submit du formulaire, il faut surcharger la méthode reset de l'ActionForm et dans cette méthode, initialiser le tableau de String selection a une taille de zéro.
    La méthode reset de l'ActionForm étant appelée avant les setters, cela va provoquer le décochage de toutes les checkbox et ainsi, quand le setter sera exécuté, seules les valeurs des checkbox cochées seront modifiées dans le tableau de String selection.

    Il faudrait également initialiser la liste zoomsUtilisateurs lors de sa déclaration dans l'ActionForm pour éviter un NullPointerException au submit du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	private List<CartoZoom> zoomsUtilisateurs = new List<CartoZoom>();

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Par défaut
    Merci beaucoup, je testerai ça lundi

    Une question plus générale, actuellement dans ma méthode reset(), je met justement les valeurs actuelles des checkboxs à jour, pour que le formulaire soit bien remplit dès le début (je vais chercher les valeurs par un request.getAttribute(), après avoir fait un setAttribute() dans l'action précédente). Je suppose que ce n'est pas la bonne façon de faire du coup ?!

  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
    Comme tu as mis les valeurs des checkbox dans le scope request, le getAttribute ne fonctionnera qu'à l'initialisation du formulaire.
    A la soumission du formulaire, une nouvelle requête sera constituée et donc le getAttribute renverra null.
    Donc, dans la méthode reset(), si le getAttribute ne renvoie pas null, tu initialises les valeurs des checkbox comme tu le fais déjà, sinon tu initialises le tableau de String selection a une taille de zéro.
    A tester mais cela devrait fonctionner.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Par défaut
    ça marche presque ! le seul soucis est le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<CartoZoom> zoomsUtilisateurs = new ArrayList<CartoZoom>();
    Ca provoque un OutOfBound au moment du populate. J'ai essayé en ajoutant quelques éléments vides dedans et ça passe. Il faudrait que je connaisse la taille de ma liste zoomsUtilisateurs au moment du reset, et je ne vois pas comment faire :/ Sinon il faudrait que ma liste s'auto-élargisse ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 53
    Par défaut
    ça marche avec une LazyList

    Merci encore du coup de main !

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

Discussions similaires

  1. Iterator imbriqués List<List<String>>
    Par blbird dans le forum Struts 2
    Réponses: 1
    Dernier message: 21/01/2009, 11h05
  2. Réponses: 16
    Dernier message: 06/10/2008, 10h02
  3. logic:iterate imbriqués + html:image
    Par jayrosam dans le forum Struts 1
    Réponses: 2
    Dernier message: 10/12/2007, 17h37
  4. Pb d'affichage avec des logic:iterate imbriqués
    Par mariemor64 dans le forum Struts 1
    Réponses: 8
    Dernier message: 20/07/2006, 15h44
  5. [struts]Cannot create iterator for this collection
    Par jamal_b dans le forum Struts 1
    Réponses: 3
    Dernier message: 13/04/2006, 17h00

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