2012-01-23 118 views
1

我的代码是这样的:动态菜单项和ActionExpression

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:p="http://primefaces.prime.com.tr/ui"> 
<h:head> 
<title>Facelet Title</title> 
</h:head> 

<f:view contentType="text/html"> 
<h:body> 
    <h:form> 
     <p:menu model="#{menuBean.model}"/> 
    </h:form> 
</h:body> 
</f:view> 
</html> 

我的管理bean是这样的:

@ManagedBean 
@RequestScoped 
public class MenuBean { 

    private MenuModel model; 

    public MenuBean() { 
     FacesContext facesCtx = FacesContext.getCurrentInstance(); 
     ELContext elCtx = facesCtx.getELContext(); 
     ExpressionFactory expFact = facesCtx.getApplication().getExpressionFactory(); 

     model = new DefaultMenuModel(); 

     Submenu submenu = new Submenu(); 
     submenu.setLabel("Dynamic Submenu 1"); 

     MenuItem item = new MenuItem(); 
     item.setValue("Dynamic Menuitem 1.1"); 
     item.setAjax(false); 
     item.setActionExpression(expFact.createMethodExpression(elCtx, "#{menuBean.add}", String.class, new Class[0])); 
     item.setUrl("#"); 

     submenu.getChildren().add(item); 

     model.addSubmenu(submenu); 

     submenu = new Submenu(); 
     submenu.setLabel("Dynamic Submenu 2"); 
     item = new MenuItem(); 
     item.setValue("Dynamic Menuitem 2.1"); 
     item.setAjax(false); 
     item.setActionExpression(expFact.createMethodExpression(elCtx, "#{menuBean.add}", String.class, new Class[0])); 
     item.setUrl("#"); 

     submenu.getChildren().add(item); 

     item = new MenuItem(); 
     item.setValue("Dynamic Menuitem 2.2"); 
     item.setAjax(false); 
     item.setActionExpression(expFact.createMethodExpression(elCtx, "#{menuBean.add}",Void.class, new Class[]{Object.class,String.class})); 
     item.setUrl("#"); 
     submenu.getChildren().add(item); 

     model.addSubmenu(submenu); 
    } 

    public MenuModel getModel() { 
     return model; 
    } 

    public String add(Object obj,String nodeId) { 
     return null; 
    } 
} 

运行此代码时,我点击菜单项,方法add()是永远不会被执行。

是什么原因?

回答

1

哪个菜单项不调用?在这个菜单项中,您将add方法设置为返回一个String类型并且不带任何参数。

item.setActionExpression(expFact.createMethodExpression(elCtx, "#{menuBean.add}", String.class, new Class[0])); 

在这个菜单项中,你说方法add将返回VOID并接受Object和String参数。

item.setActionExpression(expFact.createMethodExpression(elCtx, "#{menuBean.add}", Void.class, new Class[]{Object.class,String.class})); 

您没有与您的ManagedBean类中的这些签名相匹配的方法添加。

+0

我改变了代码,返回类型为String,参数为对象和String ....但不工作,添加方法 – Shemil

3

你需要改变你的add()方法返回String

public String add(){ 
      //TODO: 
    } 

并删除这一行:从MenuBeanitem.setUrl("#");