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] Binding radiobutton sur base d'une enum


Sujet :

Spring Web Java

  1. #1
    Invité
    Invité(e)
    Par défaut [Spring MVC] Binding radiobutton sur base d'une enum
    Bonjour,

    J'ai dans mon bean commande ('StudentFolder') un bean 'Student' qui possède une énumération pour le sexe.
    Dans mon formulaire, je veux afficher deux boutons radios pour sélectionner le sexe. Mais le binding n'à pas l'air de se faire. Surement parceque j'utilise une enumération mais je ne sais pas (encore) comment résoudre ce problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <!-- Dans mon formulaire -->
    <form:form commandName="studentfolder">
      ...
      <td>
        <!-- Je suppose que 'value' doit-être en rapport avec mon enum.. --> 
        <form:radiobutton path="student.genre" value="M" /> 
        <form:radiobutton path="student.genre" value="F" /> 
        <!--<input type="radio" name="sexe" value="m"> M /
        <input type="radio" name="sexe" value="f"> F-->
      </td>
      ...
    </form:form>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Mon énumération
    public class Student {
      public static enum Genre { Male, Female }
      ...
    }
    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
     
    // Le bean commande
    public class StudentFolder implements Serializable {
     
      private Student student = null;
     
      public Student getStudent() {
        return student;
      }
     
      public void setStudent(Student student) {
        this.student = student;
      }
     
    }
    Merci


    Par après j'aurais à faire la même chose pour depuis une 'java.util.List' ..

  2. #2
    Membre régulier Avatar de dgouyette
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 75
    Points : 89
    Points
    89
    Par défaut
    Ton énumération et ton formulaire ne semblent pas être en accord

    Dans ton énumération, tu utilises

    public static enum Genre { Male, Female }

    Alors que dans ton formulaire tu fais

    <form:radiobutton path="student.genre" value="M" />

    Tu as essayé de faire une énumération du style public static enum Genre { "M", "F" }

    ?

  3. #3
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     <form:radiobutton path="student.genre" value="M" />
    student.genre ici va lié la valeur selectionner par le combo box à une propriété genre du bean student. ( Donc qu'il doit y avoir un setGenre(... ) dans la classe Student ).

    Or ici, si je comprends pense que cela va récupérer une valeur dans la liste de l'enum Genre non ?
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Hikage Voir le message
    Or ici, si je comprends pense que cela va récupérer une valeur dans la liste de l'enum Genre non ?
    Heuu oui (si je comprend bien) ce que je veux c'est que cela corresponde au contenu de mon enum.. (en tout cas que je récupère un bean StudentFolder qui comprend un bean Student sur lequel setGenre(Genre g) à été invoqué avec la bonne valeur)

    Je sais bien que dans mon formulaire ça ne correspond pas avec mon enumération, c'est la raison de mon post...

    Biens ur dans ce cas ci on est pas prés de devoir rajouter un troisième genre (quoique..).

  5. #5
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    Il faut faire qques chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // via referenceData ou autre moyen équivalent 
    protected Map referencesData(){
     
      Map map = new HashMap();
     
      // ajout des différentes valeurs dans le model 
      map.put("genres", Genre.values());
     
      return map;
     
    }
    Dans ta jsp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <c:forearch items="${genres}" var="genre">
    <form:radiobutton path="tonObjetCommand.sexe" value="${genre}"/>
    </c:forearch>
    ou TonObjetCommand possède une méthode setSexe(Genre genre);

    Mais il est encore nécessaire d'ajouter un custom

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder)         throws Exception {
     
    binder.registerCustomEditor(Genre.class, new GenreEditor());
     
     
         }
    Ou GenreEditor est une classe qui étends PropertyEditor, pour traduire une String => Genre, ou le contraire Genre => String
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ok, merci. Dans mon cas un 'PropertyEditor' qui convertiras 'M' en 'Genre.Male' et 'F' en 'Genre.Female' suffiras car je ne pense pas avoir besoin de rajouter des sexes à la volée.

    Mais tu répond à ma seconde question, super. Merci beaucoup Hikage (une fois de plus, à la 100eme je te payerais un verre )

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bon tout compte fais c'est pas si simple d'implémenter PropertyEditor..
    Personne n'a un petit exemple de code histoire de voir ce qui est important ou pas dans l'ensemble des méthodes ?

    Merci

  8. #8
    Invité
    Invité(e)
    Par défaut
    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
    public class DefaultGenreEditor implements PropertyEditor {
     
        private final EventListenerList listeners = new EventListenerList();
     
        private Person.Genre oldValue = null;
        private Person.Genre value = null;
     
        public void setValue(Object value) {
            oldValue = this.value;
            this.value = (Person.Genre) value;
            firePropertyChanged();
        }
     
        public Object getValue() {
            return value;
        }
     
         /** Gets the pproperty value as text ¨*/
        public String getAsText() {
            if ( value==null )
                return "";
     
            switch (value) {
                case Male : return "M";
                case Female : return "F";
            }
            return null;
        }    
     
        /** Set the genre from a text. The genre can be set from one string, this 
         * string must be <i>M</i> and <i>m</i>, <i>F</i> and <i>f</i> or 
         * <tt>null</tt>.
         * @param text - the texte used to set teh genre
         * @throws java.lang.IllegalArgumentException if the text is not know
         */
        public void setAsText(String text) throws IllegalArgumentException {
            if ( "M".equals(text.toUpperCase()) )
                setValue(Person.Genre.Male);
            else if ( "F".equals(text.toUpperCase()) ) 
                setValue(Person.Genre.Female);                 
            else if ( text == null )
                setValue(null);
            else
                throw new IllegalArgumentException("Illegal argument \""+text+"\".");
        }   
     
        public boolean isPaintable() { return false; }
     
        public boolean supportsCustomEditor() { return false; }
     
        public void addPropertyChangeListener(PropertyChangeListener listener) {
            listeners.add(PropertyChangeListener.class, listener);
        }
     
        public void removePropertyChangeListener(PropertyChangeListener listener) {
            listeners.remove(PropertyChangeListener.class, listener);
        }
     
        public PropertyChangeListener[] getPropertyChangeListeners() {
            return listeners.getListeners(PropertyChangeListener.class);                
        }
     
     
     
        // ~ Unsupported methods ---------------------------------------------------
     
        /** @depercated Unsued for this simple property */
        @Deprecated
        public String getJavaInitializationString() {
            throw new UnsupportedOperationException("Not supported for " +
                    Person.Genre.class);
        }
     
        /** @depercated Unsued for this simple property */
        @Deprecated
        public String[] getTags() {
            throw new UnsupportedOperationException("Not supported for " +
                    Person.Genre.class);
        }   
     
        /** @depercated Unsued for this simple property */
        @Deprecated
        public Component getCustomEditor() { 
            throw new UnsupportedOperationException("Not supported for " +
                    Person.Genre.class);
        }    
     
        /** @depercated Unsued for this simple property */
        @Deprecated
        public void paintValue(Graphics gfx, Rectangle box) {
            throw new UnsupportedOperationException("Not supported for " +
                    Person.Genre.class);
        }
     
        // ~ Protected Methods -----------------------------------------------------
        protected void firePropertyChanged() {
            PropertyChangeEvent event = 
                            new PropertyChangeEvent(this, "genre", oldValue, value);
            PropertyChangeListener[] lstnrs = getPropertyChangeListeners();
            for (int i = 0; i < lstnrs.length; i++) {
                lstnrs[i].propertyChange(event);                  
            }
        }
     
    }

  9. #9
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    J'ai du mal a comprendre ta classe

    Pq tu t'amuse avec des PropertyChangeListener?
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  10. #10
    Invité
    Invité(e)
    Par défaut
    C'est juste les listeners qui te dérangent ?
    Les méthodes add et removePropertyChanhgeListener sont définie dans 'PropertyEditor' tu es donc obligé de les avoir. C'est vrai que dans ce cas ça ne me sers pas mais si un jour je fesait une Interface cliente lourde ça me serait utile donc je les ai codée car ce qui est fait n'est plus à faire et ça prend deux secondes à faire.

  11. #11
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    Ok, j'avais pas fait gaffe avant

    J'étends mes Custom Editor de PropertyEditorSupport, donc j'ai pas toutes ces méthodes, et ca revient nettement plus simple
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  12. #12
    Invité
    Invité(e)
    Par défaut
    Ha ok, mais moi je ne connaissais pas encore 'PropertyEditorSupport' .. Je veins de qq annés de Swing intensif et je cherchais un Default ou AbstractPropertyEditor pas un Support..

    Merci pour l'info

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

Discussions similaires

  1. [Spring MVC] Deux formulaires sur une même page
    Par djodjo dans le forum Spring Web
    Réponses: 1
    Dernier message: 20/10/2008, 09h52
  2. Remplir listbox sur base d'une autre listbox
    Par jujujulien dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/05/2007, 08h46
  3. Recherche d'enregistrements sur base d'une liste
    Par michel baily dans le forum SQL
    Réponses: 4
    Dernier message: 31/08/2006, 09h59
  4. [Spring MVC] Plusieurs actions sur le même formulaire
    Par aloha dans le forum Spring Web
    Réponses: 3
    Dernier message: 26/08/2006, 15h22
  5. Sortir un fichier csv sur base d une requete
    Par Freeman_80 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 12/01/2005, 11h21

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