easyUI树形结构

树形结构是常见也是常用的,之前一直在使用但是基本都是调用别人写好的方法,好像也没调用太明白的感觉,这次在开发ITOO的时候终于研究了一番,发现其实要实现树形结构其实不是一件困难的事,而且实现方法也不是唯一的,之前大家都很倾向使用zTree,网上搜了一下发现zTtree是一个比较强大“树插件”但是觉得对于目前的我来说并不是很合适,首先我们的前台框架使用的easyUI,easyUI有自己的树形结构控件,再引入一个zTree没有多大的必要;而且对于我来说相对于js代码来说我更熟悉使用后台java代码来控制,所以决定研究一下后台生成树形结构,使用json的数据格式将数据传递给easyUI的树形控件。

首先说,easyUI的树形结构对json数据时有要求的,所以在后台将数据拼接成easyUI需要的格式就可以很轻松的生成一颗树形结构了。

首先来看需要树形结构的实体:

/***********************************************************************
 * 模块:  Institution.java
 * 作者:  陈丽娜
 * 说明:  机构实体类
 * 日期:  2014年12月2日 20:49:05
 ***********************************************************************/

package com.tgb.itoo.basic.entity;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.apache.log4j.varia.FallbackErrorHandler;
import org.codehaus.jackson.annotate.JsonIgnore;

/**
 * 机构实体
 */
@Entity
@Table(name = "TB_Institution")
public class Institution extends EntityDelete {
	/**
	 * 机构代码
	 */
	@Column(name = "InstitutionCode", length = 255)
	private String institutionCode;
	/**
	 * 机构名称
	 */
	@Column(name = "InstitutionName", length = 255)
	private String institutionName;
	/**
	 * 学制
	 */
	@Column(name = "schoolSystem", length = 255)
	private String schoolSystem;
	/**
	 * 学费
	 */
	@Column(name = "money", length = 255)
	private String money;
	/**
	 * 机构类型Id
	 */
	@Column(name="nodeLevelId", length=30)
	private String nodeLevelId;
	/**
	 * 学校层次
	 */
	@ManyToOne(cascade = CascadeType.DETACH, fetch = FetchType.EAGER, targetEntity = SchoolLevel.class)
	@JoinColumn(name = "levelId", nullable = true)
	private SchoolLevel schoolLevel;
	/**
	 * 自关联  父节点
	 */
	@ManyToOne(cascade = CascadeType.REFRESH,fetch=FetchType.EAGER,targetEntity = Institution.class)
	@JoinColumn(name = "pId", nullable = true)
	private Institution parentInstitution;

	/**
	*get/set方法省略
	*/
}

将实体转换成easyUI需要的树形结构的方法类:

首先需要定义一个与easyUI需要的json数据一致的实体类:

package itoo.basic.tool.json;

import java.util.ArrayList;
import java.util.List;

/**
 * easyUI树形结构转换实体
 * @author 陈丽娜
 * @version 1.0.0 , 2015年1月29日 上午10:39:28
 */
public class TreeNode{

	/**
	 * 显示节点的id
	 */
	private String id;
	/**
	 * 显示节点的名称
	 */
	private String text;
	/**
	 * 显示节点的图标
	 */
	private String icon;
	/**
	 * 显示节点的父节点
	 */
	private String parentId;
	/**
	 * 显示节点的子节点集合
	 */
	private List<TreeNode> children;

	/**
	 * 空的构造函数
	 */
	public TreeNode(){

	}

	/**
	 * 有参数的构造参数
	 * @param id 显示的节点ID
	 * @param text 显示的节点名称
	 * @param icon 显示的节点图标
	 * @param parentId 显示的节点的父节点
	 * @param children 显示节点的子节点
	 */
	public TreeNode(String id, String text,String icon,String parentId,List<TreeNode> children){
		super();
		this.id=id;
		this.text=text;
		this.icon=icon;
		this.parentId=parentId;
		this.children=children;
	}

    /**
	*省略get/set方法
	*/

	/**
	 * 添加子节点的方法
	 * @param node 树节点实体
	 */
	public void addChild(TreeNode node){
		if(this.children==null){
			children=new ArrayList<TreeNode>();
			children.add(node);
		}else{
			children.add(node);
		}
	}

}

定义好实体类之后,将查出来的需要以树形结构显示的数据转换为treenode的实体类型:

package itoo.basic.tool.json;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.tgb.itoo.basic.entity.Institution;

/**
 * 树形机构方法类
 * @author 陈丽娜
 * @version 1.0.0 , 2015年1月29日 上午10:44:55
 */
public class TreeUntil{

	/**
	 * 将组织机构转换成treenode的方法
	 * @param institutions 需要转换的机构list集合
	 * @return 返回一个treenode结构的list集合
	 */
	public List fillTree(List<Institution> institutions){
		List<TreeNode> list=new ArrayList<TreeNode>(); //定义一个树形结构实体
		Map map=new HashMap<String, TreeNode>(); //定义一个map
		try {
			//将传递过来的参数赋值给机构实体,遍历每一个将机构赋值给treenode相应的属性
			for(Institution institution:institutions){
				TreeNode node=new TreeNode();
				node.setId(institution.getId());   //id
				node.setText(institution.getInstitutionName()); //赋值名称
				//判断该机构节点是否有父节点,如果父节点不为空则赋值给treenode的父节点
				if(institution.getParentInstitution()!=null){
					node.setParentId(institution.getParentInstitution().getId());
				}

				map.put(institution.getId(), node);	//将机构的id与树形结构实体放在map中		

			}

			for(Institution institution:institutions){
				if(institution.getParentInstitution()!=null){
					    //如果该机构节点的父节点不为空,但是父节点id为空,则在list中添加有一个
					    //map中的机构的的id;
					    //如果父节点id不为空定义pId为父节点的id;
					    //并定义两个树形结构实体,给父的树形结构pNode添加一个子节点实体cNode
						if(institution.getParentInstitution().getId()==null){
							list.add((TreeNode)map.get(institution.getId()));
						}else{

							 String pId=institution.getParentInstitution().getId();
						     TreeNode pNode=(TreeNode)map.get(pId);
						     TreeNode cNode=(TreeNode)map.get(institution.getId());
						     pNode.addChild(cNode);
						}
				}else {

                         list.add((TreeNode)map.get(institution.getId()));
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return list; //返回树形结构list集合
	}

}

这样大部分的工作就完成了,还需要再controller中将数据转成json,并在jsp页面中接收:

  /**
	 * 查询所有的组织机构  树形结构
	 * @param response   向前台传递数据
	 * @param request 获取前台的传递数据
	 */
	@RequestMapping("/info/queryAll")
	private void queryAllType(HttpServletResponse response,HttpServletRequest request){
		try{
	    //查询到所有的组织机构信息
		List<Institution> institutions =institutionBean.queryAllInstitutions();
		treeUntil=new TreeUntil();
		//将查询到的数据转换为树形结构的list
		List list=treeUntil.fillTree(institutions);
		jacksonJsonUntil=new JacksonJsonUntil();
		//将返回的list转化成json数据,并返回给jsp页面
		jacksonJsonUntil.beanToJson(response, list);
		}catch(Exception e){
			e.printStackTrace();
		}
	}

这时候在jsp中直接调用这个controller就可以了:

<div id="p" data-options="region:'west'" title="组织机构树" style="width:20%;padding:10px">
             <ul id="tt" class="easyui-tree"
                  url="info/queryAll">
             </ul>
  </div>

最终的效果图为:

时间: 2024-10-09 05:45:02

easyUI树形结构的相关文章

easyui树形结构选择

如上图所示,要有如些效果 前台HTML代码 <select id="ShareTo" name="ShareTo" class="easyui-combotree"    data-options="url:'/BlueVacation/Controller/ScheduleHandler.ashx?op=tree'"   multiple ></select> 后台C#的代码 string GetDe

通用列表数据转化为树形结构

近期做项目用的是JQuery  easyUI 控件, 尽管非常强大,可是高级控件对于数据的格式要求比較严格遇到 例如以下问题 1.使用comboTree 控件   绑定树形的组织结构   可是 数据库查到的数据格式是 列表形式,并不符合  combotree的数据结构 以下是我的数据和  combotree 数据个对照 通用的数据结构   命名A "[{"UnitID":"7cf57594a7074c46b94dcd6c985b0ced","Un

easyUI树形节点点击和动态添加Tab-

easyUI是一种基于jQuery的UI框架,可以直接阅读官网的API教程学习,最近做的项目要用到这个框架,就一边看一边做,先看一下动态添加Tab,实际项目中我们都是希望点击一个节点,增加一个iframe的窗口出来,但是昨天看着API做一个简单的点击A标签增加iframe,死活就是不行,晚上回去终于搞定,看一下官方的例 [html] view plain copy print? function addTab(title, url){ if ($('#tt').tabs('exists', ti

Java创建树形结构算法实例

在JavaWeb的相关开发中经常会涉及到多级菜单的展示,为了方便菜单的管理需要使用数据库进行支持,本例采用相关算法讲数据库中的条形记录进行相关组装和排序讲菜单组装成树形结构. 首先是需要的JavaBean 1 2 3 import java.io.Serializable; 4 import java.util.ArrayList; 5 import java.util.Collections; 6 import java.util.Comparator; 7 import java.util.

Hibernate中,基于Annotation的简单树形结构的实现

在系统设计中,经常用到递归性质的树形结果,比如菜单.多级分类等,一般是在同一个表中定义父子关系实现这种结构. 下面是在Hibernate中,基于Annotation的简单树形结构的实现: 第一步:创建Entity类,并添加注解实现关联关系    ps: 主要是利用@ManyToOne 和 @OneToMany 配置在同一个Entity类中实现树形递归的结构.hibernate注解形式比在xml配置更加简洁 TreeNode.java 1 package com.hfut.hibernate; 2

Qt QTreeWidget 树形结构实现(转)

Qt中实现树形结构可以使用QTreeWidget类,也可以使用QTreeView类,QTreeWidget继承自QTreeView类.树形效果如下图所示: 这是怎么实现的呢?还有点击节点时会有相应的事件响应. 1. 树形结构实现 QT GUI中有treeWidget部件,将该控件在Gui中布局好,假设其对象名为treeWidget. QTreeWidget类官方文档:http://qt-project.org/doc/qt-4.8/qtreewidget.html 树形结构通过QTreeWidg

递归算法解析成树形结构

/** * 递归算法解析成树形结构 * * @param cid * @return * @author jiqinlin */ public TreeNodeModel recursiveTree(int org_code) { //根据cid获取节点对象(SELECT * FROM tb_tree t WHERE t.cid=?) MiddleOrgEntity middleOrgEntity = new MiddleOrgEntity(); middleOrgEntity.setTable

你认为扁平化模式好还是树形结构好?

我认为对于小公司来说,扁平化的模式更好一些.由于小公司的规模比较小,公司内的员工不多,所需要的管理层次不多.扁平化模式的决策层和操作层之间的中间管理层次少,这可以使企业能够快速地将决策权延至企业生产.营销的最前线,从而为提高企业效率.而且由于公司规模小,管理部门之间的信息资源的交流.相互调用不会太多,这样可以是决策者集中更多的精力在企业的市场对策和企业发展的战略问题上. 对于大公司来说,树形结构会更好一些.大公司的规模比较大,所要做的项目比较多,如果一个人负责多个项目会造成项目完成效率不高.在树

解析java树形结构

思路一: 1.准备表结构及对应的表数据a.表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHAR2(50), PID NUMBER //父节点 ) b.表数据: insert into tb_tree (CID, CNAME, PID) values (1, '中国', 0); insert into tb_tree (CID, CNAME, PID) values (2, '北京市', 1); insert into tb_