最近一直在研究这个树形的下拉选择框,感觉非常的有用,现在整理下来供大家使用:
首先数据库的表架构设计和三级菜单联动的表结构是一样,(父子关系)
1、下面我们用hibernate建一下对应的额实体类:
package com.hanqi.entity;//地区 实体类
public classRegion {//地区id
privateString regionID;//地区名称
privateString regionName;//上级id
privateString parentRegionID;publicString getRegionID() {returnregionID;
}public voidsetRegionID(String regionID) {this.regionID =regionID;
}publicString getRegionName() {returnregionName;
}public voidsetRegionName(String regionName) {this.regionName =regionName;
}publicString getParentRegionID() {returnparentRegionID;
}public voidsetParentRegionID(String parentRegionID) {this.parentRegionID =parentRegionID;
}
@OverridepublicString toString() {return "Region [regionID=" + regionID + ", regionName=" + regionName + ", parentRegionID=" +parentRegionID+ "]";
}
}
2、dao层查询数据的方法:
//获取数据列表
public Listgetlist(String parentid)
{
List rtn=new ArrayList();
init();//查询数据
rtn=se.createQuery("from Region where parentRegionID=?").setString(0, parentid).list();
destory();returnrtn;
}
3、建立service层的(在这里需要注意的是:返回的JSON格式的数据是一个嵌套的格式,这里就用到了递归的方法即根据父ID查询他的子ID然后再继续查询子ID下面的子ID。。。
返回的数据格式 必须包含 按照id:'',text:''children:['{}']的格式,所以我们先建一个这种格式的类。从数据库中取出数据后以这种类的格式返回
)
建一个tree需要的格式的类:
package com.hanqi.service;
import java.util.List;public classTreeNode {privateString id;privateString text;private Listchildren;publicString getId() {returnid;
}public voidsetId(String id) {this.id =id;
}publicString getText() {returntext;
}public voidsetText(String text) {this.text =text;
}public ListgetChildren() {returnchildren;
}publicTreeNode(String id, String text) {
super();this.id =id;this.text =text;
}public void setChildren(Listchildren) {this.children =children;
}publicTreeNode() {
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 classRegionService {// public ListgetList(String parentid)
{return newRegionDao().getlist(parentid);
}//递归调用的方法//获取子节点的集合
public ListgetTreeNode(String id)
{
List rtn =null;
List lr=getList(id);if(lr!=null&&lr.size()>0)
{
rtn=new ArrayList<>();for(Region r:lr)
{
TreeNode tn=newTreeNode(r.getRegionID(), r.getRegionName());
System.out.println("name="+r.getRegionName());//得到节点的子节点//递归的调用
Listchildren=getTreeNode(r.getRegionID());
tn.setChildren(children);
rtn.add(tn);
}
}returnrtn;
}
}
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 classDepartServlet extends HttpServlet {private static final long serialVersionUID = 1L;/**
* @see HttpServlet#HttpServlet()*/
publicDepartServlet() {
super();//TODO Auto-generated constructor stub
}/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/
protected voiddoGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
RegionService rs=newRegionService();
List 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 voiddoPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//TODO Auto-generated method stub
doGet(request, response);
}
}
前段的显示层调用:
部门:
/>
效果: