`

Ztree的异步加载子节点简单使用

阅读更多
新学Ztree,由于网上没有现成的例子,走了很多弯路,最后在ZtreeAPI的指点下终于完成了Ztree简单功能的使用,鉴于网上没有完整或注释很少的例子,现在把我的代码分享下,这个例子用到mysql数据库和struts2框架还有谷歌的GSON,所以用的时候确认有没有少了mysql的驱动包和struts2,gson的架包,好了,下面是完整的代码。
首先,ztree对应的POJO:
/**
 * 学习ztree,POJO
 * @author Dream.YangLong
 * Time:2012/12/23
 */
public class Ztree {
private String id;
private String pId;
private String name;
private String isParent;
private String file;
public Ztree() {
	super();
	this.isParent="false";
}
public String getId() {
	return id;
}
public void setId(String id) {
	this.id = id;
}
public String getpId() {
	return pId;
}
public void setpId(String pId) {
	this.pId = pId;
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public String getIsParent() {
	return isParent;
}
public void setIsParent(String isParent) {
	this.isParent = isParent;
}
public String getFile() {
	return file;
}
public void setFile(String file) {
	this.file = file;
}

}

接着基础DAO:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import dao.StringUtil;

public class DAO {
	private String db_driver;
	private String db_url;
	private String db_user;
	private String db_pass;
	private Connection conn;
	private PreparedStatement pst;
	private ResultSet set;
	
	public DAO() {
		super();
		db_driver = StringUtil.config("db_driver");
		db_url =StringUtil.config("db_url");
		db_user = StringUtil.config("db_user");
		db_pass = StringUtil.config("db_pass");
        try {
			Class.forName(db_driver);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/*
	 * 建立连接
	 */
	public Connection getConnection(){
		
		try {
			conn = DriverManager.getConnection(db_url,db_user,db_pass );
		}catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	/*
	 * 执行DML操作
	 */
	public void executeDML(String sql,Object ...param) throws SQLException{
		getConnection();
		
			pst=conn.prepareStatement(sql);
			if(param!=null){
				for(int i=0;i<param.length;i++){
					pst.setObject(i+1, param[i]);
				}
			}
			pst.execute();
	}
	/*
	 * 执行SQL语句得到结果集合
	 */
	public ResultSet executeQuery(String sql,Object ...param){
		getConnection();
		try {
			pst=conn.prepareStatement(sql);
			if(param!=null){
				for(int i=0;i<param.length;i++){
					pst.setObject(i+1, param[i]);
				}
			}
			set=pst.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return set;
	}
	
	/*
	 * 关闭通道
	 */
	public void closeAll(){
		try {
			if(set!=null){
				set.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			if(pst!=null){
				pst.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			if(conn!=null){
				conn.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public Connection getConn() {
		return conn;
	}

	public void setConn(Connection conn) {
		this.conn = conn;
	}

	public PreparedStatement getPst() {
		return pst;
	}

	public void setPst(PreparedStatement pst) {
		this.pst = pst;
	}

	public ResultSet getSet() {
		return set;
	}

	public void setSet(ResultSet set) {
		this.set = set;
	}
	

}

用户DAO:
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import bean.Ztree;
/**
 * 学习ztree,dao
 * @author Dream.YangLong
 * Time:2012/12/23
 */
public class UserDao extends DAO{
    /*
     * 注册新节点方法,Bean驱动
     */
	public boolean addNode(Ztree zTree){
		boolean flag=true;
		String sql="insert into nodes(id,name,pid,isparent,url) " +
				" values(?,?,?,?,?)";
		try {
			this.executeDML(sql, zTree.getId(),zTree.getName(),zTree.getpId(),
					zTree.getIsParent(),zTree.getFile());
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			flag=false;
		}		
		return flag;	
	}
	
	/*
	 * 查找节点方法,bean驱动
	 */
	public ArrayList<Ztree> getSubNodes(Ztree zTree){
		ArrayList<Ztree> allNodes=new ArrayList<Ztree>();
        String querySql="select * from " +
        		"nodes " +
        		"where pid=?";
        try {
			ResultSet nodeSet=this.executeQuery(querySql,zTree.getId());
			while(nodeSet.next()){
				Ztree zt=new Ztree();
				zt.setId(nodeSet.getString("id"));
				zt.setName(nodeSet.getString("name"));
				zt.setpId(nodeSet.getString("pid"));
				zt.setIsParent(nodeSet.getString("isparent"));
		//为实现url的框架跳转,跳转target在页面用Onclick函数处理,ztree的url在POJO中为file
				zt.setFile(nodeSet.getString("url"));
				allNodes.add(zt);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			this.closeAll();
		}
     return allNodes;
	}	
}

读取配置文件的帮助类:
import java.util.ResourceBundle;

public class StringUtil {
static ResourceBundle rb=ResourceBundle.getBundle("config");//加载资源文件

/**
 * 
 * @param key 指定配置文件内容常量名字
 * @return  对应值
 */
public static String config(String key){
	String result=null;
	try {
		result=rb.getString(key);
	} catch (Exception e) {
		e.printStackTrace();
	}
	return result;
}

public static int parseInt(String str){
	int result=0;
	try {
		result=Integer.parseInt(str);
	} catch (NumberFormatException e) {
		e.printStackTrace();
		System.out.println("格式化异常!");
	}
	return result;
}
}

配置文件config.properties:
db_driver=com.mysql.jdbc.Driver
db_url=jdbc\:mysql\:\//127.0.0.1\:3306\/ztree
db_user=root
db_pass=root

下面是STRUTS2配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.action.extension" value="action,do"></constant> 
<package name="action" namespace="" extends="struts-default">
<action name="TestAction" class="action.TestAction">
<!-- 下面result为测试跳转使用,ztree并未使用 -->
<result name="testZTreePage">clickme.html</result>
</action>
</package>
</struts>    

接着ACTION:
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import bean.Ztree;
import com.google.gson.Gson;
import dao.UserDao;
/**
 *  学习Ztree struts2,JDBC整合Action
 *  @author Dream.YangLong
 *  Time:2012/12/23
 */
public class TestAction {
	private UserDao userdao=new UserDao();
	public String getNodes(){
		//获取request对象
		HttpServletRequest request=ServletActionContext.getRequest();
		//获取AJAX请求参数
		String id=request.getParameter("id");
		String pId=request.getParameter("pId");
		//生成驱动Bean,为页面当前被点击节点,即将要获取节点的父节点
		Ztree pZtree=new Ztree();
		pZtree.setId(id);
		pZtree.setpId(pId);
		System.out.println("提交的参数:"+id+":"+pId);
		//生成JSON转换辅助对象
		Gson gson = new Gson();
		//获取子节点
	    List<Ztree> nodes=userdao.getSubNodes(pZtree);
		//转换为JSON数据格式
		String subNodes=gson.toJson(nodes);
		System.out.println("服务器端生成的JSON数据为:"+subNodes);
		//获取response对象
		HttpServletResponse response = ServletActionContext.getResponse();
		//返回页面的信息为utf-8编码,不加这个提示信息就会变成乱码
		response.setCharacterEncoding("utf-8");
		//返回页面的信息为html/text格式,不加这个返回页面的信息就会是整个页面
		response.setContentType("html/text");	
		//将信息通过ajax返回
		PrintWriter out = null;	
		try {
			 out = response.getWriter();
			 out.print(subNodes);
			 out.flush();
			 out.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block	
			e.printStackTrace();
		}
		
		return null;
	}

}

WEB.XML:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name></display-name>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>
  		org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  	</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
  </filter-mapping>
  <welcome-file-list>
    <welcome-file>ztree.jsp</welcome-file>
  </welcome-file-list>
</web-app>

最后JSP页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<HTML>
 <HEAD>
  <TITLE> ZTREE DEMO </TITLE>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <link rel="stylesheet" href="css/zTreeStyle/zTreeStyle.css" type="text/css">
  <style>
	body {
	background-color: white;
	margin:0; padding:0;
	text-align: center;
	}
	div, p, table, th, td {
		list-style:none;
		margin:0; padding:0;
		color:#333; font-size:12px;
		font-family:dotum, Verdana, Arial, Helvetica, AppleGothic, sans-serif;
	}
	#testIframe {margin-left: 10px;}
  </style>
<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 type="text/javascript" >
  <!--
     //var ztreeObj;//树对象
     //初始化目录节点,可进入页面由ACTION传值过来。静态的在用字符串作为id时,要用""或''包起来,否则不能识别
     	var zNodes =[
		{id:1, pId:0, name:"渠道酬金管理目录",open:true},
		{id:101, pId:1, name:"目录1", isParent:true, open:false},
		{id:102, pId:1, name:"目录2†", isParent:true, open:false},
		{id:103, pId:1, name:"目录3†", isParent:true, open:false}       
	   ];
    var setting = {
		view: {
			dblClickExpand: false,//双击节点时,是否自动展开父节点的标识
			showLine: true,//显示下划线
			selectedMulti: false,//设置是否允许同时选中多个节点。
			expandSpeed: 400//"slow"//节点展开速度
		},
		data: {
			simpleData: {//是否为简单数据类型JSON
				enable:true,
				idKey: "id",//使用简单必须标明的的节点对应字段
				pIdKey: "pId",//使用简单必须标明的的父节点对应字段
				rootPId:null//根
			}
		},
		async: {
				enable: true,//异步加载
				//请求地址,可用function动态获取
				url:"TestAction!getNodes.action",
                contentType:"application/x-www-form-urlencoded",//按照标准的 Form 格式提交参数
				autoParam:["id", "pId"],//提交的节点参数,可用“id=xx”取请求提交时的别名
				//otherParam:{"otherParam":"zTreeAsyncTest"},//提交的其他参数,json的形式
				dataType:"json",//返回数据类型
			    type:"post",//请求方式
				dataFilter: null//数据过滤
				},
		callback: {
		    onClick:reLoadOpenURL,//节点被点击时调用的函数
		    onAsyncError: onAsyncError,//异步加载失败调用的函数	
            //onExpand: zTreeOnExpand,//用于捕获节点被展开的事件回调函数
            beforeExpand: zTreeBeforeExpand,//用于捕获父节点展开之前的事件回调函数,并且根据返回值确定是否允许展开操作
		  }
	 };
	 //如果是父节点不处理,如果是子节点,打开对应的连接
	 function reLoadOpenURL(event, treeId, treeNode){
	 //alert(treeNode.tId + ", " + treeNode.name+","+treeNode.id); 
	 var zTree = $.fn.zTree.getZTreeObj(treeId);
				if (treeNode.isParent) {//如果是父节点
					//zTree.reAsyncChildNodes(treeNode, "refresh",false);//异步刷新,清空后加载,加载后打开
					if(treeNode.open){//父节点为展开状态,折叠父节点
					//alert(treeNode.open);
					zTree.expandNode(treeNode,false,true,true,false);
					//expandNode参数说明:节点,展开(true)/折叠(false),是否影响子孙节点,是否设置焦点,是否触发beforeExpand/onExpand或beforeCollapse/onCollapse事件回调函数
					  }					
					else{//父节点是折叠的
					if(treeNode.id!=1)zTreeBeforeExpand(treeId, treeNode);//如果不是根节点(本例根节点为1),则强制异步刷新子节点数据
					else
					zTree.expandNode(treeNode,true,false,true,false);//如果是根节点则展开
					}
					return false;
				} else {//不是父节点,打开对应链接
					$("#testIframe").attr("src",treeNode.file + ".html");
					return true;
				}
				
				
			}
	//用于捕获父节点展开之前的事件回调函数,并且根据返回值确定是否允许展开操作 ,false不代开	
	 function zTreeBeforeExpand(treeId, treeNode) {
	      var zTree = $.fn.zTree.getZTreeObj(treeId);
                  if (treeNode.isParent&&treeNode.id!="1") {
					zTree.reAsyncChildNodes(treeNode, "refresh");//异步刷新,清空后加载,加载后打开,需要不打开加参数true
					return false;//使用了异步强行加载,如果用true,节点展开将不会按照expandSpeed属性展开,false将按照设定速度展开
				    }
				 else {
					return true;
				     }
              };
	 //用于捕获节点被展开后的事件回调函数	
     function zTreeOnExpand(event, treeId, treeNode) {
                 alert(treeNode.tId + ", " + treeNode.name);
        };	
    
     //数据过滤方法,如后台数据已确认无误可直接返回数据,不需注册此回调函数
	 function filter(treeId, parentNode, childNodes) {
			if (!childNodes) return null;
			return childNodes;
		}
	 //异步加载失败时调用的方法
	 function onAsyncError(event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) {
			alert("加载失败!");
		}
		
		//初始化树
     $(document).ready(function(){
		   $.fn.zTree.init($("#treeDemo"), setting, zNodes);
		}); 
		
			 
	  /**
	  function callOnClick(event,treeId, treeNode) {
				 var zTree = $.fn.zTree.getZTreeObj(treeId);
				if (treeNode.isParent) {//如果是父节点
					//zTree.reAsyncChildNodes(treeNode, "refresh",false);//异步刷新,清空后加载,加载后打开
					if(treeNode.open){//父节点为展开状态,折叠父节点
					//alert(treeNode.open);
					zTree.expandNode(treeNode,false,true,true,false);
					//expandNode参数说明:节点,展开(true)/折叠(false),是否影响子孙节点,是否设置焦点,是否触发beforeExpand/onExpand或beforeCollapse/onCollapse事件回调函数
					  }					
					else{//父节点是折叠的
					if(treeNode.id!=1)zTreeBeforeExpand(treeId, treeNode);//如果不是根节点(本例根节点为1),则强制异步刷新子节点数据
					else
					zTree.expandNode(treeNode,true,false,true,false);//如果是根节点则展开
					}
					return false;
				} else {//不是父节点,打开对应链接
					$(parent.document).find('#testFrame').attr('src', treeNode.file + ".html");
					return true;
				}	
			}
	 */
  //-->
  </SCRIPT>
 </HEAD>

<BODY>
<TABLE border=0 height=600px align=left width="100%">
    <TR>
        <TD colspan="2" STYLE="WIDTH: 100%;HEIGHT: 100PX;"><input type="hidden" name="author" value="BeiFangUniversity.09Software.YangLong"></TD>
    </TR>
	<TR>
		<TD width=160px align=left valign=top style="BORDER-RIGHT: #999999 1px dashed">
			<ul id="treeDemo" class="ztree"  style="width:225px; overflow:auto;"></ul>
		</TD>
		<TD width=770px align=left valign=top>
            <IFRAME ID="testIframe" Name="testIframe" FRAMEBORDER=0 SCROLLING=AUTO width=100%  height=600px SRC=""></IFRAME>
        </TD>
	</TR>
</TABLE>
</BODY>
</HTML>

哦,对了还有测试数据库 
CREATE DATABASE `ztree` /*!40100 DEFAULT CHARACTER SET utf8 */;

DROP TABLE IF EXISTS `nodes`;
CREATE TABLE `nodes` (
  `id` varchar(30) NOT NULL,
  `pid` varchar(30) default '0',
  `name` varchar(50) default NULL,
  `isparent` varchar(50) default NULL,
  `url` varchar(100) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



INSERT INTO `nodes` (`id`,`pid`,`name`,`isparent`,`url`) VALUES ('1011a','101','目录1.1','false','clickme');
INSERT INTO `nodes` (`id`,`pid`,`name`,`isparent`,`url`) VALUES ('1012a','101','目录1.2','false','clickme');
INSERT INTO `nodes` (`id`,`pid`,`name`,`isparent`,`url`) VALUES ('1021a','102','目录2.1','false','clickme');
INSERT INTO `nodes` (`id`,`pid`,`name`,`isparent`,`url`) VALUES ('1022a','102','目录2.2','false','clickme');

就这么多了,写的不好多见谅,其实看在线的ZTREE API挺好的,只是对于javascript不太好的同学可能会感到无从下手,所以给个小小的建议,把Ztree看成个java类,可以看到他有属性,有方法,这样好理解点!Ztree的功能蛮强大的,就是在异步交互提交动态参数这有点不方便。
分享到:
评论
1 楼 wang514674793 2013-06-05  
写的很好,谢谢了~~~

相关推荐

    zTree异步加载子节点针对大数据量数列表

    最近项目中有一个比较大型的树节点加载,网上面也看过一些解决方案,感觉都不是很好,也有很多误区,比如单击节点时加载子...ztree fileter方法是在每次展开时都会执行,所以根据不同的请求达到异步加载子节点的需求。

    java实现ztree异步加载

    ZTree的一个显著特性是支持异步加载,这意味着它可以在用户需要时按需加载子节点,减少了初次加载时的数据量,提高了页面响应速度。本文将详细讲解如何使用Java来实现ZTree的异步加载功能。 首先,我们需要理解...

    jQuery zTree 异步加载添加子节点重复问题

    在解决jQuery zTree异步加载添加子节点时出现的重复问题之前,我们首先需要理解zTree树插件的基本特性和其工作原理。zTree是一个基于jQuery的树形控件,它支持多功能的树形结构展示,并且可以轻松实现节点的增删改查...

    关于javaWeb(S2SH)中使用zTree异步加载树节点问题

    在上述问题中,开发者遇到了在S2SH项目中使用zTree异步加载树节点的问题。首先,我们需要了解zTree异步加载的基本配置。`settingMan`对象包含了zTree的配置参数: 1. `data.simpleData.enable : true`:开启简单...

    ztree异步加载

    "ztree异步加载"正是解决这一问题的一种高效方案。ZTree是一款基于JavaScript的富UI组件,它提供了一种灵活的方式来构建可交互的树形控件。在处理大量数据时,一次性加载所有节点会导致页面响应变慢,用户体验下降,...

    jquery ztree 异步加载

    ### jQuery ZTree异步加载详解 #### 一、概述 jQuery ZTree插件是一款功能强大的树形控件,被广泛应用于Web开发中,用于展示层级结构数据。在大数据量的场景下,同步加载所有节点数据可能会导致页面加载缓慢,用户...

    ztree异步加载demo(有说明文档)

    【标题】"ztree异步加载demo(有说明文档)" 涉及到的知识点主要围绕着ZTree,这是一个非常流行的JavaScript组件,主要用于构建树形结构的界面,尤其适用于网站导航、文件目录管理和组织结构展示等场景。异步加载是...

    zTree异步加载简单示例VS2008项目完整源码

    这个"zTree异步加载简单示例VS2008项目完整源码"是针对开发人员的一个实用资源,提供了如何在Visual Studio 2008环境下实现zTree异步加载功能的具体代码实例。 异步加载(Async Loading)是zTree的核心特性之一,它...

    使用ztree异步加载全国地区。

    4. **用户交互**:用户点击树节点时,zTree会触发相应的事件,如`onClick`,此时你可以根据需要决定是否触发异步加载子节点。如果用户首次打开页面,可能需要加载根节点的子节点;而当用户展开其他节点时,则只加载...

    zTree异步加载Demo

    【zTree异步加载Demo】是一个基于SpringMVC框架和MySQL数据库实现的示例,它展示了如何使用zTree这一流行的JavaScript树形插件进行异步数据加载。zTree是一款功能强大的jQuery插件,广泛用于构建多级目录结构,如...

    ztree异步加载1

    《zTree异步加载详解——打造高效数据交互体验》 在IT行业中,zTree是一款广泛应用于Web开发的JavaScript树插件,它以其轻量级、灵活性和强大的功能深受开发者喜爱。尤其是在处理大量数据的场景下,zTree的异步加载...

    jquery ztree 异步动态加载

    以下是一个简单的ZTree异步加载示例: ```javascript $(function() { var setting = { async: { enable: true, url: "/getNodes", type: "post", autoParam: ["id"], otherParam: {"type": "async"} }, ...

    ZTree 异步加载 SSH JSON

    以上就是ZTree异步加载SSH JSON的基本实现步骤。在实际应用中,可能还需要考虑权限控制、懒加载、异步加载失败的处理等问题,以满足更复杂的需求。通过这种方式,我们可以构建出高效、动态的树形界面,提升Web应用的...

    ztree 异步加载 拖拽 右键菜单 功能

    异步加载是zTree的核心特性之一,它允许在用户滚动或点击节点时按需加载子节点数据,减少了初始页面加载时的数据量,提高了页面响应速度。实现异步加载需要设置`async`参数,例如: ```javascript var setting = { ...

    zTree异步加载展开第一级节点的实现方法

    zTree异步加载展开第一级节点的实现方法是指在使用zTree插件时,如何实现异步加载展开第一级节点的功能。实现该功能需要在setting中的callback中添加onAsyncSuccess回调函数,并在回调函数中实现展开第一级节点的...

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

    4. **异步加载数据**:当用户展开树形菜单的某个节点时,ZTree会自动触发异步请求,调用DWR中的后台方法获取子节点数据。后台处理完毕后,将结果返回给前端。 5. **接收并渲染数据**:前端接收到数据后,ZTree会...

    jquery zTree异步加载、模糊搜索简单实例分享

    在`zTreeBeforeExpand`回调函数中,我们看到当节点即将展开时,会触发异步请求来加载子节点。通过设置`async.enable: true`,zTree知道应该启用异步加载功能。 2. 选中节点时加载数据:另一种异步加载的场景是当...

    使用 zTree 动态加载树形菜单

    zTree允许我们按需加载子节点,只在用户展开父节点时才请求服务器获取对应的数据,从而提高了用户体验。这涉及到Ajax技术,通过发送HTTP请求获取服务器端数据,并在客户端进行渲染。 要使用zTree,你需要在HTML中...

Global site tag (gtag.js) - Google Analytics