Из этого ответа BalusC здесь Различия между action и 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>,
.Однако, когда я решаю написать некоторый код, чтобы проверить это, результат немного отличается.Вот мой маленький код
<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>
Вот мой боб
@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...
}
Согласно BalusC, actionListener
здесь больше подходит здесь, но мой пример показывает в противном случае .
Приведенный выше код прекрасно работает с action
, но если я переключусь на actionListener
, то он не совсем работает.Мне понадобится два клика , чтобы удалить запись в этой таблице, используя actionListener
, а если я использую action
, она удалит запись каждый раз, когда я нажимаю кнопку.Интересно, сможет ли какой-нибудь эксперт JSF помочь мне понять action
против actionListener
Примечание Если я переключусь на actionListener
, мой delete
метод станет public void delete(ActionEvent actionEvent)