JSF2: action et actionListener
De cette réponse par BalusC ici Les différences entre l'action et l'actionListener, Use actionListener if you want have a hook before the real business action get executed, e.g. to log it, and/or to set an additional property (by <f:setPropertyActionListener>,
. Cependant, quand je décide d'écrire un peu de code pour le tester, le résultat est un peu différent. Voici mon petit code
<h:form id="form">
<h:panelGroup id="mygroup">
<p:dataTable id="mytable" value="#{viewBean.foodList}" var="item">
<p:column>
#{item}
</p:column>
<p:column>
<p:commandButton value="delete"
action="#{viewBean.delete}"
update=":form:mygroup">
<f:setPropertyActionListener target="#{viewBean.selectedFood}"
value="#{item}"/>
</p:commandButton>
</p:column>
</p:dataTable>
</h:panelGroup>
</h:form>
Voici mon haricot
@ManagedBean
@ViewScoped
public class ViewBean {
private List<String> foodList;
private String selectedFood;
@PostConstruct
public void init(){
foodList = new ArrayList<String>();
foodList.add("Pizza");
foodList.add("Pasta");
foodList.add("Hamburger");
}
public void delete(){
foodList.remove(selectedFood);
}
//setter, getter...
}
Selon BalusC, actionListener
est plus adapté ici, mais mon exemple montre sinon.
Le code ci-dessus de l'excellent travail avec action
, mais si je passe à actionListener
, alors il n'a pas assez de travail. Il faudra deux clics pour moi de supprimer une entrée de cette table à l'aide de actionListener
, alors que si j'utilise action
, il supprime une entrée à chaque fois que je clique sur le bouton. Je me demande si le JSF expert peut m'aider à comprendre action
vs actionListener
Note Si je passe à actionListener
, mon delete
méthode devenir public void delete(ActionEvent actionEvent)
<h:commandButton>
?J'ai fait d'utiliser
update
de la p:commandButton
, donc je pense qu'il y a de primefaces, mais je ne suis pas sûr à 100%. Vais essayer de regarder plus en profondeur.M. J4mes a permis de confirmer
h:commandButton
montre le même comportement.OriginalL'auteur Thang Pham | 2011-12-30
Vous devez vous connecter pour publier un commentaire.
Vous êtes confus
action
avecactionListener
. LeactionListener
fonctionne toujours avant leaction
. S'il y a plusieurs action auditeurs, alors qu'ils s'exécutent dans le même ordre qu'ils ont été enregistrés. C'est pourquoi il ne fonctionne pas comme prévu lorsque vous utilisezactionListener
à l'appel de l'action commerciale et<f:setPropertyActionListener>
(préparer) une propriété qui doit être utilisé par l'entreprise à l'action. Ce problème a été signalé et corrigé dans votre question précédente Est-ce Primefaces bug ou d'une Mojarra/MyFaces bug.Ce que vous avez dans le
delete()
méthode est clairement une action commerciale et doit être invoquée paraction
à la place. Une action commerciale suscite généralement un EJB de service et, si nécessaire, définit également le résultat final et/ou accède à un point de vue différent.OriginalL'auteur BalusC
J'ai essayé votre exemple avec l'original JSF de balises
<h:commandButton>
mais j'ai également le même symptôme. Je crois que si vous spécifiezactionListener
attribut et dans le même temps, déclarer un autre auditeur avec<f:setPropertyActionListener>
, l'auditeur dans l'attributactionListener
sera tiré avant les autres.Mise à JOUR: j'ai tester mon hypothèse avec le code suivant:
Changer votre
delete
fonction de celui-ci:Ajouter
<h:outputText id="food" value="#{viewBean.selectedFood}" />
à l'intérieur de<h:panelGroup id="mygroup">
.Vous verrez que la outputText est toujours
Chicken
.selectedFood
est nulle lorsque ladelete
méthode get invoquer. Est-ce à dire queBalusC
dit est faux?ohh noooo!!!!!!!!!!!!!
Il n'est pas mal :P. je pense que vous avez mal compris ses paroles. Il essayait d'expliquer les différents usages de
action
etactionListener
.<f:setPropertyActionListener>
est une sorte deactionListener
et il l'a mentionné à montrer comment vous pouvezset an additional property
dans son exemple. En général,actionListener
toujours me faire virer avantaction
. C'est pourquoi il a toujours travailler avecaction
.il a dit d'utiliser
actionListener if you want have a hook before the real business action get executed
. Donc, est<f:setPropertyActionListener>
pas lehook
avant de l'action entreprise qui estdelete
? Quand j'ai lu cette phrase, j'ai pensé qu'il signifie<f:setPropertyActionListener>
sera exécuté avantdelete
L'action qu'il a mentionné dans
a hook before the real business action
est votredelete
méthode uniquement si elle est déclarée comme telleaction="#{viewBean.delete}"
. Si vous avez déclaré avecactionListener
, il est devenu un auditeur qui n'est plus unreal business action
.OriginalL'auteur Mr.J4mes