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 :

multibox selection valeur avec pagination


Sujet :

Struts 1 Java

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut multibox selection valeur avec pagination
    Bonjour,

    Dans ma jsp, j'utilise une multibox dans un logic-iterate.
    Ma jsp contient aussi un syteme de pagination lorsque ma collection contient plus de 15 elements.

    J'ai une case à cocher "Selectionner tout" qui permet de cocher toutes les cases de la collection ( meme les valeurs des autres pages).

    Lorsque je clique sur un bouton, je voudrais recuperer toutes les valeurs des cases à cocher y compris celle qui ne sont pas affiché à cause de la pagination ! et c'est la ou est mon probleme.Je recupere bien les valeurs des cases à cocher des éléments affiché dans ma page mais pas celle des autres pages...

    comment puis je faire svp ?

    page jsp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <logic:iterate  scope="request" name="liste" id="valeurs">
    <html:multibox property="selectedAccord">
     <bean:write name="valeurs" property="accIdAccord"/>
    </html:multibox>
    J'ai bien un tableau de String dans mon actionForm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private String[] selectedAccord;
    Merci

    [EDIT]
    je viens de me rendre compte que je perds aussi toutes les selections des que je change de page...
    j'aimerais avoir le meme système qu'utilise Gmail, lorsqu'on selectionne "Tous",toutes les cases se cochent. Si on change de page,qu'on selectionne quelques elements et qu'on revient sur la page précedente, tous les elements sont à nouveau cochés.

  2. #2
    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
    Pour pouvoir t'aider, il faudrait préciser comment tu gères la pagination et le fait de cocher toutes les cases.

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    oups pardon..

    pour la pagination, je passe à ma jsp une liste contenant le nombre exacte d'élément que je souhaite afficher.

    pour cocher toutes les cases,dans mon action je remplis mon tableau qui contient les elements sélectionés (selectedAccord) par toutes les valeurs de ma liste(non paginée).

    ce n'est pas possible d'avoir un champs String selectedAccord dans mon objet Valeur qui soit rempli si je coche la case ?
    Exemple

    Objet Valeur
    String selectedAccord

    ma liste contient une liste de Valeur

    dans ma jsp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <logic:iterate  scope="request" name="liste" id="Valeur">
    <html:multibox name="Valeur" property="selectedAccord">
     <bean:write name="Valeur" property="accIdAccord"/>
    </html:multibox>

  4. #4
    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
    Citation Envoyé par mikees Voir le message
    pour la pagination, je passe à ma jsp une liste contenant le nombre exacte d'élément que je souhaite afficher.
    Cela ne m'éclaire pas du tout sur la gestion de la pagination.

    Citation Envoyé par mikees Voir le message
    ce n'est pas possible d'avoir un champs String selectedAccord dans mon objet Valeur qui soit rempli si je coche la case ?
    Si c'est possible mais, dans ce cas, il faut utiliser le tag html:checkbox à la place du tag html:multibox.

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    Pour la pagination

    dans mon action j'ai une methode rechercher où je recupere la liste de tous mes elements. je fais ensuite une sous-liste contenant le nombre d'element à afficher par page. Je passe cette sous liste à ma jsp.

    Dans ma jsp, j'ai des liens pour chaque numéro de page qui submit le
    formulaire et va dans ma methode rechercher qui font ma sous-liste.

    Dans Action

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    listAccordDisplay = new ArrayList(listAccord.subList(pagerStart-1, pagerEnd));
    request.setAttribute("liste", listAccordDisplay);
    action lorsque je clique sur "tout selectionner"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (Iterator iterator = listAccord.iterator(); iterator.hasNext();) {
    HashMap object = (HashMap) iterator.next();
    object.put("selectedAccord", "yes");
    }
    Dans ma jsp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <logic:iterate  scope="request" name="liste" id="valeurs">
    <html:checkbox name="valeurs" property="selectedAccord" >    
    </html:checkbox>
    Dans mon Objet "valeurs", j'ai bien une propriété selectedAccord.

    Lorsque je clique sur "selectionner Tout", j'ai bien toutes mes cases cochés, par contre si je déselectionne une des cases, que je vais sur une autre page et que je reviens, toutes mes cases sont à nouveaux cochés ! J'ai toujours le champs selectedAccord de mes objets à "yes"..


    Merci

  6. #6
    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'ai oublié de préciser que si tu veux que le fait de cocher des cases provoque la mise à jour d'une propriété des objets constituant la liste, il faut que la liste soit une propriété de l'ActionForm et donc l'initialiser via le setter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TonActionForm tonActionForm=(TonActionForm) form ;
    tonActionForm.setListe(listAccordDisplay) ;
    Il faut également ajouter l'attribut indexed="true" dans le tag html:checkbox pour qu'il connaisse l'index de l'objet à modifier dans la liste.
    Il faut donc aussi ajouter getter et setter indexé sur cet objet dans l'ActionForm.

    Sinon, le plus simple serait de définir la propriété selectedAccord de l'objet Valeur de type boolean et de coder le tag html:checkbox comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <logic:iterate name="nomDuFormBean" name="liste" id="valeur">
       <html:checkbox name="valeur" property="selectedAccord" indexed="true"/>
    </logic:iterate>
    selectedAccord aura pour valeur true si la checkbox est cochée et false si non cochée.

    Si tu ne veux pas avoir à coder getter et setter indexé dans l'ActionForm, tu peux aussi coder ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <logic:iterate name="nomDuFormBean" property="liste" id="valeur" indexId="index">
       <html:checkbox property="liste[${index}].selectedAccord"/>
    </logic:iterate>
    L'EL ${index} fonctionnera si tu es en J2EE 1.4.
    Sinon, il faut utiliser la tld struts-html-el.tld :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <logic:iterate name="nomDuFormBean" property="liste" id="valeur" indexId="index">
       <html-el:checkbox property="liste[${index}].selectedAccord"/>
    </logic:iterate>
    ou alors utiliser les tags nested qui gèrent automatiquement les propriétés indexées.

    EDIT : par contre, il reste toujours le problème lié à la pagination car avec cette méthode, c'est la sous-liste qui sera mise à jour et non la liste.
    Il faudrait mettre à jour la liste à partir de la sous-liste pour garder l'info des checkbox cochées ou non.

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    J'ai éssayé mais ça ne fonctionne pas plus pour l'instant.

    Pour info, j'avais oublié de préciser que l'objet Valeur est un Hashmap et non une de mes classes.

    j'initialise ma liste d'objet en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public HashMap getMap(){
    HashMap map = new HashMap();
    ................
    map.put("selectedAccord", Boolean.valueOf(false));
    }
    Dans mon Action

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(..) 
    listeAccord.add(getMap())
    [EDIT] j'initialise ma liste juste une seule fois..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    listAccordDisplay = new ArrayList(listAccord.subList(pagerStart-1, pagerEnd));
    rechercheForm.setListSelect(listAccordDisplay);
    dans mon actionForm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private ArrayList listSelect = new ArrayList();
    public ArrayList getListSelect() {
          return listSelect;
    }
    public void setListSelect(ArrayList listSelect) {
    	this.listSelect = listSelect;
    }
    public HashMap getValeurs(int i) {
    		return (HashMap) this.listSelect.get(i);
    	}
    	public void setValeurs(int i,HashMap accord) {
    		this.listSelect.set(i, accord);
    	}
    dans ma jsp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <logic:iterate name="accordRechercheForm" property="listSelect" id="valeurs" indexId="index">
    <html:checkbox name="valeurs" property="selectedAccord" indexed="true"/>
    mais ça fait toujours pareil...

    j'ai éssayé en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:checkbox name="valeurs" property="listSelect[${index}].selectedAccord" indexed="true"/>
    mais il me dit :
    Invalid argument looking up property listSelect[${index}].selectedAccord of bean valeurs
    en mettant <html-el:checkbox , ma jsp me dit qu'il ne reconnait pas ce tag...

  8. #8
    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
    Si tu as une List de HashMap, la propriété selectedAccord n'existe pas.
    Donc le code suivant ne peut pas fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:checkbox name="valeurs" property="selectedAccord" indexed="true"/>
    Tu devrais même avoir une erreur.

    En fait, c'est la clé de la HashMap qui a pour valeur selectedAccord.
    Ce serait bien plus simple avec une List d'objets.

  9. #9
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    désolé de répondre que maintenant mais j'étais en congé

    comme je ne pouvais pas casser tout le code en utilisant un objet à la place de la hashmap, je me suis débrouillé autrement en ajoutant une List dans mon actionForm qui va stocker pour chaque page un tableau des valeurs selectionnées.

    par contre, lorsque je sélectionne un ou plusieurs élements, je récupere bien dans mon tableau la valeur des éléments. Si je déselectionne tous les élément il me garde en mémoire les éléments précédents ! Si je déselectionne tous les éléments sauf 1 alors il me récupere bien qu'1 seul élément ! Struts ne gére pas le faite qu'il n'y a plus d'élément coché ?

    Merci

  10. #10
    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
    Le problème n'est pas lié à Struts.
    En html, la valeur d'une checkbox est transmise à la soumission du formulaire seulement si elle est cochée.

    En Struts, pour contourner ce problème, on réinitialise les valeurs dans la méthode reset de l'ActionForm.

    Si par exemple, la propriété est de type String[], il faut coder la méthode reset comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void reset(ActionMapping mapping, HTTPServletRequest request)
    {
       this.boxes=new String[0];
    }
    Ainsi, comme la méthode reset est appelée en premier à la soumission du formulaire, toutes les checkbox seront décochées et ensuite, quand le setter sera exécuté, les valeurs des checkbox cochées rempliront le tableau de String.

  11. #11
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    j'avais vu dans la FAQ qu'il fallait réinitialiser les valeurs dans le reset
    Merci en tout cas pour ton aide qui m'a été tres précieuse

    Je peux fermer la discussion..

    merci

  12. #12
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    J'ouvre à nouveau cette discussion car j'ai un autre petit souci lié aux multibox.

    J'aimerais afficher une popup d'erreur si aucune case n'est cochée dans toutes les pages lorsque l'utilisateur clique sur un bouton.
    étant donné que les selections sont setter à la soumission du formulaire, je dois donc envoyer de mon action un parametre à ma jsp pour lui dire de m'afficher un popup non ? comment est ce que je peux faire ça ?

    Désolé si ça peut paraitre tres simple mais je débute vraiment sur struts et servlet/jsp..

  13. #13
    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
    Dans l'Action, tu pourrais mettre un attribut dans le scope, tester la valeur de cet attribut dans la jsp via le tag logic:equal et en fonction de sa valeur, déclencher un évènement onload sur le tag body pour afficher un message d'erreur via une alert javascript.

  14. #14
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    Bonjour,

    j'ai fait autrement car je ne voyais pas vraiment comment faire pour déclencher un évenement onload dans le tag body en fonction du <logic:equal...> car pour moi si on met un <body onload="mafunction()"> cela va forcément appeler la fonction mafunction().

    j'ai donc mis un onload dans mon body qui appelle une fonction qui va directement tester si un attribut est présent dans ma request.

    Merci

  15. #15
    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
    Tu pouvais faire tout simplement comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <logic:equal name="noBoxesChecked" value="true">
       <body onload="mafunction();">
    </logic:equal>
    <logic:equal name="noBoxesChecked" value="false">
       <body>
    </logic:equal>

Discussions similaires

  1. Gérer un select into avec aucune valeur trouvée
    Par randriano dans le forum SQL
    Réponses: 18
    Dernier message: 19/03/2008, 19h58
  2. [CONCAT]concaténer une valeur avec résultat d'un SELECT
    Par Mat_DZ dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/01/2008, 12h27
  3. [html:select] valeur par défaut avec liste dynamique
    Par CPI_en_mousse dans le forum Struts 1
    Réponses: 3
    Dernier message: 02/07/2007, 14h29
  4. Select IN avec un couple de Valeurs
    Par GregHory dans le forum DB2
    Réponses: 3
    Dernier message: 07/03/2007, 16h35
  5. [MySQL] Récupérer une valeur avec SELECT sensible à la casse
    Par nuphius dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/01/2007, 15h21

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