Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 如何在primefaces中为MenuItem调用ActionListener_Jsf 2_Primefaces - Fatal编程技术网

Jsf 2 如何在primefaces中为MenuItem调用ActionListener

Jsf 2 如何在primefaces中为MenuItem调用ActionListener,jsf-2,primefaces,Jsf 2,Primefaces,我需要实现一个动态菜单模型。在actionlistener中,我需要调用一个backingbean方法。当我将actionListener添加到menuItem时,我得到一个java.lang.InstanceionException @ManagedBean(name = "sampleBean") @ViewScoped public class Sample1 implements Serializable { private MenuModel model; public S

我需要实现一个动态菜单模型。在actionlistener中,我需要调用一个backingbean方法。当我将actionListener添加到menuItem时,我得到一个java.lang.InstanceionException

@ManagedBean(name = "sampleBean")  
@ViewScoped  
public class Sample1 implements Serializable {

private MenuModel model;

public Sample1() {
    model = new DefaultMenuModel();

    for(int i = 0; i < 3; i++){
        MenuItem item1 = new MenuItem();
        item1.setValue("test1" + i);
        item1.setAjax(false);
        item1.setId("item1" + i);
        item1.addActionListener(this.new MenuActionListener());
        model.addMenuItem(item1);
    }
}

// inner class action listener
class MenuActionListener implements ActionListener{
    @Override
    public void processAction(ActionEvent arg0) throws AbortProcessingException {
     System.out.println("test... " + arg0.getComponent().getClientId());
     test(arg0.getComponent().getClientId());   
    }
}

public void test(String test){
    System.out.println("tested..." + test); 
}
@ManagedBean(name=“sampleBean”)
@视域
公共类Sample1实现了可序列化{
私有菜单模型;
公共样本1(){
模型=新的DefaultMenuModel();
对于(int i=0;i<3;i++){
MenuItem item1=新的MenuItem();
项目1.设定值(“测试1”+i);
项目1.setAjax(假);
项目1.设置ID(“项目1”+i);
item1.addActionListener(this.new MenuActionListener());
模型添加菜单项(第1项);
}
}
//内部类操作侦听器
类MenuActionListener实现ActionListener{
@凌驾
public void processAction(ActionEvent arg0)引发AbortProcessingException{
System.out.println(“测试…”+arg0.getComponent().getClientId());
测试(arg0.getComponent().getClientId());
}
}
公共无效测试(字符串测试){
系统输出打印项次(“测试…”+测试);
}
我也尝试过使用MethodExpressionActionListener。在这种情况下,传递给“item1”的参数是alays null。请告诉我如何在methodExpression中传递参数

for(int i = 0; i < 3; i++){
        MenuItem item1 = new MenuItem();
        item1.setValue("test1" + i);
        item1.setAjax(false);
        item1.setId("item1" + i);
        //item1.addActionListener(new MenuActionListener());
        ExpressionFactory factory = FacesContext.getCurrentInstance().getApplication().getExpressionFactory();
        ELContext elContext = FacesContext.getCurrentInstance().getELContext();
        MethodExpression expression = factory.createMethodExpression(elContext, "#{beanName.method(" + item1 + ")}", null, new Class[] {MenuItem.class});
        item1.addActionListener(new MethodExpressionActionListener(expression));
        model.addMenuItem(item1);
    }  
for(int i=0;i<3;i++){
MenuItem item1=新的MenuItem();
项目1.设定值(“测试1”+i);
项目1.setAjax(假);
项目1.设置ID(“项目1”+i);
//item1.addActionListener(新的MenuActionListener());
ExpressionFactory=FacesContext.getCurrentInstance().getApplication().getExpressionFactory();
ELContext ELContext=FacesContext.getCurrentInstance().getELContext();
MethodExpression=factory.createMethodExpression(elContext,“#{beanName.method(“+item1+”)}”,null,新类[]{MenuItem.Class});
item1.addActionListener(新方法ExpressionActionListener(表达式));
模型添加菜单项(第1项);
}  

尝试将MenuActionListener设置为普通类,而不是内部类


再看看这个

试着把
MenuActionListener
变成一个普通类,而不是内部类,我可以,但我想从内部类执行一个bean方法“test”。我不能这样做吗?把MenuActionListener变成一个普通类很有效。非常感谢@Daniel