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

JSF Java Discussion :

Problème de reRender après validation qui échoue


Sujet :

JSF Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 31
    Points : 24
    Points
    24
    Par défaut Problème de reRender après validation qui échoue
    Bonjour,

    Je débute en JSF, et je tombe déjà sur une bizarrerie.
    Etant donné que je n'arrive pas trop à déterminer la source du problème, je vous livre un code source complet, bien que je l'ai malgré tout élagué avec uniquement l'essentiel.

    MonBean
    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
    public class MonBean {
        private String unTexte;
        private List<SelectItem> maListeSelectItems;
        private List<String> maListeSelectedItems;
     
        public MonBean() {
        }
     
        public String getUnTexte() {
            return unTexte;
        }
     
        public void setUnTexte(String unTexte) {
            this.unTexte = unTexte;
        }
     
        public List<SelectItem> getMaListeSelectItems() {
            if (maListeSelectItems == null) {
                maListeSelectItems = new ArrayList<SelectItem>();
                maListeSelectItems.add(new SelectItem("aaa", "aaa"));
                maListeSelectItems.add(new SelectItem("bbb", "bbb"));
                maListeSelectItems.add(new SelectItem("ccc", "ccc"));
                maListeSelectItems.add(new SelectItem("ddd", "ddd"));
            }
     
            return maListeSelectItems;
        }
     
        public void setMaListeSelectItems(List<SelectItem> maListeSelectItems) {
            this.maListeSelectItems = maListeSelectItems;
        }
     
        public List<String> getMaListeSelectedItems() {
            return maListeSelectedItems;
        }
     
        public void setMaListeSelectedItems(List<String> maListeSelectedItems) {
            this.maListeSelectedItems = maListeSelectedItems;
        }
     
        public String selectAllMaListe() {
            if (maListeSelectedItems == null) {
                maListeSelectedItems = new ArrayList<String>();
            } else {
                maListeSelectedItems.clear();
            }
     
            maListeSelectedItems.add("aaa");
            maListeSelectedItems.add("bbb");
            maListeSelectedItems.add("ccc");
            maListeSelectedItems.add("ddd");
     
            return null;
        }
     
        public String unselectAllMaListe() {
            if (maListeSelectedItems != null) {
                maListeSelectedItems.clear();
            }
     
            return null;
        }
     
        public String validate() {
            return null;
        }
    }
    XHTML
    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
    <a4j:form id="monForm">
        <rich:messages ajaxRendered="true" />
     
        <h:inputText id="unTexte" value="#{monBean.unTexte}" required="true"/>
     
        <a4j:region renderRegionOnly="true" >
            <h:selectManyListbox id="maListe" value="#{monBean.maListeSelectedItems}">
                <f:selectItems value="#{monBean.maListeSelectItems}"/>
            </h:selectManyListbox>
     
            <a4j:commandButton id="btnTous" type="button" value="Tous" action="#{monBean.selectAllMaListe}" ajaxSingle="true" reRender="maListe"/>
            <a4j:commandButton id="btnAucun" type="button" value="Aucun" action="#{monBean.unselectAllMaListe}" ajaxSingle="true" reRender="maListe"/>
        </a4j:region>
     
        <a4j:commandButton id="btnValider" type="submit" value="Valider" action="#{monBean.validate}"/>
    </a4j:form>
    La page est assez simple. On a un champ texte obligatoire, une liste que j'initialise dans laquelle on peut sélectionner plusieurs éléments, un bouton pour sélectionner tous les éléments, un autre pour tout désélectionner, et un autre qui appel la fonction validate. Cette dernière sera utilisée ultérieurement, je l'ai mise pour permettre de provoquer la validation du formulaire.

    Voici le problème :
    Au chargement de la page, tout s'affiche convenablement.
    Lorsque je clique sur "Tous", tous les éléments se sélectionnent.
    Qd je clique sur "Aucun", tout se désélectionne.
    Par contre, si je clique sur "Valider" sans rentrer de texte dans le champ texte, j'obtiens un message d'erreur car ce champ est obligatoire.
    Jusque là tout va bien, enfin c'est ce qu'on pourrait penser, mais en réalité si on clique sur le bouton "Tous" ou "Aucun", celui-ci ne fonctionne plus convenablement. Lorsque je passe en mode débug, je vois qu'il passe bien dans la fonction selectAllMaListe ou unselectAllMaListe. Mais lorsque le rerender de la liste a fini son job, les valeurs affichées sont celles qui étaient affichées après la validation qui a échoué juste avant.

    En espérant avoir été clair

    Avez-vous une solution pour que le "Tous" et "Aucun" fonctionnent toujours malgré l'échec d'une validation du formulaire?

    Merci pour votre aide.

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Bonjour,

    J'ai trouvé la solution, dont je vous fait part.
    Je m'attendais à devoir modifier le fichier XHTML, mais en réalité j'ai du modifier le bean. Il s'agit à première vue d'un bug de JSF avec les liste de sélection et ajaxSingle="true".

    MonBean
    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
    public class MonBean {
        private String unTexte;
        private List<SelectItem> maListeSelectItems;
        private List<String> maListeSelectedItems;
     
        public MonBean() {
        }
     
        public String getUnTexte() {
            return unTexte;
        }
     
        public void setUnTexte(String unTexte) {
            this.unTexte = unTexte;
        }
     
        public List<SelectItem> getMaListeSelectItems() {
            if (maListeSelectItems == null) {
                maListeSelectItems = new ArrayList<SelectItem>();
                maListeSelectItems.add(new SelectItem("aaa", "aaa"));
                maListeSelectItems.add(new SelectItem("bbb", "bbb"));
                maListeSelectItems.add(new SelectItem("ccc", "ccc"));
                maListeSelectItems.add(new SelectItem("ddd", "ddd"));
            }
     
            return maListeSelectItems;
        }
     
        public void setMaListeSelectItems(List<SelectItem> maListeSelectItems) {
            this.maListeSelectItems = maListeSelectItems;
        }
     
        public List<String> getMaListeSelectedItems() {
            return maListeSelectedItems;
        }
     
        public void setMaListeSelectedItems(List<String> maListeSelectedItems) {
            this.maListeSelectedItems = maListeSelectedItems;
        }
     
        public String selectAllMaListe() {
            clearComponent(FacesContext.getCurrentInstance().getViewRoot().findComponent("monForm:maListe"));
     
            if (maListeSelectedItems == null) {
                maListeSelectedItems = new ArrayList<String>();
            } else {
                maListeSelectedItems.clear();
            }
     
            maListeSelectedItems.add("aaa");
            maListeSelectedItems.add("bbb");
            maListeSelectedItems.add("ccc");
            maListeSelectedItems.add("ddd");
     
            return null;
        }
     
        public String unselectAllMaListe() {
            clearComponent(FacesContext.getCurrentInstance().getViewRoot().findComponent("monForm:maListe"));
     
            if (maListeSelectedItems != null) {
                maListeSelectedItems.clear();
            }
     
            return null;
        }
     
        public String validate() {
            return null;
        }
     
        private static void clearComponent(UIComponent pComponent) {
            EditableValueHolder editableValueHolder = (EditableValueHolder) pComponent;
            editableValueHolder.setSubmittedValue(null);
            editableValueHolder.setValue(null);
            editableValueHolder.setValid(true);
        }
    }

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/03/2014, 12h03
  2. champ qui se vide après validation
    Par sam01 dans le forum Langage
    Réponses: 2
    Dernier message: 20/01/2013, 19h31
  3. Problème rafraîchissement après validation.
    Par midos_ab dans le forum JSF
    Réponses: 1
    Dernier message: 11/10/2011, 15h34
  4. Problème d'acent après validation d'un textarea
    Par BRUNO71 dans le forum Langage
    Réponses: 2
    Dernier message: 20/04/2011, 15h12
  5. Réponses: 8
    Dernier message: 07/12/2005, 14h44

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