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

Taglibs Java Discussion :

Problème de selection multiple checkbox avec spring mvc


Sujet :

Taglibs Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    mars 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 56
    Points : 34
    Points
    34
    Par défaut Problème de selection multiple checkbox avec spring mvc
    Bonjour,

    J'ai un soucis avec la sélection multiple par checkbox sur un résultat de recherche paginée et triable. Cela fait quelques jours que je tente de résoudre le problème mais rien n'y fait, je sèche un peu là...

    Actuellement j'arrive sans aucun soucis à afficher mon tableau de résultat de recherche avec des checkbox et avec la pagination et le trie sur différents attributs possible, j'arrive sans aucun problème aussi à récupérer la sélection courante dans mon contrôleur. Mon principal problème est que lorsqu'une selection est faite et que l'utilisateur effectue un tri sur une colonne ou qu'il change de page paginée il pert sa sélection. En regardant un peu la doc displaytag il semblerait qu'il faille ajouter l'option de la form afin justement de passer les sélections en cours lors d'un tri ou d'un parcours d'une page paginée suivante, mais mon soucis est que cela à pour effet d'effectuer une soumission du formulaire et donc de lancer mes validator alors que l'utilisateur n'a pas fini sa sélection, comment pourrais je remédier à cela ?
    En fait le form pose problème, y aurait il une façon d'éviter d'effectuer la soumission et de conserver les selections tout en parcourant le tableau avec trie et sur les pages paginées ? ( car le requestURI ne suffit pas)
    ou qu'elle serait la meilleur façon pour éviter que mon contrôleur considère ce type de soumission comme une validation de mon form ?

    (pour information la sélection s'effectue sur plusieurs pages contrôlée par le même contrôleur)

    Voici le code pour aider :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    <spring:nestedPath
        path="subForm">
        <portlet:actionURL var="submitAudience">
            <portlet:param name="action" value="addAudience" />
            <portlet:param name="_page" value="${page}" />
        </portlet:actionURL>
        <form name="${namespace}AddAud" method="post"
            action="${submitAudience }">
     
    ....
    <spring:bind path="subKey">
    <table border=0 cellpadding=5 width="90%">
        <tr>
            <td><d:table name="${userList}" id="user" sort="list" 
    requestURI="${submitAudience}" form="${namespace}AddAud"
                    export="false" class="dataTable" defaultsort="2" 
    defaultorder="ascending" cellspacing="1"
                    pagesize="${nbItemsToShow}"   
     decorator="org.displaytag.decorator.TotalTableDecorator">
     
                    <d:column title="Select">
                        <input type="checkbox" name="${status.expression}" 
        value="${user.userId}" />
                    </d:column>
     
                    <c:forEach items="${attrDisplay}" var="displayAttr">
                        <d:column titleKey="news.label.${displayAttr}" 
    sortable="true" headerClass="sortable">
                            <c:forEach items="${user.attributes[displayAttr]}"
                            var="attrValue">
                                <c:out value="${attrValue}" />
                            </c:forEach>
                        </d:column>
                    </c:forEach>
     
     
                    <d:setProperty name="paging.banner.item_name"
                        value="${tit}" />
                    <d:setProperty name="paging.banner.items_name"
                        value="${tit}s" />
     
                </d:table></td>
            </tr>
            <tr>
                <td><span 
    class="portlet-msg-error">${status.errorMessage}</span></td>
            </tr>
        </table>
        </spring:bind>
    subKey est un tableau de string, une propriété de l'objet subForm

    et le controlleur :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
     
     
    public class SubcribeController extends AbstractWizardFormController {
     
       ...
     
        public SubcribeController() {
            setCommandClass(SubForm.class);
            setCommandName(Constants.CMD_SUB_F);
            setAllowDirtyBack(true);
            setAllowDirtyForward(false);
            setSessionForm(true);
            setPageAttribute(Constants.ATT_PAGE);
            setPages(new String[] {Constants.ACT_ADD_AUDIENCE, 
    Constants.ACT_ADD_AUDIENCE, Constants.ACT_ADD_AUDIENCE});
     
        }
     
        public void afterPropertiesSet() throws Exception {
            ...
        }
     
        @Override
        protected void processFinish(
                ActionRequest request, ActionResponse response,
                Object command, BindException errors)
        throws Exception {
            SubForm cmd= (SubForm)command;
            this.subService.addSubscribers(cmd.getSubKey(), 
    cmd.getSubscriber());
     
    response.setRenderParameter(Constants.ATT_CTX_ID,String.valueOf(cmd.getSubscriber().getCtxId()));   
     
            response.setRenderParameter(Constants.ACT, 
    Constants.ACT_VIEW_AUDIENCE+cmd.getSubscriber().getCtxType());
        }
     
        @Override
        protected void processCancel(
                ActionRequest request, ActionResponse response,
                Object command, BindException errors)
        throws Exception {
            SubForm cmd= (SubForm)command;                 
            response.setRenderParameter(Constants.ACT, 
    Constants.ACT_VIEW_AUDIENCE+cmd.getSubscriber().getCtxType());
     
    response.setRenderParameter(Constants.ATT_CTX_ID,String.valueOf(cmd.getSubscriber().getCtxId()));
     
        }
     
        @Override
        protected void validatePage(
                Object command, Errors errors, int page, boolean finish) {
     
            SubForm subF = (SubForm)command;
            SubValidator subValidator = (SubValidator) getValidator();
            if (finish) {
                this.getValidator().validate(command, errors);
                return;
            }
            switch (page) {
            case 0: subValidator.validateSearch(subF, errors);        break;
            case 1:  subValidator.validateSubscriberKey(subF, errors); break;
            }
     
        }
     
        @Override
        protected Object formBackingObject(PortletRequest request) throws 
    Exception {
            SubForm subForm = new SubForm();
            String ctx = request.getParameter(Constants.ATT_CTX);
            subForm.getSubscriber().setCtxType(ctx);
     
    subForm.getSubscriber().setCtxId(PortletRequestUtils.getLongParameter(request, 
    Constants.ATT_CTX_ID));
            return subForm;
        }
     
        @Override
        protected Map referenceData(PortletRequest request, Object command, 
    Errors errors, int page) throws Exception {
     
            boolean isGrp = ((SubForm) command).getSubscriber().getIsGroup() 
    == 1 ? true : false;
            Long ctxId = ((SubForm) command).getSubscriber().getCtxId();
            String ctx = ((SubForm) command).getSubscriber().getCtxType();
     
            if (!this.um.isUserAdminInCtx(ctxId, ctx, 
    request.getRemoteUser())) {
                log.warn("SubcribeController:: user " + 
    request.getRemoteUser() + " has no role admin");
                throw new PortletSecurityException("you are not authorized 
    for this action"); 
            }
     
            Map<String, Object> model = new HashMap<String, Object>();
            if (ctx.equalsIgnoreCase(NewsConstants.CTX_C)) {
                model.put(Constants.CMD_CATEGORY, 
    this.cm.getCategoryById(ctxId));
            } else if (ctx.equalsIgnoreCase(NewsConstants.CTX_T)) {
                model.put(Constants.CMD_TOPIC, this.tm.getTopicById(ctxId));
                Long cId = this.tm.getTopicById(ctxId).getCategoryId();
                model.put(Constants.ATT_CNAME, 
    this.cm.getCategoryById(cId).getName());
            }
            model.put(Constants.ATT_PM,
                    RolePerm.valueOf(this.um.getUserRoleInCtx(ctxId, ctx, 
    request.getRemoteUser())).getMask());
            if (page == 0) {
                model.put("subTypeList",  SubscribeType.values());
            } else if (page == 1) {
                model.put(Constants.CMD_SUB_F, (SubForm) command);
                if (isGrp) {
                    groups = this.subService.searchGroups(((SubForm) 
    command).getToken());
                    model.put("grps", groups);
                } else {
                    users = this.um.findPersonsByToken(((SubForm) 
    command).getToken());
                    model.put(Constants.ATT_USER_LIST, users);
                }
                model.put(Constants.ATT_LDAP_DISPLAY, 
    um.getLdapUserService().getSearchDisplayedAttributes());
                model.put(Constants.ATT_NB_ITEM_TO_SHOW, this.nbItemsToShow);
                model.put(Constants.ERRORS, errors);            
            } else if (page == 2) {
                model.put(Constants.CMD_SUB_F, (SubForm) command);
                List<EscoUser> lu = null;          
                if (((SubForm) command).getSubscriber().getIsGroup() == 0) {
                    lu = new ArrayList<EscoUser>();
                    for (String id : ((SubForm) command).getSubKey()) {
                        for (IEscoUser user : users) {
                            if (user.getUserId().equalsIgnoreCase(id)) {
                                lu.add((EscoUser) user);
                            }
                        }
                    }
                }
                model.put(Constants.ATT_USER_LIST, lu);
                model.put(Constants.ATT_LDAP_DISPLAY, 
    um.getLdapUserService().getSearchDisplayedAttributes());
            }
            return model;
        }
     
        @Override
        protected ModelAndView renderInvalidSubmit(RenderRequest request, 
    RenderResponse response)
        throws Exception {
            return null;
        }
        @Override
        protected void handleInvalidSubmit(ActionRequest request, 
    ActionResponse response)
        throws Exception {
            log.warn("SubcribeController:: handleInvalidSubmit: goto home 
    page");
            response.setRenderParameter(Constants.ACT, 
    Constants.VIEW_NEWSSTORE);
     
        }
     
    ...
     
        @Override
        protected boolean isFormSubmission(PortletRequest request) {
            for (Enumeration params = request.getParameterNames(); 
    params.hasMoreElements();) {
                String paramName = (String) params.nextElement ();
                if (paramName.startsWith(PARAM_TARGET) || 
    paramName.equals(PARAM_FINISH) || paramName.equals(PARAM_FINISH))   {
                    return true;
                }
            }
            return super.isFormSubmission (request);
        }
     
    }

  2. #2
    Nouveau membre du Club
    Inscrit en
    mars 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 56
    Points : 34
    Points
    34
    Par défaut
    En fait les href des pages paginées ont ce rendu :
    javascript:displaytagform('Pluto_n218_AddAud',[{f:'d-49809-o',v:''},{f:'action',v:['addAudience']},{f:'form-submit',v:['true']},{f:'_page',v:['1']},{f:'d-49809-p',v:'2'},{f:'d-49809-s',v:''},{f:'_target1',v:['Suivant']}])

    et la soumission ne fonctionne pas je ne sais pas pourquoi car lors d'un changement de page cela revient toujours sur la première page. C'est comme si les paramètres de pages n'étaient pas retransmit à la jsp.

    Quelqu'un aurait une alternative à ce problème ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    mars 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 56
    Points : 34
    Points
    34
    Par défaut
    Mon alternative est donc de supprimer le form dans la table et de n'utiliser que le submit lors d'une selection, et lors du changement de page je créé des inputs hidden des valeurs saisies des autres pages.

  4. #4
    Membre confirmé

    Inscrit en
    avril 2005
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : avril 2005
    Messages : 317
    Points : 544
    Points
    544
    Par défaut
    J'ai eu un problème semblable
    http://www.mail-archive.com/displayt.../msg03724.html

    J'ai du télécharger les sources de displayTag pour corriger le bug.
    En fait, il semble que les checkbox ne fonctionne que quand le banner est au dessus du tableau

    A voir si ca correspond aussi à ton cas...

  5. #5
    Nouveau membre du Club
    Inscrit en
    mars 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 56
    Points : 34
    Points
    34
    Par défaut
    Le banner est au dessus de mon tableau, et l'option form ne fonctionne pas correctement en fait, mais les checkbox sont bien transmises, mon problème est plus lors d'un changement de page ou d'un sort sur une colonne je reste toujours sur la première page et/ou toujours sur le tri de la même colonne, comme si les attributs n'étaient pas transmis.


    En fait voici les modifs que j'ai apportées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <d:table name="${userList}" id="user" sort="list" requestURI="${submitAudience}" requestURIcontext="true" 
    													form="${namespace}AddAud" keepStatus="true"
    													export="false" class="dataTable" defaultsort="2" defaultorder="ascending" cellspacing="1" 
    													pagesize="${nbItemsToShow}"	decorator="org.displaytag.decorator.TotalTableDecorator">
     
    													<d:column title="Select">
    														<input type="checkbox" name="${status.expression}"
    															value="${user.userId}"
    															onChange="document.forms['${namespace}AddAud'].submit()"
    															<c:forEach items="${subForm.subKey}" var="userid">
    																<c:if test="${userid == user.userId}">checked</c:if>
    															</c:forEach> />
    													</d:column>
    Et si j'enlève l'option form et que j'ajoute des input hidden de mes checkbox selectionnées sur les pages précédentes ça fonctionne. Mais je trouve cela pas vraiment propre.

  6. #6
    Nouveau membre du Club
    Inscrit en
    mars 2004
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : mars 2004
    Messages : 56
    Points : 34
    Points
    34
    Par défaut
    En fait mon problème est autre, il est plus lié à spring avec mon controller et le fait d'effectuer de la pagination.

    Avec un controller de type AbstractWizardFormController comment faire, pour un form en post, pour que mon controller effectue un submit de la page courante lors de la navigation entre les pages paginées de ma recherche sans qu'il n'effectue la validation de la page courante ?

    En d'autre terme lors de la navigation sur les pages paginée qu'il effectue comme un form submit en méthod get mais avec un submit post de mes checkbox. Y a t'il une façon d'indiquer cela dans mon controller ?

    merci

Discussions similaires

  1. Problème d'éxecution de mon application Spring MVC avec Tomcat
    Par Eric_beauvais dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 29/10/2013, 19h01
  2. [MVC] Problème d'exécution avec Spring MVC
    Par noumery dans le forum Spring Web
    Réponses: 5
    Dernier message: 20/09/2012, 17h41
  3. [GateIn] Problème de contexte avec spring MVC
    Par FunkyBreizh dans le forum Portails
    Réponses: 0
    Dernier message: 07/08/2010, 13h22
  4. Problème de select multiples dans plusieurs tables
    Par superseb801 dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/05/2007, 02h22
  5. selection de checkbox avec un tableau pour nom
    Par Benedetto dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 31/07/2006, 17h23

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