Jsf 2 如何在primefaces中为MenuItem调用ActionListener
我需要实现一个动态菜单模型。在actionlistener中,我需要调用一个backingbean方法。当我将actionListener添加到menuItem时,我得到一个java.lang.InstanceionExceptionJsf 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
@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