最近一直在研究這個樹形的下拉選擇框,感覺非常的有用,現在整理下來供大家使用:
首先數據庫的表架構設計和三級菜單聯動的表結構是一樣,(父子關系)

1、下面我們用hibernate建一下對應的額實體類:
package com.hanqi.entity; //地區 實體類 public class Region { //地區id private String regionID; //地區名稱 private String regionName; //上級id private String parentRegionID; public String getRegionID() { return regionID; } public void setRegionID(String regionID) { this.regionID = regionID; } public String getRegionName() { return regionName; } public void setRegionName(String regionName) { this.regionName = regionName; } public String getParentRegionID() { return parentRegionID; } public void setParentRegionID(String parentRegionID) { this.parentRegionID = parentRegionID; } @Override public String toString() { return "Region [regionID=" + regionID + ", regionName=" + regionName + ", parentRegionID=" + parentRegionID + "]"; } }
2、dao層查詢數據的方法:
//獲取數據列表 public List<Region> getlist(String parentid) { List<Region> rtn=new ArrayList<Region>(); init(); //查詢數據 rtn=se.createQuery("from Region where parentRegionID=?").setString(0, parentid).list(); destory(); return rtn; }
3、建立service層的(在這里需要注意的是:返回的JSON格式的數據是一個嵌套的格式,這里就用到了遞歸的方法即根據父ID查詢他的子ID然后再繼續查詢子ID下面的子ID。。。
返回的數據格式 必須包含 按照id:'',text:''children:['{}']的格式,所以我們先建一個這種格式的類。從數據庫中取出數據后以這種類的格式返回
)
建一個tree需要的格式的類:
package com.hanqi.service; import java.util.List; public class TreeNode { private String id; private String text; private List<TreeNode> children; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getText() { return text; } public void setText(String text) { this.text = text; } public List<TreeNode> getChildren() { return children; } public TreeNode(String id, String text) { super(); this.id = id; this.text = text; } public void setChildren(List<TreeNode> children) { this.children = children; } public TreeNode() { super(); } }
service層里面的調用數據庫層數據,采用遞歸方法循環遍歷 子id,當不滿足條件時,遞歸方法跳出,重點理解下面的getTreeNode()方法:
package com.hanqi.service; import java.util.ArrayList; import java.util.List; import com.hanqi.dao.RegionDao; import com.hanqi.entity.Region; public class RegionService { // public List<Region> getList(String parentid) { return new RegionDao().getlist(parentid); } //遞歸調用的方法 //獲取子節點的集合 public List<TreeNode> getTreeNode(String id) { List<TreeNode> rtn =null; List<Region> lr=getList(id); if(lr!=null&&lr.size()>0) { rtn=new ArrayList<>(); for(Region r:lr) { TreeNode tn=new TreeNode(r.getRegionID(), r.getRegionName()); System.out.println("name="+r.getRegionName()); //得到節點的子節點 //遞歸的調用 List<TreeNode>children= getTreeNode(r.getRegionID()); tn.setChildren(children); rtn.add(tn); } } return rtn; } }
servlet層調用service的數據,並把數據轉換成JSON格式返回給前台:
package com.hanqi.web; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson.JSONArray; import com.hanqi.entity.H_Depart; import com.hanqi.service.RegionService; import com.hanqi.service.TreeNode; /** * Servlet implementation class DepartServlet */ public class DepartServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public DepartServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); RegionService rs=new RegionService(); List<TreeNode> lr =rs.getTreeNode("0"); String json=JSONArray.toJSONString(lr); System.out.println(json); response.getWriter().print(json); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
前段的顯示層調用:
部門: <input class="easyui-combotree" id="depart" name="depart" data-options="{url:'DepartServlet'}" />
效果:

