zTree 可以实现异步加载。异步加载可以让初次加载速度快,带来好的用户体验。

异步加载 官方源码中的demo提示了例子。例子是采用php语言。

在java语言中,zTree如何与Servlet结合呢?

下面这个Demo演示了Servlet + Gson + MySQL 实现异步加载。

第一步,引入css和js,参考一上节《zTree

第二步,修改ztree初始方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var setting = {
    data : {
        simpleData : {
            enable : true
        }
    },
    async : {
        enable : true,
        url : "console/treeAjaxAsyncLoad.do",
        autoParam : [ "id=id" ],
        dataFilter : filter
    }
};
 
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);
 
});

关键代码在7~12行,配置异步加载功能,传递一个参数id给控制器treeAjaxAsyncLoad.do,控制器控制id查找所以子节点(直属子节点,孙子节点就没查找)

第三步,控制器

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.mysql.jdbc.StringUtils;
 
import dao.ArticleDao;
import util.JsonUtils;
 
/**
 * Servlet implementation class UserAjaxValidatingUser
 */
@WebServlet("/console/treeAjaxAsyncLoad.do")
public class TreeAjaxAsyncLoad extends HttpServlet {
 
    private static final long serialVersionUID = 1246470631076856023L;
 
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
 
        String pId = request.getParameter("id");
        ArticleDao dao = new ArticleDao();
 
        if (StringUtils.isNullOrEmpty(pId)) {
            JsonUtils.printJson(response, dao.getRootClassify());
        } else {
            JsonUtils.printJson(response, dao.getTrees(Integer.parseInt(pId)));
        }
 
    }
 
}

这部分代码是根据前端传递的参数,来查询子节点,并转换成json格式响应给前端。

JsonUtils.printJson()方法是将数据生成json格式。

代码如下:

1
2
3
4
5
6
7
8
9
public static void printJson(HttpServletResponse response, Object obj)
throws IOException {
    // 返回数据,返回数据类型是json
    response.setContentType("application/json");
    // 返回数据编码UTF-8
    response.setCharacterEncoding("UTF-8");
    // 返回数据,通过gson将数据返回给Ajax 通过gson工具提高工作效率
    response.getWriter().write(new Gson().toJson(obj));
}

第四步,数据访问层两个关键方法:

方法一:

1
2
3
4
5
6
7
8
9
10
@SuppressWarnings("unchecked")
public List<ArticleTree> getClassify(int id) {
    String sql = "SELECT id,pId,title as name FROM article where pId=?;";
    List<ArticleTree> list = JdbcUtils.getListBean(sql, ArticleTree.class, new Object[] { id });
 
    for (ArticleTree at : list) {
        at.setParent(isParent(at.getId()));
    }
    return list;
}

从数据库里查询数据封装成树结构对象。代码的第6~8行,设置是否为父节点,如果是父节点,在html上显示是一个文件夹,前面有加号,还可以展开,如果不是,在html上显示是一个文件且不可以展开。

方法二:

1
2
3
4
5
6
7
8
9
10
11
@SuppressWarnings("unchecked")
public List<ArticleTreeUrl> getTrees(int id) {
    String sql = "SELECT id,pId,title as name FROM article where pId=?;";
    List<ArticleTreeUrl> list = JdbcUtils.getListBean(sql, ArticleTreeUrl.class, new Object[] { id });
    for (ArticleTreeUrl at : list) {
        at.setParent(isParent(at.getId()));
        at.setUrl("console/article.jsp?id=" + at.getId());
        at.setTarget("_blank");
    }
    return list;
}

方法二和方法一样,都从数据库里查询数据封装成树结构对象。不同的是带查询参数,查找的是子节点。

本示例数据访问层使用apache的dbutils,读者根据自己的情况(原生JDBC、Spring JDBC、mybatis、Spring Data JPA)调整。

并且设置ztree的url。

ArticleTree和ArticleTreeUrl数据模型如下:

1
2
3
4
5
6
7
8
9
public class ArticleTree {
 
    private int id;
    private int pId;
    private String name;
    private int ParentFlags;
    boolean isParent;
     
    // 省略构造函数 访问器和修改器
1
2
3
4
5
6
7
8
9
10
11
public class ArticleTreeUrl {
 
    private int id;
    private int pId;
    private String name;
    private int ParentFlags;
    boolean isParent;
    private String url;
    private String target;
     
    // 省略构造函数 访问器和修改器

插件使用一树形插件---zTree一zTree异步加载的更多相关文章

  1. ztree学习之异步加载节点(一)

    ztreedemo.jsp: <%@ page language="java" import="java.util.*" pageEncoding=&qu ...

  2. 后台返回平铺数据,如何转换成树形json并渲染树形结构,ant tree 异步加载

    如何后台返回对象数组(平铺式) 1.根据字段标识(板块)获取根节点 ### initTreeData(dataOrg){ var resultArr=dataOrg[0] var secArr=[]; ...

  3. ztree异步加载---------补发周日内容

    上周六老师要求和大三的进行JAVA知识交流,总体来说就是给大三学长做的东西打分,然后大三学长再教我们如果构建ztree.毕竟第一次接触ztree,所以有很多不了解,但通过周六日努力,还是做出来了.现在 ...

  4. Jquery Ztree异步加载树

    1. 下载jquery的JS文件/ztree的CSS文件和JS文件 https://jquery.com/download/ https://gitee.com/zTree/zTree_v3/tree ...

  5. ztree插件异步加载 使用RESTEasy报错 Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.

    在使用ztree插件实现异步加载时遇到后台RESTEasy接收参数问题,查看后台报错: A servlet request to the URI http://localhost:8080/area/ ...

  6. ztree插件的使用及列表项拖拽的实现(jQuery)+异步加载节点数据

    为了实现如图所示的树状结构图,并使列表项可拖动到盒子里,研究了ztree这个插件的使用,并仔细研究了列表项的拖动事件.完成了预期需求,对jQuery的运用得到了提高.这个插件的功能非常强大,除了基本的 ...

  7. 使用jOrgChart插件, 异步加载生成组织架构图

    jOrgChart插件是一个用来实现组织结构图的Jquery的插件- 一.特点 1.支持拖拽修改子节点: 2.支持节点缩放展示: 3.方便修改css定义样式: 4.超轻量型: 5.兼容性好,基本支持所 ...

  8. Ztree异步加载自动展开节点

    在Ztree的官网Demo中,有自动展开的例子,是通过设置节点属性open:true来实现自动展开的,但是在异步加载中,这个属性设置为true也不会自动展开,因为open:true是指在有子节点的情况 ...

  9. JQuery ztree 异步加载实践

    本来要做一个文件目录浏览界面,需要遍历所有的文件和目录,很显然一次性读取时很费时费力的一件事情. 因此就需要做异步加载.... 不过网上的几篇帖子还挺坑的!原始参考:JQuery异步加载实例,相对来说 ...

随机推荐

  1. python,<一>读取文件open()

    在实际操作中,我们经常会读取文件,这个时候python为我们提供了一个open()的方法,供我们读取文件,通过help(open),我们可以获取open的方法 f.close()关闭读取 f.read ...

  2. POI 海量数据/大数据文件生成SXSSFWorkbook使用简介

    在之前我们知道处理xls的excel用的workbook是HSSFWorkbook,处理xlsx的excel用的是XSSFWorkbook. 上面两个类导出excel的时候数据会驻留在内存中,所以当数 ...

  3. iphoneX适配!!!

    方法1.js判断(以下采用Jquery) //适配iphonex && $(window).height() === && window.devicePixelRati ...

  4. 设计模式C++学习笔记之十六(Observer观察者模式)

      16.1.解释 概念:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. main(), IObservable,被观察者接口 CHanFei ...

  5. 浏览器开启桌面通知Web Notification

    本文主要描述如何开启各个浏览器的桌面通知功能 一.谷歌浏览器(chrome) 点击地址栏前面的图标

  6. 全系列Unity4.x.x到2017.1.1破解Win&Mac!最新Unity2017.1.1p3&4.7.2f1破解!

    Unity官网所有版本下载地址请戳: http://unity3d.com/unity/download/archive 补丁版本请戳: http://unity3d.com/cn/unity/qa/ ...

  7. fiddler 抓取 安卓模拟器 https包

    2017-12-12 16:47:45 星期二 需要材料: 1. fiddler 2. 逍遥模拟器 步骤: 1. fiddler->tool->Optiions...->connec ...

  8. use Swig to create C/C++ extension for Python

    SWIG is a software development tool that simplifies the task of interfacing different languages to C ...

  9. Vue-cli 搭建web服务介绍

    Node.js 之 npm 包管理 - Node.js 官网地址:点我前往官网 - Node.js 中文镜像官网: 点我前往```` Node.js 是一个基于 Chrome V8 引擎的 JavaS ...

  10. log4net 全局配置

    public class LogHelper { private static readonly log4net.ILog ILogInfo = log4net.LogManager.GetLogge ...