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
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
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; } }
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.
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>
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.
Partager