我可以从<;调用多个方法吗;p:ajax事件=selectlistner=method1,method2>;?

我可以从<;调用多个方法吗;p:ajax事件=selectlistner=method1,method2>;?,ajax,jsf,primefaces,Ajax,Jsf,Primefaces,我可以从ajax事件选择侦听器中调用多个方法吗 <p:tree value="#{ddTreeBean.root}" var="node" dynamic="true" selectionMode="single" selection="#{ddTreeBean.selectedNode}"> <p:ajax event="select" listener="#{data2.refresh}" updat

我可以从ajax事件选择侦听器中调用多个方法吗

<p:tree value="#{ddTreeBean.root}" var="node" dynamic="true"
                selectionMode="single" selection="#{ddTreeBean.selectedNode}">

<p:ajax event="select" listener="#{data2.refresh}"
                    update=":pchartId,:panelId">
                    </p:ajax>
        <p:treeNode type="node" expandedIcon="folder-open"
                    collapsedIcon="folder-collapsed">
                    <h:outputText value="#{node.name}" />
                </p:treeNode>

                <p:treeNode type="leaf" icon="document-node">
                    <h:outputText value="#{node.name}" />
                </p:treeNode>
            </p:tree>
@ManagedBean
public class MyBean1{

   public void methodAbc(){
     ...
   }
}

不,没有。您可以使用一个方法调用需要执行的两个或多个方法:

<p:ajax event="select" listener="#{someMB.multipleMethods}" update=":pchartId,:panelId" />
@ManagedBean
public class MyBean1{

   public void methodAbc(){
     ...
   }
}
如果需要使用多个托管bean,可以选择将一个注入另一个:

@ManagedBean
@SessionScoped
public class AnotherMB {
    public void method2() { /* */ }
}

@ManagedBean
@ViewScoped
public class SomeMB {

    @ManagedProperty("#{anotherMB}")
    AnotherMB anotherMB;

    //provide a setter
    public void setAnotherMB(AnotherMB anotherMB) {
        this.anotherMB = anotherMB;
    }

    public void method1() { /* */ }
    public void multipleMethods() { 
        method1();
        anotherMB.method2();
    }
}
@ManagedBean
public class MyBean1{

   public void methodAbc(){
     ...
   }
}

如果要从一个ManagedBean调用另一个ManagedBean的方法,必须注入另一个ManagedBean

@ManagedBean
public class MyBean1{

   public void methodAbc(){
     ...
   }
}
注入

@ManagedBean
public class MyBean1{

   public void methodAbc(){
     ...
   }
}
@ManagedBean
public class MyBean2{

   @ManagedProperty(value = "#{myBean1}")
   private MyBean1 mybean1;

   //SETTER GETTER for mybean1

   public void myAction(){
     mybean1.methodAbc();
   }
}
下表给出了兼容的ManagedBean注入范围(由Core Java Server Faces Book提供):

@ManagedBean
public class MyBean1{

   public void methodAbc(){
     ...
   }
}
或者,您可以在动作方法本身中动态解析EL表达式,如下所示

@ManagedBean
public class MyBean1{

   public void methodAbc(){
     ...
   }
}
public void myAction(){
   FacesContext fctx = FacesContext.getCurrentInstance();
   MyBean1 mybean1 = fctx.getApplication().evaluateExpressionGet(fctx , "#{myBean1}", MyBean1.class);
   mybean1.methodAbc();
}
因为您使用的是Primefaces,所以还有一种方法可以做到这一点,即使用
p:remoteCommand

@ManagedBean
public class MyBean1{

   public void methodAbc(){
     ...
   }
}
<p:ajax event="select" listener="#{data2.refresh}"
        update=":pchartId,:panelId" 
        oncomplete="callRemote2()"/>

<p:remoteCommand name="callRemote" partialSubmit="true" process="@this" 
                 action="#{yourmanagedbean.method2}" />


我必须在两个不同的支持bean中调用两个方法。公共类MB1{public void updateDisplay();}公共类MB2{public void updateChart();}两个方法不在同一个支持bean上。@user3482742应答已更新,以显示如何将bean注入另一个。如果您使用CDI,这会更简单。看起来它会起作用。我试试看。基本上我有一个primefaces树,它有2-4个组件,接收选择并根据选择更新其组件。谢谢,如果我能成功的话,我会给你回复的。