JSF2 : action and actionListener

标签 jsf jsf-2 primefaces action actionlistener

来自 BalusC 的这个回答 Differences between action and 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>

这是我的 bean

@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)

最佳答案

你在混淆actionactionListener . actionListener始终在 action 之前运行.如果有多个 Action 监听器,那么它们将按照注册时的相同顺序运行。这就是为什么当您使用 actionListener 时它无法按预期工作的原因。调用业务操作和 <f:setPropertyActionListener>设置(准备)将由业务操作使用的属性。这个问题在你之前的问题中被指出并修复了 Is this Primefaces bug or Mojarra/MyFaces bug .

无论你在 delete() 中有什么方法显然是一项业务操作,应由 action 调用反而。业务操作通常会调用 EJB 服务,必要时还会设置最终结果和/或导航到不同的 View 。

关于JSF2 : action and actionListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8683211/

相关文章:

jsf - 如何在 JSF 中正确使用组件绑定(bind)? ( session 范围 bean 中的请求范围组件)

html - PrimeFaces:布局完整页面设置为“false”导致页脚消失

java - JSF 2.0 : @ResourceDependency does not work when adding UIComponent programmatically

java - PrimeFaces:在 Javascript 中获取当前列的排序顺序

java - JSF 页面的编码和解码

java - Lightbox 不添加 jquery-plugins.js,而添加 Tooltip 则添加

java - JSF 2.0 将动态表单保存到数据库

jsf - p :fileUpload does not set uploaded file in backing bean

jsf - Primefaces BlockUI 不工作

charts - Primefaces 6.2 条形图数据提示格式