复合组件递归传递支持bean

时间:2014-02-02 05:46:29

标签: java jsf-2 recursion components composite

我每个人都在尝试使用复合组件制作一个递归菜单,但是我无法弄清楚如何将一个backbean传递给相同的复合组件,mi代码看起来像这样

<composite:interface>
     <composite:attribute name="bean" required="true"/>
     <composite:attribute name="node" required="true"/>
</composite:interface>

<cc:implementation>
     <--some code here-->

     <c:if test="#{not empty cc.attrs.bean.obtainsubmenu(cc.attrs.node)}">
          <c:foreach items="cc.attrs.bean.obtainsubmenu(cc.attrs.node)" var="submenu">
               <!--some other code here-->
               <menu:recursivemenu
                   bean="#{cc.attrs.bean}"
                   node="#{submenu.idOpc}"
               />
          </c:foreach>    
     </c:if>
</cc:implementation>

方法obtainubmenu只返回方法看起来像这样的对象列表

public List<myObject> obtainsubmenu(Long id){
 return mymap.get(id); //where my maps is parametized  this way Map<Long, List<MyObject>
}

对于我的菜单的第一级,它看起来工作得很好问题是当它试图调用自己做递归时它不是应该引用对象引用,因为它应该得到一个stackoverflow异常因为map为null

有没有办法做到这一点?

坦克的帮助!!

1 个答案:

答案 0 :(得分:0)

首先,你不应该使用JSTL标签,而应该使用JSF标签。

无需进行空检查

<composite:interface>
     <composite:attribute name="bean" required="true"/>
     <composite:attribute name="node" required="true"/>
</composite:interface>

<cc:implementation>
     <--some code here-->

    <ui:repeat value="#{cc.attrs.bean.obtainsubmenu(cc.attrs.node)}" var="submenu">
        <!--some other code here-->
        <menu:recursivemenu bean="#{cc.attrs.bean}" node="#{submenu.idOpc}"/>
    </ui:repeat>    
</cc:implementation>

但是,如果要创建Primefaces菜单,则此方法不起作用。你必须在MenuModel

中构建程序化菜单

更一般地说,如果菜单根组件负责呈现其子组件本身(menuComponent.getRendersChildren()返回true),则这种方法将无效。