使用 zTree 异步加载

使用场景

可能需要展示类别很多,如果采用直接加载的方式,需要展示的数据量过大,交互十分不友好。所以采用 zTree 异步加载数据。

demo 环境

SpringBoot 1.5.9.RELEASE , 使用 jsp

war

org.springframework.boot

spring-boot-starter-parent

1.5.9.RELEASE

org.projectlombok

lombok

true

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-tomcat

org.apache.tomcat

tomcat-servlet-api

8.5.28

provided

javax.servlet

javax.servlet-api

org.apache.tomcat.embed

tomcat-embed-jasper

javax.servlet

jstl

导入 zTree 所需的 css 和 js ,导入到 resources/static 下

jsp 代码

Created by IntelliJ IDEA.

User: lvhaosir

Date: 2018/12/12

Time: 8:52

To change this template use File | Settings | File Templates.

--%>

String path = request.getContextPath();

String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()

+ path + "/";

%>

index

var basePath = '';

Ztree异步加载使用例子

var setting = {

async: {

enable: true,

url: basePath + "ztree/asyncGetNodes",

autoParam:["id"],

dataFilter: filter

},

data:{

simpleData:{

enable: true,

idKey:'id',

pIdKey:'pid',

rootPId: 0

}

},

view:{

showIcon: false

}

};

$(document).ready(function(){

initZTree();

});

function filter(treeId, parentNode, childNodes) {

return childNodes;

}

//初始化树

function initZTree(){

$.ajax({

url:basePath + "ztree/getNodes",

type:"post",

dataType: "json",

success: function(data){

console.log(data);

var zTreeObj = $.fn.zTree.init($("#zTree"),setting, data);

//让第一个父节点展开

var rootNode_0 = zTreeObj.getNodeByParam('pid',0,null);

zTreeObj.expandNode(rootNode_0, true, false, false, false);

},

error: function(){

}

});

}

Java 代码

model

package cn.lvhaosir.ztree.model;

import lombok.AllArgsConstructor;

import lombok.Data;

/**

* @Author: lvhaosir

* @Date: 2018/12/12 9:09

* @Version 1.0

*/

@Data

@AllArgsConstructor

public class Node {

private String id;

/**

* 父节点 id

*/

private String pid;

private String name;

/**

* 是否展开

*/

private String open;

/**

* 是否为父节点(下面是否还有分类)

*/

private String isParent;

}

controller

​PageController

package cn.lvhaosir.ztree.controller;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

/**

* @Author: lvhaosir

* @Date: 2018/12/12 8:50

* @Version 1.0

*/

@Controller

@RequestMapping("/page")

public class PageController {

/**

* 跳转界面

* @return

*/

@RequestMapping(value="/{filename}")

public String toPage(@PathVariable(value="filename") String filename){

System.out.println("filename:"+filename);

return filename;

}

/**

* 跳转界面

* @return

*/

@RequestMapping(value="/{folder}/{filename}")

public String toPage(@PathVariable(value="folder") String folder,@PathVariable(value="filename") String filename){

System.out.println("folder:"+folder +" filename:"+filename);

return folder+"/"+filename;

}

}

ZtreeController

package cn.lvhaosir.ztree.controller;

import cn.lvhaosir.ztree.model.Node;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;

import java.util.List;

/**

* @Author: lvhaosir

* @Date: 2018/12/12 9:10

* @Version 1.0

*/

@Controller

@RequestMapping("/ztree")

public class ZtreeController {

@RequestMapping("/getNodes")

@ResponseBody

public List getNodes() {

List nodeList = new ArrayList();

nodeList.add(new Node("1","0","一级菜单1","false","true"));

nodeList.add(new Node("10","1","二级菜单1","false","true"));

nodeList.add(new Node("11","1","二级菜单2","false","true"));

nodeList.add(new Node("12","1","二级菜单3","false","true"));

nodeList.add(new Node("2","0","一级菜单2","false","true"));

nodeList.add(new Node("20","2","二级菜单21","false","true"));

nodeList.add(new Node("21","2","二级菜单22","false","true"));

nodeList.add(new Node("22","2","二级菜单23","false","true"));

return nodeList;

}

@RequestMapping("/asyncGetNodes")

@ResponseBody

public List asyncGetNodes(String id) throws InterruptedException {

List nodeList = new ArrayList();

if("10".equals(id)){

nodeList.add(new Node("100",id,"三级菜单1","false","true"));

nodeList.add(new Node("101",id,"三级菜单2","false","false"));

} else if ("11".equals(id)) {

nodeList.add(new Node("102",id,"三级菜单21","false","false"));

nodeList.add(new Node("103",id,"三级菜单22","false","true"));

} else if ("12".equals(id)) {

nodeList.add(new Node("104",id,"三级菜单31","false","false"));

nodeList.add(new Node("105",id,"三级菜单32","false","false"));

}

Thread.sleep(2000);

return nodeList;

}

}

菜单树就能正确展示出来了。

实际使用场景

在我们实际的场景应该是,有一个根据菜单父 id 查询菜单的接口,页面首先进去加载顶级菜单,一般也就是 pid=0 的菜单,然后点击节点,传递该节点的 id 异步向后台查询子菜单来进行异步加载。

ztree java 异步_使用 zTree 异步加载相关推荐

  1. vue 如何处理两个组件异步问题_Vue异步组件处理路由组件加载状态的解决方案...

    vue.js 组件 组件(Component)是 Vue.js 最强大的功能之一. 组件可以扩展 HTML 元素,封装可重用的代码. 在大型单页面应用中,处于对性能的考虑和首屏加载速度的要求,我们一般 ...

  2. Cesium 实战 - 最新版(1.104.0)通过异步方式初始化地球,加载影像以及高程图层

    Cesium 实战-最新版(1.104.0)通过异步方式初始化地球,加载影像以及高程图层 遇到问题 初始化底图 初始化高程(监听载入完成事件,开启关闭高程) 初始化 3dtile 在线示例 Cesiu ...

  3. java 找不到或无法加载主类- 解决方案

    java 找不到或无法加载主类- 解决方案 参考文章: (1)java 找不到或无法加载主类- 解决方案 (2)https://www.cnblogs.com/caibixiang123/p/1170 ...

  4. java找不到或无法加载主类_java找不到或无法加载主类如何解决?解决方法

    相信有很多人都遇到过java找不到或无法加载主类的这个问题,那么这究竟是什么原因造成的呢?有什么方法可以解决这个问题吗? 问题: java文件导入到一个包当中,之后在class文件当中加入一张图片; ...

  5. Vue—核心概念—异步组件和路由懒加载

    原文地址:Vue 异步组件&路由懒加载 目录 异步组件 异步组件介绍 异步组件声明 高级异步组件 路由懒加载 路由懒加载介绍 路由懒加载方法 把组件按组分块 异步组件 异步组件介绍 在开发大型 ...

  6. servlet异步_如何使用异步Servlet来提高性能

    servlet异步 这篇文章将描述一种性能优化技术,该技术适用于与现代Web应用程序相关的常见问题. 如今的应用程序不再只是被动地等待浏览器发起请求,而是希望自己开始通信. 一个典型的示例可能涉及聊天 ...

  7. vue——懒加载(异步延迟和彻底懒加载)

    vue项目优化之懒加载 引入问题 一.默认: 异步延迟加载 结果图解 二.彻底懒加载(手动配置) 步骤 1. 实现异步延迟加载的两步 2. 配置脚手架,去掉prefetch 结果图解 引入问题 单页面 ...

  8. ztree点击展开/收缩 按钮分级加载,解决数据量过大加载缓慢

    有些项目的组织机构足足有六七万多条数据,加载十分缓慢,所考虑做成分级加载. 由于本项目的ztree的树节点的点击事件已经被占用(加载组织人员),所以考虑使用ztree的 展开/收缩 (onExpand ...

  9. java 内部类 加载_举例讲解Java的内部类与类的加载器

    内部类 class A { //Inner1 要在 A 初始化后 才能使用,即要被A的对象所调用 class Inner1 { int k = 0; // static int j = 0; //A加 ...

最新文章

  1. UML应用开发详解--视频
  2. 2011 总结 2012 计划
  3. MyEclipse8.5注册码 到2015年
  4. LeetCode----13. 罗马数字转整数
  5. 解决:java.lang.IllegalStateException: ApplicationEventMulticaster not initialized
  6. 谷歌浏览器如何如何禁用弹出窗口阻止程序
  7. HDU3549+Ford-Fulkerson
  8. HP刀片服务器C7000-Cisco网络模块配置指南
  9. 《linux设备驱动开发详解》笔记——14 linux网络设备驱动
  10. Atitit 常用的登录认证法 目录 2. 表单验证 1 3. OAuth 认证 1 4. Web票据模式验证 1 4.1. Token验证 1 4.2. Cookie-Session 认证 1
  11. Atititjs h5调用摄像头视频聊天 拍照功能 相机功能 录像attilax总结
  12. 既是手机直播投屏工具又是安卓模拟器?游戏主播和手游玩家都来了解一下
  13. ngix反向代理配置
  14. 内定抽奖小程序_微信抽奖助手怎么中奖 无需作弊照样中奖
  15. php百度优化,百度技术沙龙第 24 期 PHP 性能优化实践
  16. 游戏音乐制作中需要使用那些软件?
  17. PCIE操作基础原理
  18. C语言PAT刷题 - 1027 打印沙漏
  19. windows突破百度云上传限速
  20. 关于Keil ARM版本和Keil C51版本的共存问题(亲测通过)

热门文章

  1. ARM中CPSR的标志位中的C和V
  2. ARM中断向量表的简单分析
  3. 网易图灵学院python公开课_图灵学院 Python全系列教程全栈工程师 python视频教程下载...
  4. 针对setContentView我犯的错误
  5. Map array 和 array
  6. 仿最新BiliBili客户端开源带后台弹幕库版
  7. idea新增目录文件不能提交
  8. 分享24个网页游戏源代码,总有一个是你想要的
  9. PAOGD个人作业4——利用OpenGL设计贪吃蛇游戏
  10. 计算机组成原理自学初学笔记整理