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 :

Comment récupérer une liste de checkbox


Sujet :

Struts 1 Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 22
    Par défaut Comment récupérer une liste de checkbox
    Bonjour,
    oui je sais il y en a des tonnes des questions sur ces satanées checkbox , mais la mienne n'a toujours pas de réponse.

    J'explique en gros le contexte : j'utilise struts 1.2.9; j'affiche une liste d'éléments avec pour chaque éléments son nom et une checkbox lui correspondant (le nb d'éléments n'est pas connu à l'avance). Puis j'ai un bouton qui soumet le formulaire et qui est censé renvoyé les éléments checkés
    Petit détail très important le formulaire que je soumets est stocké dans la request, je pourrais si c'est vraiment nécessaire le mettre en session mais dans la philosophie de mon appli ce bean n'a rien à faire en session.


    En fait le pb vient du fait que quand je soumets le formulaire html (j'appelle l'action struts donc), un nouveau formBean est créé puis il est rempli avec les parametres du form html.
    Le pb est que dans le html, la liste d'éléments qui contient les checkbox est représenté dans le formBean par une ArrayList , mais cette ArryList est nulle (normal puisque le formBean vient juste d'ête créé), à la rigueur je peux l'instancier (dans la methode reset ou dans le constructeur) mais je ne connais pas à l'avance le nombre d'élements qu'elle aura, elle resterait donc vide.
    Et c'est donc en voulant remplir l'ArrayList que ca plante puisque struts fait un get à la position i dans une liste qui est nulle ou vide (ce qui revient à peu près au même) et ensuite il fait un setChecked() et donc j'ai soit un NullPointerException (si la liste est null) ou un indexOutofBoundException (si la liste est vide).

    En fait je comprends très bien pourquoi ca ne marche pas mais je ne vois pas comment résoudre le pb si ce n'est en mettant mon formBean en session, du coup il ne serait pas recréé et il comporterait une ArrayList déjà initialisée avec le bon nombre d'éléments.

    Je n'arrive pas à croire que Struts ne permette pas de récupérer une liste de checkbox depuis un formulaire stocké en request; ou alors Struts est vraiment nase !!

    Merci de m'éclairer.

  2. #2
    Membre confirmé
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    167
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 167
    Par défaut
    Dans ce cas de figure, soit tu mets ton bean en session soit dans ton setter, il faut reinitialiser le tableau.

    Dans le deuxième cas, tu dois un setter avec deux attributs: une position et une valeur. Reste à coder une methode qui vérifie la taille de ton tableau.

    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
     
    private void checkIndex(int index) {
    	if (this.selectedUserData == null) {
    		this.selectedUserData = new ArrayList<String>();
    	}
    	while (selectedUserData.size() < index) {
    		selectedUserData.add(selectedUserData.size() + 1, "");
    	}
    }
    public String getSelectedUserData(int index) {
    	checkIndex(index);
     
    	return selectedUserData.get(index);
    }
     
    public void setSelectedUserData(int index, String selectedUserData) {
    	checkIndex(index);
     
    	this.selectedUserData.set(index, selectedUserData);
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 22
    Par défaut
    oui merci, j'avais un peu pensé à cette solution également mais je lui trouve 2 inconvénients :

    - je la trouve que ça fait un peu bidouille histoire de palier les lacunes de struts (cela dit s'il n'y a pas le choix...), je ne comprends pas que Struts ne permette pas de résoudre le pb de facon plus élégante et propre

    - avec cette solution je sais que le ième élément de la liste a été coché mais je ne sais pas à quoi il correspond : en effet supposons que la liste soit une liste de noms issue d'une requête avec des critères bien particuliers, et quand on coche un nom cela signifie qu'on souhaite le supprimer de la base; et bien là je sais juste que l'élément d'indice i a été coché mais ce qui m'intéresse c'est de pouvoir récupérer le nom associé à cet indice; car la liste n'est sauvegardée nullepart. A moins que (je n'ai pas encore essayé et je ne sais pas si c'est possible) je puisse faire un "indexed=true" dans un tag <html:hidden> tout comme je le fais avec <html:checkbox>; ceci me permettrait alors de réupérer le nom de l'élément coché en plus son indice.


    Malgré tout merci pour ton aide.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Par défaut
    as-tu essayé d'utiliser d'utiliser le taglib html:multibox
    et ton form doit être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private String[] maVariable;
    public get/set
    public void reset(....) {
    this.maVariable=new String[0];
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 22
    Par défaut
    Citation Envoyé par mattheox Voir le message
    as-tu essayé d'utiliser d'utiliser le taglib html:multibox
    et ton form doit être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private String[] maVariable;
    public get/set
    public void reset(....) {
    this.maVariable=new String[0];
    }
    Non je n'ai pas essayé d'utiliser une multibox car à ma connaissance ce tag ne sert qu'à afficher une liste de checkbox dont certaines sont déjà cochées au moment de l'affichage; or ce n'est pas ce que je cherche à faire.
    Je veux afficher une liste de checkbox toutes décochées, par contre je veux pouvoir récupérer celles qui ont été cochées par l'utilisateur.

    Ou alors si le tag multibox peut m'aider c'est que je n'ai pas tout compris de son utilisation.

  6. #6
    Membre confirmé
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    167
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 167
    Par défaut
    Certes mais comme tu le dis si bien... a quoi corresponde les valeurs cochées...

    Ce que tu souhaites, ce n'est pas possible en html sans un peu de bidouille. Comme tu le sais, la case à cocher est dans la request que si elle est cochée. Struts ne peux pas aller contre la spec HTML...

    Les solutions sont donc:
    - mettre ta liste en session
    - bidouiller ton setter
    - utiliser des champs cachés + javascript sur ta case à cocher qui affecte une valeur à ce champ.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 22
    Par défaut
    Citation Envoyé par jdvacheron Voir le message
    Certes mais comme tu le dis si bien... a quoi corresponde les valeurs cochées...

    Ce que tu souhaites, ce n'est pas possible en html sans un peu de bidouille. Comme tu le sais, la case à cocher est dans la request que si elle est cochée. Struts ne peux pas aller contre la spec HTML...

    Les solutions sont donc:
    - mettre ta liste en session
    - bidouiller ton setter
    - utiliser des champs cachés + javascript sur ta case à cocher qui affecte une valeur à ce champ.
    ok merci pour ton aide; je crois que je vais choisir le plus simple, à savoir mettre le formBean en session.

    Je ne sais pas bien encore comment marche Struts2, mais j'avais commencé à l'étudier et je me souviens avoir lu que la gestion des checkbox était bien plus simple; manifestement les développeurs de Struts 2 ont compris que les gens en ont marre de se prendre la tete avec les checkbox de Struts1 !!

  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
    La solution proposée par mattheox concernant la multibox devrait fonctionner.
    Avec l'initialisation du tableau de String dans la méthode reset comme il te l'a indiqué, les checkbox seront toutes décochées à l'affichage et il n'est pas utile de connaître la taille à l'avance.

    Et pour récupérer dans le tableau de String défini dans l'ActionForm le nom des éléments cochés, tu peux coder quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <logic:iterate name="uneCollection" id="item">
       <html:multibox property="unTableauDeString">
       	<bean:write name="item" property="nom"/>
       </html:multibox>
       <bean:write name="item" property="nom"/>
    </logic:iterate>
    Quant à ton problème de session, tout dépend ce que contient ton ActionForm.
    Si elle n'a pour propriété que le tableau de String permettant de récupérer le nom des éléments cochés, le scope request doit suffire.
    Si par contre, elle a aussi pour propriété la collection d'éléments sur laquelle tu itères, ce qui signifie sans doute que tu l'initialises dans une Action qui s'exécute avant l'affichage du formulaire, et que tu y accèdes aussi dans l'Action qui s'exécute au submit du formulaire, il faut effectivement la mettre en scope session.
    Peux-tu préciser ton cas ?

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

Discussions similaires

  1. Comment récupérer une liste avec une relation one to many ?
    Par tomlaurent dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/11/2011, 07h16
  2. Réponses: 2
    Dernier message: 19/06/2009, 14h37
  3. Comment faire une liste de checkbox "groupée" ?
    Par Tchupacabra dans le forum Langage
    Réponses: 4
    Dernier message: 05/06/2008, 10h58
  4. Réponses: 2
    Dernier message: 30/08/2007, 09h12
  5. [AJAX+PHP] Récupérer une liste de checkbox en tableau
    Par dorian53 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/04/2007, 10h03

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