2012-01-23 122 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("#");