Java zTree 的异步加载demo示例

本文介绍如何使用 Java 实现 zTree 的异步加载功能,包括数据库连接、权限类定义、测试类编写及 HTML 页面配置等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

地址:http://blog.youkuaiyun.com/kui1056856191/article/details/8239742

Java zTree 的异步加载demo示例

分类: zTree 学习 105人阅读 评论(0) 收藏 举报

最近需要使用树形展示权限,所以研究了一下Java Tree,其实java中有不少Tree展示,具体有如下几种:吐舌头

Tree的几种开源组件:
1.dtree

2.ztree(国内的,api全中文,我用这个)

3.JTree

4.dhtmlxTree(国外的,种类齐全),网址为 : http://dhtmlx.com/docs/products/dhtmlxTree/index.shtml

##以后是我找的还不错的Tree组件,还有很多!

具体使用方式请参考zTreeAPI或zTree Demo

(1)编写数据库脚本添加数据

(2)定义一个基本权限类:Competence.java

  1. public class Competence {
  2. private int id;// 编号
  3. private int pId;// 父节点
  4. private int isParent;// 是否父节点
  5. private String name;// 节点名称
  6. private int open;// 是否打开
public class Competence {
	private int id; // 编号
	private int pId;	// 父节点
	private int isParent;	// 是否父节点
	private String name;	// 节点名称
	private int open;	// 是否打开
  1. // 此处省略 get,set方法
	// 此处省略 get,set方法


(3)创建BaseDao.java联接数据库

  1. package com.demo.test;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.sql.Statement;
  8. /**
  9. * 连接数据源
  10. * @author 小奎
  11. */
  12. public class BaseDao {
  13. static Connection conn;// 创建联接
  14. PreparedStatement st; //  预执行类
  15. ResultSet rs; // 结果集
  16. /**
  17. * 得到连接
  18. * @return connnection
  19. */
  20. public static Connection getConnection() {
  21. try {
  22. // 加载驱动
  23. Class.forName("oracle.jdbc.driver.OracleDriver");
  24. try {
  25. // 创建联接
  26. conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","scott");
  27. System.out.println("---------------- 打开连接 -----------------");
  28. } catch (SQLException e) {
  29. System.out.println("---------------- 连接失败 -----------------");
  30. e.printStackTrace();
  31. }
  32. } catch (ClassNotFoundException e) {
  33. System.out.println("---------------- 驱动加载失败 -----------------");
  34. e.printStackTrace();
  35. }
  36. return conn;
  37. }
  38. /**
  39. * 关闭连接对象
  40. * @param rs
  41. * @param st
  42. * @param conn
  43. */
  44. public staticvoid closeConnection(ResultSet rs, Statement st, Connection conn) {
  45. try {
  46. if (rs != null) {
  47. rs.close();
  48. }
  49. if (st != null) {
  50. st.close();
  51. }
  52. if (conn != null && !conn.isClosed()) {
  53. conn.close();
  54. }
  55. System.out.println("---------------- 关闭连接 -----------------");
  56. } catch (SQLException e) {
  57. System.out.println("---------------- 关闭连接失败 -----------------");
  58. e.printStackTrace();
  59. }
  60. }
  61. }
package com.demo.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 连接数据源 
 * @author 小奎
 */
public class BaseDao {
	 static Connection conn; // 创建联接
	 PreparedStatement st; //  预执行类
	 ResultSet rs; // 结果集

	/**
	 *  得到连接
	 *  @return connnection
	 */
	public static Connection getConnection() {
		try {
			// 加载驱动
			Class.forName("oracle.jdbc.driver.OracleDriver");
			try {
				// 创建联接
				conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "scott", "scott");
				System.out.println("---------------- 打开连接 -----------------");
			} catch (SQLException e) {
				System.out.println("---------------- 连接失败 -----------------");
				e.printStackTrace();
			}
		} catch (ClassNotFoundException e) {
			System.out.println("---------------- 驱动加载失败 -----------------");
			e.printStackTrace();
		}
		return conn;
	}

	/**
	 * 关闭连接对象
	 * @param rs
	 * @param st
	 * @param conn
	 */
	public static void closeConnection(ResultSet rs, Statement st, Connection conn) {
		try {
			if (rs != null) {
				rs.close();
			}
			if (st != null) {
				st.close();
			}
			if (conn != null && !conn.isClosed()) {
				conn.close();
			}
			System.out.println("---------------- 关闭连接 -----------------");
		} catch (SQLException e) {
			System.out.println("---------------- 关闭连接失败 -----------------");
			e.printStackTrace();
		}
	}
}

(4) 创建测试的类 Test.java

  1. package com.demo.test;
  2. import java.sql.Connection;
  3. import java.sql.SQLException;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. public class Test extends BaseDao {
  7. public List<Competence> getAllAuthorize() {
  8. List<Competence> authorizes = new ArrayList<Competence>();
  9. Connection conn = getConnection(); // 得到联接
  10. try {
  11. st = conn.prepareStatement("select * from authorize2 ");
  12. rs = st.executeQuery(); // 得到结果集
  13. while (rs.next()) {
  14. Competence authorize = new Competence();
  15. authorize.setId(rs.getInt("id"));
  16. authorize.setpId(rs.getInt("pid"));
  17. authorize.setOpen(rs.getInt("open"));
  18. authorize.setIsParent(rs.getInt("isParent"));
  19. authorize.setName(rs.getString("name"));
  20. // 添加到集合
  21. authorizes.add(authorize);
  22. }
  23. } catch (SQLException e) {
  24. System.out.println("---------------- 查询authorize失败 -----------------");
  25. e.printStackTrace();
  26. } finally {
  27. closeConnection(rs, st, conn);
  28. }
  29. return authorizes;
  30. }
  31. /**
  32. * 拼接成json类型
  33. * @return
  34. */
  35. public String getJSONData(){
  36. Test d = new Test();
  37. List<Competence> list=d.getAllAuthorize();
  38. StringBuffer json=new StringBuffer("[");
  39. String data="";
  40. for (int i = 0; i < list.size(); i++) {
  41. json.append("{id:"+list.get(i).getId()+",");
  42. json.append("pId:"+list.get(i).getpId()+",");
  43. json.append("name:\""+list.get(i).getName()+"\",");
  44. if (list.get(i).getIsParent() !=0) {
  45. json.append("isParent:"+list.get(i).getIsParent()+",");
  46. }
  47. if (list.get(i).getOpen() !=0) {
  48. json.append("open:"+list.get(i).getOpen()+",");
  49. }
  50. data=json.substring(0,json.lastIndexOf(","))+"},";
  51. json=new StringBuffer(data);
  52. }
  53. data=json.substring(0, json.length()-1)+"]";
  54. System.out.println(data);
  55. return data;
  56. }
  57. public static void main(String[] args) {
  58. Test demoTest=new Test();
  59. demoTest.getJSONData();
  60. }
  61. }

(4) 创建加载zTree 树的html或jsp页面 asyncLoad.html

  1. <!DOCTYPE html>
  2. <HTML>
  3. <HEAD>
  4. <TITLE>zTree Demo</TITLE>
  5. <metahttp-equiv="content-type"content="text/html; charset=UTF-8">
  6. <linkrel="stylesheet"href="../css/demo.css"type="text/css">
  7. <!-- 必须文件 zTreeStyle.css、jquery.ztree.core-x.js、jquery-x.min.js -->
  8. <linkrel="stylesheet"href="../css/zTreeStyle/zTreeStyle.css"type="text/css">
  9. <scripttype="text/javascript"src="../js/jquery-1.4.4.min.js"></script>
  10. <scripttype="text/javascript"src="../js/jquery.ztree.core-3.5.js"></script>
  11. <scriptlanguage="JavaScript">
  12. var setting = {
  13. async : {
  14. enable : true, // 设置 zTree是否开启异步加载模式
  15. url : "asyncData/loadData2.jsp", // Ajax 获取数据的 URL 地址
  16. autoParam : [ "id" ] // 异步加载时自动提交父节点属性的参数,假设父节点 node = {id:1, name:"test"},异步加载时,提交参数zId=1
  17. },
  18. data:{ // 必须使用data
  19. simpleData : {
  20. enable : true,
  21. idKey : "id", // id编号命名 默认
  22. pIdKey : "pId", // 父id编号命名 默认
  23. rootPId : 0 // 用于修正根节点父节点数据,即 pIdKey 指定的属性值
  24. }
  25. },
  26. // 回调函数
  27. callback : {
  28. onClick : function(event, treeId, treeNode, clickFlag) {
  29. // 判断是否父节点
  30. if(!treeNode.isParent){
  31. alert("treeId自动编号:" + treeNode.tId + ", 节点id是:" + treeNode.id + ", 节点文本是:" + treeNode.name);
  32. }
  33. },
  34. //捕获异步加载出现异常错误的事件回调函数 和 成功的回调函数
  35. onAsyncError : zTreeOnAsyncError,
  36. onAsyncSuccess : function(event, treeId, treeNode, msg){
  37. }
  38. }
  39. };
  40. // 加载错误提示
  41. function zTreeOnAsyncError(event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) {
  42. alert("加载错误:" + XMLHttpRequest);
  43. };
  44. // 过滤函数
  45. function filter(treeId, parentNode, childNodes) {
  46. if (!childNodes)
  47. return null;
  48. for ( var i = 0, l =childNodes.length; i< l; i++) {
  49. childNodes[i].name = childNodes[i].name.replace(/\.n/g, '.');
  50. }
  51. return childNodes;
  52. }
  53. // 渲染
  54. $(document).ready(function() {
  55. $.fn.zTree.init($("#treeDemo"), setting);
  56. });
  57. </script>
  58. </HEAD>
  59. <BODY>
  60. <div>
  61. <ulid="treeDemo"class="ztree"></ul>
  62. </div>
  63. </BODY>
  64. </HTML>
<!DOCTYPE html>
<HTML>
<HEAD>
<TITLE>zTree Demo</TITLE>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="stylesheet" href="../css/demo.css" type="text/css">
<!-- 必须文件 zTreeStyle.css、jquery.ztree.core-x.js、jquery-x.min.js -->
<link rel="stylesheet" href="../css/zTreeStyle/zTreeStyle.css" type="text/css">
<script type="text/javascript" src="../js/jquery-1.4.4.min.js"></script>
<script type="text/javascript" src="../js/jquery.ztree.core-3.5.js"></script>
<script language="JavaScript">
	var setting = {
		async : {
			enable : true, // 设置 zTree是否开启异步加载模式
			url : "asyncData/loadData2.jsp", // Ajax 获取数据的 URL 地址
			autoParam : [ "id" ]	// 异步加载时自动提交父节点属性的参数,假设父节点 node = {id:1, name:"test"},异步加载时,提交参数 zId=1
		},
		data:{ // 必须使用data
 			simpleData : {
				enable : true,
				idKey : "id", // id编号命名 默认
				pIdKey : "pId", // 父id编号命名 默认 
				rootPId : 0	// 用于修正根节点父节点数据,即 pIdKey 指定的属性值
			}
		},
		// 回调函数
		callback : {
			onClick : function(event, treeId, treeNode, clickFlag) {
				// 判断是否父节点
				if(!treeNode.isParent){
					alert("treeId自动编号:" + treeNode.tId + ", 节点id是:" + treeNode.id + ", 节点文本是:" + treeNode.name);	
				}
			},
			//捕获异步加载出现异常错误的事件回调函数 和 成功的回调函数
			onAsyncError : zTreeOnAsyncError,
			onAsyncSuccess : function(event, treeId, treeNode, msg){
				
			}
		}
	};

	// 加载错误提示
	function zTreeOnAsyncError(event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) {
		alert("加载错误:" + XMLHttpRequest);
	};

	// 过滤函数
	function filter(treeId, parentNode, childNodes) {
		if (!childNodes)
			return null;
		for ( var i = 0, l = childNodes.length; i < l; i++) {
			childNodes[i].name = childNodes[i].name.replace(/\.n/g, '.');
		}
		return childNodes;
	}

	// 渲染
	$(document).ready(function() {
		$.fn.zTree.init($("#treeDemo"), setting);
	});
</script>
</HEAD>
<BODY>
	<div>
		<ul id="treeDemo" class="ztree"></ul>
	</div>
</BODY>
</HTML>

(5) 创建一个接收的Servlet,本测试使用jsp代替 loadData.jsp

  1. <%@ page language="java"import="java.util.*"pageEncoding="utf-8"%>
  2. <%@ page import="com.demo.test.*" %>
  3. <%
  4. String id = request.getParameter("id"); // 父节点编号
  5. System.out.print("得到的节点id:"+id);
  6. Test demo=new Test();
  7. String json=demo.getJSONData();
  8. out.print(json);
  9. %>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page import="com.demo.test.*" %>

<%
		String id = request.getParameter("id");	// 父节点编号
		System.out.print("得到的节点id:"+id);
		Test demo=new Test();
		String json=demo.getJSONData();
		out.print(json);
%>

注:json数据最终会被拼接成array的形式,如下结果:雷同即可显示

[javascript] view plain copy print ?
  1. [{id:100,pId:0,name:"父节点",isParent:1,open:1},{id:101,pId:100,name:"叶子节点—1",isParent:1},{id:102,pId:100,name:"叶子节点—2",isParent:1},{id:103,pId:100,name:"叶子节点—3",isParent:1},{id:104,pId:0,name:"NB的父节点",isParent:1,open:1},{id:105,pId:104,name:"叶子节点2—1",isParent:1},{id:106,pId:104,name:"叶子节点2—2",isParent:1},{id:107,pId:104,name:"叶子节点2—3"},{id:108,pId:0,name:"郁闷的父节点",isParent:1},{id:109,pId:108,name:"叶子节点3—1"},{id:110,pId:108,name:"叶子节点3—2"},{id:111,pId:108,name:"叶子节点3—3"},{id:112,pId:101,name:"秘书"},{id:113,pId:101,name:"行政"},{id:114,pId:102,name:"助理"},{id:115,pId:102,name:"保安"},{id:116,pId:103,name:"销售"},{id:117,pId:103,name:"前台"},{id:118,pId:103,name:"主管"},{id:119,pId:105,name:"卫生"},{id:120,pId:106,name:"人事"}]
[{id:100,pId:0,name:"父节点",isParent:1,open:1},{id:101,pId:100,name:"叶子节点—1",isParent:1},{id:102,pId:100,name:"叶子节点—2",isParent:1},{id:103,pId:100,name:"叶子节点—3",isParent:1},{id:104,pId:0,name:"NB的父节点",isParent:1,open:1},{id:105,pId:104,name:"叶子节点2—1",isParent:1},{id:106,pId:104,name:"叶子节点2—2",isParent:1},{id:107,pId:104,name:"叶子节点2—3"},{id:108,pId:0,name:"郁闷的父节点",isParent:1},{id:109,pId:108,name:"叶子节点3—1"},{id:110,pId:108,name:"叶子节点3—2"},{id:111,pId:108,name:"叶子节点3—3"},{id:112,pId:101,name:"秘书"},{id:113,pId:101,name:"行政"},{id:114,pId:102,name:"助理"},{id:115,pId:102,name:"保安"},{id:116,pId:103,name:"销售"},{id:117,pId:103,name:"前台"},{id:118,pId:103,name:"主管"},{id:119,pId:105,name:"卫生"},{id:120,pId:106,name:"人事"}]

效果如图


这里的小测试使用了子父节点同时加载完毕效果,加载完毕后,单击父节点不会再次访问数据库,会从缓存中加载。所以这里使用的open属性有效果,如果是单击父节点,加载子节点再次访问数据库的方式,open可能无效。

json的数据中如isParent:1,这样的数据1代表true

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值