2013-03-25 34 views
0

我需要一些示例從DataBase構建TreeNode來構建需要TreeNode的PrimeFaces的MenuBar。這裏是我的菜單視圖的代碼。從DataBase構建TreeNode PrimeFaces

我需要使用DataBase從我的ManagedBean構建TreeNode,我的菜單使用此TreeNode繪製子菜單和菜單項。

我需要一種方法,允許我從ManagedBean處理數據庫中的查詢並創建這些TreeNode的結構,以及有關菜單表格結構的一些想法,我只希望存儲菜單的標題。請幫助:(

<p:menubar style="width: auto;" autoDisplay="false"> 
    <c:forEach items="#{treeBean.root.children}" var="nodos"> 
     <p:submenu label="#{nodos.getData()[0].toString()}" icon="#{nodos.getData()[2].toString()}"> 
      <c:forEach items="#{nodos.children}" var="hojas"> 
       <c:if test="#{hojas.isLeaf()==false}"> 
        <p:submenu label="#{hojas.getData()[0].toString()}" icon="#{hojas.getData()[2].toString()}"> 
         <c:forEach items="#{hojas.children}" var="menus"> 
          <c:when test="#{menus.leaf}"> 
           <c:if test="#{menus.leaf==false}"> 
            <p:submenu label="#{menus.getData().toString()}"> 
             <c:forEach items="#{menus.children}" var="menus2"> 
              <p:menuitem value="#{menus2.getData()[0].toString()}" action="#{menus2.getData()[1].toString()}" 
              ajax="false" icon="#{menus2.getData()[2].toString()}" /> 
             </c:forEach> 
            </p:submenu> 
           </c:if> 
           <c:if test="#{menus.leaf}"> 
            <p:menuitem value="#{menus.getData()[0].toString()}" action="#{menus.getData()[1].toString()}" 
            ajax="false" icon="#{menus.getData()[2].toString()}" /> 
           </c:if> 
          </c:when> 
         </c:forEach> 
        </p:submenu> 
       </c:if> 
       <c:if test="#{hojas.isLeaf()==true}"> 
        <p:menuitem value="#{hojas.getData()[0].toString()}" action="#{hojas.getData()[1].toString()}" 
        ajax="false" icon="#{hojas.getData()[2].toString()}" /> 
       </c:if> 
      </c:forEach> 
      <c:if test="#{nodos.getData()[0].toString()=='Favoritos'}"> 
       <p:menuitem value="Agregar Favorito" action="verPrueba" ajax="false" /> 
      </c:if> 
     </p:submenu> 
    </c:forEach> 
    <f:facet name="options"> 
     <p:commandButton value="Cerrar Sesión" icon="ui-icon-cerrarSesion" action="verPrueba" 
     /> 
    </f:facet> 
</p:menubar> 

回答

0

我發現這裏的答案我的遞歸方法的代碼從數據庫中建立一個樹節點,並建立一個菜單欄:

public void recursivo(List<Menustab> liste, int id, TreeNode node) { 
    subList2 = new ArrayList<Menustab>(); 
    subList2 = subMenus(id); 
    for (Menustab k : subList2) { 
     TreeNode childNode = new DefaultTreeNode(k.getTitulo(), node); 
     recursivo(subList2, k.getId(), childNode); 

    } 

} 

public static List<Menustab> subMenus(int i) { 
    listaHijos = new ArrayList<Menustab>(); 
    for (Menustab k : getListaMenus()) { 
     if (k.getPadre() == i) { 
      listaHijos.add(k); 
     } 
    } 
    return listaHijos; 
} 

我與菜單欄視圖:

<h:form > 


     <div id="header" align="left"> 

      <p:menubar autoDisplay="false"> 
       <c:forEach items="#{constructorMenuMB.root.children}" var="nodos" > 

        <p:submenu label="#{nodos.getData().toString()}" > 

         <c:forEach items="#{nodos.children}" var="hojas"> 

          <c:if test="#{hojas.isLeaf()==false}"> 


           <p:submenu label="#{hojas.getData().toString()}" > 




            <c:forEach items="#{hojas.children}" var="menus"> 



             <c:when test="#{menus.leaf}"> 
              <c:if test="#{menus.leaf==false}"> 
               <p:submenu label="#{menus.getData().toString()}" > 

                <c:forEach items="#{menus.children}" var="menus2"> 
                 <p:menuitem value="#{menus2.getData().toString()}" ajax="false" /> 
                </c:forEach> 
               </p:submenu> 
              </c:if> 
              <c:if test="#{menus.leaf}"> 
               <p:menuitem value="#{menus.getData().toString()}" ajax="false" /> 
              </c:if> 
             </c:when> 

            </c:forEach> 



           </p:submenu> 

          </c:if> 

          <c:if test="#{hojas.isLeaf()==true}"> 

           <p:menuitem value="#{hojas.getData().toString()}" ajax="false" /> 


          </c:if> 


         </c:forEach> 


         <c:if test="#{nodos.getData().toString()=='Favoritos'}"> 

          <p:menuitem value="Agregar Favorito" action="verPrueba" ajax="false"/> 
         </c:if> 



        </p:submenu> 

       </c:forEach> 


      </p:menubar> 



     </div> 



    </h:form> 

,現在我的完整豆:

public class ConstructorMenuMB { 

private TreeNode root = new DefaultTreeNode("Root", null); 
private static List<Menustab> listaMenus; 
private static List<Menustab> listaHijos; 
private List<Menustab> subList2; 

@EJB 
public MenuSB sb; 

/** 
* Creates una nueva instancia de ConstructorMenuMB 
*/ 
public ConstructorMenuMB() { 
} 

@PostConstruct 
public void construirMenu() { 
    listaMenus = new ArrayList<Menustab>(); 
    listaMenus = sb.consultarArbolMenus(); 
    recursivo(listaMenus, 1, root); 
} 

/** 
* Método recursivo para construir un árbol(TreeNode) desde una lista de arreglos de 
* cadenas obtenida desde la base de datos. 
* 
* @param ArrayList<String[]> lista de menus. 
* @return No devuelve ningun valor. 
* @throws No dispara ninguna excepcion. 
*/ 
public void recursivo(List<Menustab> liste, int id, TreeNode node) { 
    subList2 = new ArrayList<Menustab>(); 
    subList2 = subMenus(id); 
    for (Menustab k : subList2) { 
     TreeNode childNode = new DefaultTreeNode(k.getTitulo(), node); 
     recursivo(subList2, k.getId(), childNode); 

    } 

} 

public static List<Menustab> subMenus(int i) { 
    listaHijos = new ArrayList<Menustab>(); 
    for (Menustab k : getListaMenus()) { 
     if (k.getPadre() == i) { 
      listaHijos.add(k); 
     } 
    } 
    return listaHijos; 
} 

public static List<Menustab> getListaMenus() { 
    return listaMenus; 
} 


public TreeNode getRoot() { 
    return root; 
} 

}

和我的會話Bean使用實體管理器,其中用於諮詢我的表菜單:

public class MenuSB { 
@PersistenceContext(unitName = "MenuGeneralPU") 
private EntityManager em; 


public List<Menustab> consultarArbolMenus(){ 

    return em.createNamedQuery("Menustab.findAll").getResultList(); 

} 

}

我的實體菜單:

public class Menustab implements Serializable { 
private static final long serialVersionUID = 1L; 
@Id 
@Basic(optional = false) 
@NotNull 
@Column(name = "id") 
private Integer id; 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 50) 
@Column(name = "titulo") 
private String titulo; 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 50) 
@Column(name = "url") 
private String url; 
@Basic(optional = false) 
@NotNull 
@Column(name = "padre") 
private int padre; 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 50) 
@Column(name = "icono") 
private String icono; 


public Menustab() { 
} 

public Menustab(Integer id) { 
    this.id = id; 
} 

public Menustab(Integer id, String titulo, String url, int padre, String icono) { 
    this.id = id; 
    this.titulo = titulo; 
    this.url = url; 
    this.padre = padre; 
    this.icono = icono; 
} 

public Integer getId() { 
    return id; 
} 

public void setId(Integer id) { 
    this.id = id; 
} 

public String getTitulo() { 
    return titulo; 
} 

public void setTitulo(String titulo) { 
    this.titulo = titulo; 
} 

public String getUrl() { 
    return url; 
} 

public void setUrl(String url) { 
    this.url = url; 
} 

public int getPadre() { 
    return padre; 
} 

public void setPadre(int padre) { 
    this.padre = padre; 
} 

public String getIcono() { 
    return icono; 
} 

public void setIcono(String icono) { 
    this.icono = icono; 
} 

@Override 
public int hashCode() { 
    int hash = 0; 
    hash += (id != null ? id.hashCode() : 0); 
    return hash; 
} 

@Override 
public boolean equals(Object object) { 
    // TODO: Warning - this method won't work in the case the id fields are not set 
    if (!(object instanceof Menustab)) { 
     return false; 
    } 
    Menustab other = (Menustab) object; 
    if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { 
     return false; 
    } 
    return true; 
} 

@Override 
public String toString() { 
    return "Entidad.Menustab[ id=" + id + " ]"; 
} 

}

最後我的表在數據庫中的結構:

ID | Titulo | URL | Padre | Icono

我在我的算法中使用了基本的,一個菜單的id爲'ID',它的模式'PADRE'用於構建一個TreeNode和用於菜單文本的標題'TITULO',我正在爲繪製圖標。

相關問題