Bonjour,
j'ai un problème, probablement de conception, lors de l'appel d'un commandButton.
Ce bouton permet, par l'intermédiaire d'un inputText à l'utilisateur de lancer une recherche. En gros ce que je souhaite faire. Quand l'utilisateur a saisi son texte et cliqué sur le bouton, la recherche va se lancer. Cette recherche est une requette SQL sur ma base de donnée. Suivant si elle trouve ou non un resultat, je stock dans une variable un message. Une fois finie elle va me mettre à jour un panelGroup dans ma page qui lui pourra afficher le résultat.
Dans un second temps, je voudrais afficher le message.
Le code de mon bouton est le suivant :
Le code qui est mis à jour sur ma page :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <p:messages id="message" showDetail="true" autoUpdate="true" closable="true" /> <h:panelGrid id="num1" columns="3" cellspacing="10" style="float:right;"> <h:outputLabel for="name" value="SID / Pays :" style="font-weight:bold"/> <p:inputText id="name" value="#{rechercheBean.nom}" /> <p:commandButton id="btn" value="Rechercher" update="display" actionListener="#{rechercheBean.addInfo}"/> </h:panelGrid>
Ce code n'a pas grand interet si ce n'est que finalement c'est lui qui lance la requette SQL et qui la traite, et non le click sur le bouton...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <h:panelGroup id="display"> <ui:repeat var="inst" value="#{rechercheBean.rechercher()}"> ... </ui:repeat> </h:panelGroup>
Le code de mon bean :
Je ne vous met pas la fonction recherche, je ne pense pas qu'elle ai un grand interet...
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 @ManagedBean @ViewScoped public class RechercheBean implements Serializable { private int info; ... public void addInfo(ActionEvent actionEvent) { if (info == 1) { FacesContext.getCurrentInstance().addMessage("message", new FacesMessage(FacesMessage.SEVERITY_INFO,"Test", "Pas de résultats")); } else if (info == 2) { FacesContext.getCurrentInstance().addMessage("message", new FacesMessage(FacesMessage.SEVERITY_FATAL,"Nombre de caractères insuffisants", "Entrez au minimum 3 caractères")); } } }
Ce code fonctionne très bien si ce n'est que l'update est exécuté après l'actionListener. Et moi je voudrais que ce sois l'inverse. Dans mon update je lance ma recherche, j'actualise ma portion de page, et j'associe une valeur à ma variable info (correspondant au message que je veux afficher). Et ensuite je voudrais pouvoir afficher le message correspondant.
Actuellement si je clic une fois : ma page s'actualise nickel, mais aucun message n'apparait.
Je clic une seconde fois, le message correspondant à ma 1ere action apparait.
Et si je continu j'ai toujours un décalage entre le message correspondant à l'ancienne page affichée, et la nouvelle page.
J'ai vu sur un forum que c'était normal que l'update est toujours exécuté après l'actionListener. Mais vu comment j'ai codé je vois pas trop comment y toucher pour avoir le résultat attendu...
Si quelqu'un à une idée... Merci beaucoup
Partager