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)

Est-il spécifique à primefaces ou que vous faites la même chose avec <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