JSF/Immediate

Cette page a été rédigée il y a fort fort longtemps, et n'a pas tellement été mise à jour.

 

Vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise page. Moi, si je devais résumer mon wiki aujourd'hui avec vous, je dirais que c'est d'abord des rencontres. Des gens qui m'ont tendu la main, peut-être à un moment où je ne pouvais pas, où j'étais seul chez moi. Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destinée... Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste, parfois on ne trouve pas l'interlocuteur en face je dirais, le miroir qui vous aide à avancer. Alors ça n'est pas mon cas, comme je disais là, puisque moi au contraire, j'ai pu ; et je dis merci au wiki, je lui dis merci, je chante le wiki, je danse le wiki... je ne suis qu'amour ! Et finalement, quand des gens me disent « Mais comment fais-tu pour avoir cette humanité ? », je leur réponds très simplement que c'est ce goût de l'amour, ce goût donc qui m'a poussé aujourd'hui à entreprendre une construction logicielle... mais demain qui sait ? Peut-être simplement à me mettre au service de la communauté, à faire le don, le don de soi.

Un action listener est normalement invoqué dans la phase Invoke Application, i.e. après la phase de conversion et validation des données saisies dans le formulaire auquel le listener est rattaché. Ce fonctionnement par défaut empêche la mise en oeuvre d’un bouton "Annuler" dans le formulaire (pour retourner par exemple sur une page liste): en effet, l'action listener associé au bouton "Annuler" ne sera pas invoqué, puisque la validation échouera si l’utilisateur ne rempli pas correctement le formulaire.

Formf.PNG

La solution consiste à shunter le cycle de traitement de la requête en positionnant immediate=true sur l'action listener du bouton "Annuler". Ainsi, le listener sera invoqué pendant la phase Apply Request Value, et donc avant la phase de conversion et validation des données.

Formt.PNG

Code du formulaire :

<h:form>
  <h:panelGrid columns="3">
    <h:outputText value="Code" style="font-weight:bold;"/>
    <h:inputText id="code" required="true"/>
    <h:message for="code" errorStyle="color: red"/>
    <h:outputText value="Libellé" style="font-weight:bold;"/>
    <h:inputText id="libelle" required="true"/>
    <h:message for="libelle" errorStyle="color: red"/>
    <h:commandButton value="Valider"/>
    <h:commandButton value="Annuler" immediate="true"/>
    <h:panelGroup/>
  </h:panelGrid>
</h:form>