`
xurichusheng
  • 浏览: 335983 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

使用 zTree 动态加载树形菜单

 
阅读更多

 

1. 框架:

     jquery-1.8.3.js

     jquery.ztree.core-3.5.js

     Spring-3.2.4

 

     js及css见附件

 

2. 加载的数据

    省市数据。

    思路:一进入页面,首先加载省一级信息,当点击省的时候,到后台查找该省下面的所有的市,然后加载到该省下。

 

3. 表(HW_DEPT)结构

 

 

4. 查找省一级数据dao方法

public List<HwDept> findProvinceDept(String provinceId) throws Exception {

		StringBuffer sql = new StringBuffer(100);

		sql.append("SELECT * FROM HW_DEPT ");
		sql.append(" WHERE DEPT_LEVEL = '3' AND MANAGE_LEVEL = '3'");

		if (null != provinceId && !"".equals(provinceId.trim())) {
			sql.append(" AND DEPT_ID = '").append(provinceId).append("'");
		}

		sql.append(" ORDER BY DEPT_NAME ASC");

		return getJdbcTemplate().query(sql.toString(), new RowMapper<HwDept>() {

			@Override
			public HwDept mapRow(ResultSet rs, int rowNum) throws SQLException {

				HwDept dept = new HwDept();

				dept.setDeptId(rs.getString("DEPT_ID"));
				dept.setDeptName(rs.getString("DEPT_NAME"));
				dept.setDeptLevel(rs.getString("DEPT_LEVEL"));
				dept.setManageLevel(rs.getString("MANAGE_LEVEL"));
				dept.setParentId(rs.getString("PARENT_ID"));

				return dept;
			}
		});
	}

 

5. 查找省一级数据controller方法

@RequestMapping("/getProvinceTree")
	public void getProvinceTree(HttpServletResponse resp) {

		PrintWriter out = null;

		try {
			out = resp.getWriter();

			// 当前登录用户
			ShiroUser shiroUser = SubjectUtils.getPrincipal();
			User user = userService.findOne("loginName",
					shiroUser.getLoginName());

			// 查找省一级部门信息
			List<HwDept> depts = hwDeptService.findProvinceDept(user
					.getProvinceId());
			//
			// JSONArray json = JSONArray.fromObject(depts);

			// 将集合对象拼接成json字符串
			String json = buildProvinceJSON(depts);

			log.info("Province Tree json is:\r\n" + json);

			// 传到前台js
			out.write(json);

			// JSONArray outArray = hwDeptService.findProvinceDept();

			// out.write(json.toString());
			out.flush();

		} catch (IOException e) {
			log.error("Get Province Tree fail:" + e.getMessage(), e);
		} catch (Exception e) {
			log.error("Get Province Tree fail:" + e.getMessage(), e);
		} finally {
			if (null != out) {
				out.close();
			}
		}
	}

 

private String buildProvinceJSON(List<HwDept> list) throws Exception {

		StringBuffer json = new StringBuffer(1000);

		for (HwDept dept : list) {

			json.append("{");
			json.append("id:\"").append(dept.getDeptId()).append("\",");
			json.append("pId:").append("0").append(",");
			json.append("name:").append("\"").append(dept.getDeptName())
					.append("\"").append(",");
			json.append("isParent:").append("true").append(",");
			json.append("open:").append("false");
			json.append("}").append(",");
		}

		String s = json.toString();

		if (s.endsWith(",")) {
			// 去掉最后面的逗号
			s = s.substring(0, s.lastIndexOf(","));
		}

		StringBuffer buf = new StringBuffer("[");

		buf.append(s);

		buf.append("]");

		return buf.toString();
	}

 

6. jsp

<ul id="tree" class="ztree" style="width:260px; overflow:auto;"></ul>

 

7. js

<script type="text/javascript">
/* 树形菜单 */
var zTree;
var demoIframe;

var setting = {
	view: {
		dblClickExpand: false,
		showLine: true,
		selectedMulti: false
	},
	data: {
		simpleData: {
			enable:true,
			idKey: "id",
			pIdKey: "pId",
			rootPId: ""
		}
	},
	callback: {
		/*
		beforeClick: function(treeId, treeNode) {
			alert(treeNode);
			var zTree = $.fn.zTree.getZTreeObj("tree");
			if (treeNode.isParent) {
				alert(treeNode);
				zTree.expandNode(treeNode);
				return false;
			} else {
				demoIframe.attr("src",treeNode.file + ".html");
				return true;
			}
		},
		*/
		onClick: reLoadOpenURL,//节点被点击时调用的函数
		beforeExpand: zTreeBeforeExpand //用于捕获父节点展开之前的事件回调函数,并且根据返回值确定是否允许展开操作
	}
};
$(function(){
			
	var zNodes;
	var zTreeObj;
	
	$.ajax({
		url : "${ctx}/hw/dept/getProvinceTree",
		type : "POST",
		dataType: "text", // 字符串格式
		success : function (strReult) {
			// 将json字符串转成json对象
			zNodes = eval("(" + strReult + ")");
			
			zTreeObj = $.fn.zTree.init($("#tree"), setting, zNodes);
			
		}, error: function () {
			alert("获取省公司数据失败!");
		}
	});
});
</script>

 

结果如下:



 

下面加载子节点,点击省前面的加号(+),到后台查找对应的市一级数据,然后加载显示。

8. 根据省份id查找对应的市级信息dao方法

public List<HwDept> findByPId(String parentId) throws Exception {

		String sql = "SELECT * FROM HW_DEPT WHERE PARENT_ID = ? ORDER BY DEPT_NAME ASC";

		return getJdbcTemplate().query(sql, new Object[] { parentId },
				new RowMapper<HwDept>() {

					@Override
					public HwDept mapRow(ResultSet rs, int rowNum)
							throws SQLException {

						HwDept dept = new HwDept();

						dept.setDeptId(rs.getString("DEPT_ID"));
						dept.setDeptName(rs.getString("DEPT_NAME"));
						dept.setDeptLevel(rs.getString("DEPT_LEVEL"));
						dept.setManageLevel(rs.getString("MANAGE_LEVEL"));
						dept.setParentId(rs.getString("PARENT_ID"));

						return dept;
					}
				});
	}

 

9. 根据省份id查找对应的市级信息controller方法

@RequestMapping("/getCityTree")
	public void getCityTree(HttpServletResponse resp,
			@RequestParam("parentId") String parentId) {

		log.info("Get City Tree, parentId=" + parentId);

		PrintWriter out = null;

		try {
			out = resp.getWriter();

			List<HwDept> depts = hwDeptService.findByPId(parentId);

			// 将集合对象拼接成json字符串
			String json = buildCityJSON(depts, parentId);

			log.info("City Tree json is:\r\n" + json);

			// 传到前台js
			out.write(json);

			out.flush();

		} catch (IOException e) {
			log.error("Get City Tree fail:" + e.getMessage(), e);
		} catch (Exception e) {
			log.error("Get City Tree fail:" + e.getMessage(), e);
		} finally {
			if (null != out) {
				out.close();
			}
		}
	}
private String buildCityJSON(List<HwDept> list, String parentId)
			throws Exception {

		StringBuffer buf = new StringBuffer(1000);

		for (HwDept dept : list) {

			buf.append("{");
			buf.append("id:\"").append(dept.getDeptId()).append("\",");
			buf.append("pId:").append("\"").append(parentId).append("\",");
			buf.append("name:").append("\"").append(dept.getDeptName())
					.append("\"").append(",");
			buf.append("isParent:").append("true").append(",");
			buf.append("open:").append("false");
			buf.append("}").append(",");
		}

		String s = buf.toString();

		if (s.endsWith(",")) {
			// 去掉最后面的逗号
			s = s.substring(0, s.lastIndexOf(","));
		}

		StringBuffer json = new StringBuffer(1000);

		json.append("[");

		json.append(s);

		json.append("]");

		return json.toString();
	}

  

10. 加载子节点js方法

// beforeExpand: 用于捕获父节点展开之前的事件回调函数,并且根据返回值确定是否允许展开操作
		function zTreeBeforeExpand(treeId, treeNode) {

			var zTree = $.fn.zTree.getZTreeObj(treeId);
			
			if (treeNode.isParent) {
				/*如果是父节点*/
				if(treeNode.open){
					/*父节点为展开状态,则折叠父节点*/
					zTree.expandNode(treeNode,false,true,true,false);
				} else {
					/*父节点为折叠状态,点击展开后加载子节点 */
					var parentId = treeNode.id;
					$.ajax({
						url : "${ctx}/hw/dept/getCityTree",
						type : "POST",
						dataType: "text", // 字符串格式
						data: {parentId : parentId},
						success : function (data1) {
							
				            // 将json字符串转成json对象
				            zNodes = eval("(" + data1 + ")");
				            
				            zTree.addNodes(treeNode, zNodes); 
							
						}, error: function () {
							alert("获取市公司数据失败!");
						}
					});
				}
			}
		}

 

11. 结果如下:



 

  • 大小: 5.9 KB
  • 大小: 2.7 KB
  • 大小: 6.5 KB
分享到:
评论

相关推荐

    jQuery使用zTree插件实现树形菜单和异步加载

    主要介绍了jQuery使用zTree插件实现树形菜单和异步加载的相关方法,感兴趣的小伙伴们可以参考一下

    前端框架 zTree 从数据库中动态加载树形菜单

    前端框架 zTree 从数据库中动态加载树形菜单前端框架

    使用Ztree实现java动态树形菜单

    包括代码源文件,数据库,直接下载就可以直接运行,里面还包括分页的实现

    ztree+dwr实现的异步加载树形菜单

    ztree+dwr实现的异步加载树形菜单

    bootstrap风格的zTree树形菜单代码.zip

    bootstrap风格的zTree树形菜单代码 一款支持自定义编辑,添加列表,删除列表等功能的bootstrap风格的zTree树形菜单代码,jQuery树形结构菜单插件下载。

    ztree树形菜单

    zTree 是利用 JQuery 的核心代码,实现一套能完成大部分常用功能的 Tree 插件。它与 IE、FireFox、Chrome 等浏览器保持兼容,在一个页面内可同时生成多个Tree 实例,支持一次性静态生成和Ajax 异步加载两种方式,...

    zTree 非常强大的树形控件

    zTree 非常强大的树形控件 、zTree v3.0 针对大数据量一次性加载进行了更深入的优化,实现了延迟加载功能,即不展开的节点不创建子节点的 Dom。 2)、对于每级节点最多一百左右,但总节点数几千甚至几万,且不是全部...

    jQuery ztree实现动态树形多选菜单

    主要介绍了jQuery ztree实现动态树形多选菜单,ztree动态树形菜单,初始化加载和延迟加载,感兴趣的小伙伴们可以参考一下

    基于zTree树形菜单的使用实例

    在每个节点添加 id 和 pid, id 表示当前节点编号,pid 表示父节点编号 第一步:在页面显示菜单位置,添加 ul设置 class...ztree树形菜单的使用&lt;/title&gt; &lt;!-- 导入jquery核心类库 --&gt; [removed][removed]

    Ztree 3.5 jq 树形菜单插件

    但却是使用最简单的Tree菜单,最简单的树菜单 -- 与标准 JSON 数据完美相结合,用ZTree可以创建不显示连接线的树、不显示节点图标的树、自定义图标 -- icon 属性的树、显示自定义字体的树状菜单、异步加载节点数据的...

    jQuery zTree加载树形菜单功能

    主要为大家详细介绍了jQuery zTree加载树形菜单功能,轻松设计树形结构菜单功能,感兴趣的小伙伴们可以参考一下

    AngularJS实现树形结构(ztree)菜单示例代码

    首先你需要知道AngularJS的双向数据绑定是什么才可以更好的理解下面的代码,想了很久才想出用下面的代码来实现左侧菜单树形结构 要实现上面的功能你需要操作如下步骤: 在HTML标签内添加ng-app,让AngularJS掌管整个...

    ZTree 异步加载 SSH JSON

    使用JQuery的插件zTree,进行动态的异步加载,带数据库,可直接运行

    zTree从数据库中动态加载树形菜单

     这个不仅仅是一个树形结构的菜单,每个节点左边可以有一个复选框,看了看也挺简单的,只需要在setting里面配置一个checked属性即可。  目前经验觉得这个用在组织结构、分类、尤其是权限,如果用这个插件完成会...

    节点互斥的ASP.NET TreeView动态树形菜单.rar

    节点互斥的ASP.NET TreeView动态树形菜单,N年前写的了,扔了这么多年重新扒出来了,当时在VS2003下测试通过  1。工具箱--&gt;添加/移除项--&gt;选.NET组件--浏览--打开--确定  2。把Microsoft.Web.UI....

Global site tag (gtag.js) - Google Analytics