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

Spring Web Java Discussion :

[Spring MVC] taglib spring:bind qui ne binde pas


Sujet :

Spring Web Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Points : 57
    Points
    57
    Par défaut [Spring MVC] taglib spring:bind qui ne binde pas
    Bonjour chers développeurs!

    Je ne peux pas vous fournir d'exemple de code pour l'instant (je l'ai pas sous la main) mais il s'avère que je rencontre un soucis avec la taglib spring:bind. D'habitude pas de problème lorsque je l'utilise sur un input de type text ou autre. Mais en ce moment mon soucis est que, malgrè le bind sur certain de mes input, les valeurs de mon conteneur ne sont pas modifiées (alors que les inputs eux le sont bien) ...

    En attendant de vous fournir mon code est-ce que vous pourriez me donner les limites de l'utilisation de ce taglib. Je peux vous donner les quelques pistes sur lesquelles je travaille:
    • la modification de mes inputs ce fait par du javascript situé à l'extérieur de mes balises spring:bind.
    • les input "binder" sont de type hidden
    • j'utilise le spring binding en lien avec un Controller de type AbstractWizardFormController (ca marche très bien sur la première page avec des boutons radios, mais sur la seconde non)


    Merci d'avance et promis je vous mets le code au plus tot!

    Mohicane

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Points : 57
    Points
    57
    Par défaut
    Alors voici le code ... Ca va faire un gros paté, désolé d'avance!

    La page JSP
    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
     
    <%@ include file="/WEB-INF/vues/includes/header.jsp" %>
    <%@ page import="mova.ged.service.CaracManager" %>
    <%@ taglib uri="/taglibs/spring.tld" prefix="spring" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
     
    <script type="text/javascript">
        var qualificatifs = new Array();
        <%
            String[] qualificatifs = (String[]) request.getAttribute("qualificatifs");
            for (int i = 0; i < qualificatifs.length; i++) {
        %>
        qualificatifs[<%= i %>] = '<%= qualificatifs[i] %>';
        <%
            }
        %>
     
        function getFormElement(id) {
            return document.getElementById(id);
        }
     
        function setCaracLabel(nom_carac, niveau_carac) {
            var qualificatif;
            if (niveau_carac >= qualificatifs.length) {
                qualificatif = qualificatifs[qualificatifs.length - 1] + "(" + niveau_carac + ")";
            } else {
                qualificatif = qualificatifs[niveau_carac - 1];
            }
     
            getFormElement("label_" + nom_carac).value = qualificatif + " " + nom_carac;
        }
     
        function setPointsLabel(points) {
            getFormElement("label_points").value = "Nombre de points: " + points;
        }
     
        function plus(id_carac, nom_carac) {
            var points = getFormElement("points").value;
            if (points > 0) {
                var niveau = getFormElement("niveau" + id_carac).value;
                if (niveau < <%= CaracManager.CARAC_MAX_CREATION_LEVEL %>) {
                    getFormElement("points").value = --points;
                    getFormElement("niveau" + id_carac).value = ++niveau;
     
                    setCaracLabel(nom_carac, niveau);
                    setPointsLabel(points)
                }
            }
        }
     
        function moins(id_carac, nom_carac) {
            var niveau = getFormElement("niveau" + id_carac).value;
            if (niveau > <%= CaracManager.CARAC_MIN_LEVEL %>) {
                var points = getFormElement("points").value;
                getFormElement("niveau" + id_carac).value = --niveau;
                getFormElement("points").value = ++points;
     
                setCaracLabel(nom_carac, niveau);
                setPointsLabel(points)
            }
        }
    </script>
     
    <form name="choix_caracs" method="POST">
        <p>
            <spring:bind path="persoEditeurContainer.points">
            <input type="text" id="label_points" value="Nombre de points: ${status.value}" readonly="readonly"/>
            <input type="hidden" id="${status.expression}" value="${status.value}"/>
            </spring:bind>
        </p>
     
        <p>
            <c:forEach items="${caracs}" var="carac" varStatus="index">
                <spring:bind path="persoEditeurContainer.niveau${carac.id}">
                    <c:choose>
                        <c:when test="${index.index%2 == 0}">
            <div class="editeur_carac_gauche">
                        </c:when>
                        <c:otherwise>
            <div>
                        </c:otherwise>
                    </c:choose>               
                <div class="panel_bouton_plus_moins">
                    <button class="bouton_plus_moins" type="button" onclick="plus('${carac.id}', '${carac.nom}')">+</button>
                    <button class="bouton_plus_moins" type="button" onclick="moins('${carac.id}', '${carac.nom}')">-</button>
                </div>
                    <c:choose>
                        <c:when test="${status.value >= fn:length(qualificatifs)}">
                <input class="carac_field" type="text" id="label_${carac.nom}" value="${qualificatifs[fn:length(qualificatifs) - 1]}(${status.value}) ${carac.nom}" readonly="readonly"/>
                        </c:when>
                        <c:otherwise>
                <input class="carac_field" type="text" id="label_${carac.nom}" value="${qualificatifs[status.value - 1]} ${carac.nom}" readonly="readonly"/>
                        </c:otherwise>
                    </c:choose>
                <input type="hidden" id="${status.expression}" value="${status.value}"/>
            </div>
                </spring:bind>
            </c:forEach>
        </p>
     
        <p style="clear: both;">
            <input type="hidden" name="_page" value="1"/>
            <input type="submit" name="_cancel" value="Début"/>
            <input type="submit" name="_target0" value="Précédent"/>
            <input type="submit" name="_target2" value="Suivant"/>
        </p>
     
    </form>
     
    <%@ include file="/WEB-INF/vues/includes/footer.jsp" %>
    L'AbstractWizardFormController
    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
     
    package mova.ged.web.controllers;
     
    import java.util.Map;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import mova.ged.service.CaracManager;
    import mova.ged.service.MaisonManager;
    import mova.ged.web.containers.PersoEditeurContainer;
    import mova.utils.ModeleMap;
    import org.springframework.validation.BindException;
    import org.springframework.validation.Errors;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.AbstractWizardFormController;
     
    /**
     *
     * @author Mohicane
     */
    public class PersoEditeurController extends AbstractWizardFormController {
     
        private MaisonManager maisonManager;
        private CaracManager caracManager;
     
        @Override
        protected Map referenceData(HttpServletRequest request, int page) throws Exception {
            switch (page) {
                case 0:     return referenceDataChoixMaison(request);
                case 1:     return referenceDataChoixCaracs(request);
            }
     
            ModeleMap modele = new ModeleMap();
            modele.put("maisons", maisonManager.getMaisons());
            modele.put("caracs", caracManager.getCaracs());
     
            return modele;
        }
     
        private Map referenceDataChoixMaison(HttpServletRequest request) throws Exception {
            ModeleMap modele = new ModeleMap();
            modele.put("maisons", maisonManager.getMaisons());
     
            return modele;
        }
     
        private Map referenceDataChoixCaracs(HttpServletRequest request) throws Exception {
            ModeleMap modele = new ModeleMap();
            modele.put("caracs", caracManager.getCaracs());
            modele.put("qualificatifs", CaracManager.QUALIFICATIF_NIVEAU);
     
            return modele;
        }
     
        @Override
        protected void validatePage(Object command, Errors error, int page) {
            PersoEditeurContainer container = (PersoEditeurContainer)command;
            switch (page) {
                case 0: validateChoixMaison(container, error);
                break;
                case 1: validateChoixCaracs(container, error);
                break;
            }
        }
     
        private void validateChoixMaison(PersoEditeurContainer container, Errors error) {
            System.out.println(container.getMaison());
            if (container.getMaison() < 1) {
                error.rejectValue("maison", "field.required", new Object[]{"maison"}, "");
            } else if (container.getMaison() > maisonManager.getMaisons().size()) {
                error.rejectValue("maison", "field.invalid", new Object[]{new Integer(container.getMaison()), "maison"}, "");
            }
        }
     
        private void validateChoixCaracs(PersoEditeurContainer container, Errors error) {
            System.out.println(container.getNiveau1() + " " + container.getPoints());
        }
     
        @Override
        protected ModelAndView processFinish(HttpServletRequest request, HttpServletResponse response, Object command, BindException error) throws Exception {
            return new ModelAndView("redirect:/user/accueil.html");
        }
     
        @Override
        protected ModelAndView processCancel(HttpServletRequest request, HttpServletResponse response, Object command, BindException error) throws Exception {
            return new ModelAndView("redirect:/user/accueil.html");
        }
     
        public MaisonManager getMaisonManager() {
            return maisonManager;
        }
     
        public void setMaisonManager(MaisonManager maisonManager) {
            this.maisonManager = maisonManager;
        }
     
        public CaracManager getCaracManager() {
            return caracManager;
        }
     
        public void setCaracManager(CaracManager caracManager) {
            this.caracManager = caracManager;
        }
     
    }
    La classe du Container
    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
     
    package mova.ged.web.containers;
     
    /**
     *
     * @author Mohicane
     */
    public class PersoEditeurContainer {
     
        private int maison = -1;
        private int niveau1 = 1;
        private int niveau2 = 1;
        private int niveau3 = 1;
        private int niveau4 = 1;
        private int niveau5 = 1;
        private int niveau6 = 1;
        private int niveau7 = 1;
        private int niveau8 = 1;
        private int points = 22;
     
        public int getMaison() {
            return maison;
        }
     
        public void setMaison(int maison) {
            this.maison = maison;
        }
     
        public int getNiveau1() {
            return niveau1;
        }
     
        public void setNiveau1(int niveau1) {
            this.niveau1 = niveau1;
        }
     
        public int getNiveau2() {
            return niveau2;
        }
     
        public void setNiveau2(int niveau2) {
            this.niveau2 = niveau2;
        }
     
        public int getNiveau3() {
            return niveau3;
        }
     
        public void setNiveau3(int niveau3) {
            this.niveau3 = niveau3;
        }
     
        public int getNiveau4() {
            return niveau4;
        }
     
        public void setNiveau4(int niveau4) {
            this.niveau4 = niveau4;
        }
     
        public int getNiveau5() {
            return niveau5;
        }
     
        public void setNiveau5(int niveau5) {
            this.niveau5 = niveau5;
        }
     
        public int getNiveau6() {
            return niveau6;
        }
     
        public void setNiveau6(int niveau6) {
            this.niveau6 = niveau6;
        }
     
        public int getNiveau7() {
            return niveau7;
        }
     
        public void setNiveau7(int niveau7) {
            this.niveau7 = niveau7;
        }
     
        public int getNiveau8() {
            return niveau8;
        }
     
        public void setNiveau8(int niveau8) {
            this.niveau8 = niveau8;
        }
     
        public int getPoints() {
            return points;
        }
     
        public void setPoints(int points) {
            this.points = points;
        }
     
    }
    Je continue les recherche de mon côté et je vous tiens au courant si je trouve la solution.

    Mohicane

    Mohicane

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 59
    Points : 57
    Points
    57
    Par défaut
    Problème résolu!

    Et grosse boulette d'informaticien ... enfin, le tout c'est d'avoir trouvé ou elle se trouvait.
    Donc un spring:bind ne fonctionne que sur des elements de formulaire dont le NOM à pour valeur ${status.expression}. Or, comme vous pouvez le constater dans mon code... c'est à l'ID des éléments que j'ai attribué cette valeur et donc forcément ca marchait pas...

    Mohicane (ou comment passé pour un grand débutant!)

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

Discussions similaires

  1. différence entre Spring MVC et Spring intégré avec JSF
    Par marwa_eniso dans le forum Spring Web
    Réponses: 5
    Dernier message: 15/11/2016, 11h16
  2. Binding qui ne fonctionne pas partout
    Par Invité dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 26/12/2010, 15h42
  3. Différence entre Spring MVC et Spring intégré avec JSF
    Par marwa_eniso dans le forum Frameworks Web
    Réponses: 3
    Dernier message: 31/08/2010, 07h16
  4. Binding qui ne changent pas
    Par kedare dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 14/03/2010, 22h42
  5. Réponses: 6
    Dernier message: 17/06/2008, 12h04

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