Je dois effectuer des calculs très longs.
Je souhaite afficher quand même la page avec les champs résultats (des outputText par exemple), et que le bean mette à jour ce champ tout seul quand il a fini ses calculs... Est-ce possible?
Merci
Version imprimable
Je dois effectuer des calculs très longs.
Je souhaite afficher quand même la page avec les champs résultats (des outputText par exemple), et que le bean mette à jour ce champ tout seul quand il a fini ses calculs... Est-ce possible?
Merci
Bonjour,
Si tu utilises RichFaces, tu peux utiliser le composant <a4j:poll> qui va périodiquement interroger le serveur, et mettre à jour les champs calculés en conséquence...
Ca a l'air plutôt sympa ça!
ton message n'est pas claire !
si tu veut affiché le résultat de ta méthode qui fait le calcule par exemple dans un outputText alors:
La méthode que tu appel pour faire le calcul doive retourné un null pour rafraichir la page avec les nouvelle donnéCode:Résultat : <h:outputText value="#{TonBean.resultat}" />
En fait, la méthode appelée est très longue a exécuter, en attendant qu'elle se terline, je veux tout de même afficher le champ aevc une valeur par défaut, et quand la méthode a terminé, elle change elle même la valeur du champ.
Dans mon ancien projet, ce que nous faisions, c'était d'afficher, au moment du clic, une popup d'attente (avec un joli gif animé) qui se fermait une fois le traitement affiché.
Cela se réalise facilement avec un <a4j:commandButton/> et le onclick et oncomplete...
C'est une bonne idée aussi, mais ce que je veux c'est bloquer le moins possible l'affichage, à la rigueur, mettre le petit gif à la place des champs en cours de calcul, et remplacer ce gif par la valeur une fois le calcul terminé.
j'ai essayé ça, mais le champ ne se met pas à jour :
manager.allSize représente la taille d'une liste en cours de remplissageCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <a4j:region> <h:form> <a4j:poll id="poll" interval="500" enabled="true" reRender="poll,grid" /> </h:form> </a4j:region> <h:form> <h:panelGrid columns="2" width="80%" id="grid"> <h:panelGrid columns="1"> <h:outputText value="Test #{manager.allSize}"> </h:outputText> </h:panelGrid> </h:panelGrid> </h:form>
sinon tu peux ajouter une variable boolean et à la fin des calcul tu modifie sa valeur
et tu as ajoute un rendered sur les champs que tu veux afficher à la fin des calculs..
Code:
1
2
3
4
5
6
7 <a4j:commandButton actionListener="{bean.calculer}" reRender="area"/> <a4j:outputPanel id="area"> <h:inputText .. rendered="#{bean.finished}"/> </a4j:outputPanel>
En fait l'opération de calcul est lancée automatiquement dès le chargement de la page.
Il semble que mon allSize ne soit appelé qu'une seule fois, je ne comprend pas pourquoi.
c'est normal:
le getter est appelé plusieurs fois dans les phases JSF.Code:
1
2
3<h:outputText value="Test #{manager.allSize}"> </h:outputText>
Oui, mais le getter devrait bien être appeler toutes les 500ms non?
Le problème c'est que le calcul n'est pas déclenché explicitement depuis le code JSF, mais qu'il se lance dès que le bean est créé, je ne peux donc pas affecter d'action listener à un bouton vu que je n'en ai pas.
tu peux appeler la fonction dans le constructeur du bean .
C'est le cas : la fonction de calcul est appelée dans le constructeur
et alors c'est quoi le problème?
En fait je me suis amusé à mettre une commandButton qui appelle un reRender, mais ça ne fait rien, le getter n'est pas appelé :
Code:
1
2
3
4
5 <a4j:commandButton style="width:120px" id="control" value="Update" reRender="poll, grid"> </a4j:commandButton>
Bon, si on résume :
Dans le constructeur de mon bean j'appelle une méthode calcul() qui dure longtemps.
Cette méthode remplit une liste, ce que je veux c'est afficher la taille de la liste une fois que l'appel à calcul est terminé.
Mon poll ne poll rien du tout...
Pour être certain de ce qu'il se passe j'ai ajouté un commandButton pour rafraichir explicitement le champ, en utilisant aussi reRender.
Dans les deux cas, ça ne fonctionne pas.
fais l'appel dans le poll
Code:<a4j:poll actionListener=#{bean.action} ../>
L'appel à quelle méthode?
Je ne veux appeler ma méthode de calcul qu'une seule fois.