使

用JS生成树形结构的菜单是基于J2EE的B/S系统常用的UI方式。但长期以来的问题是同步(即一次加载整棵树)加载一棵完整的树给前台及后台同时带来

压力,由于加载数据及渲染时间过长使用户体验度很低。Ajax的异步数据传输方式是解决此问题的较好方式,即每次只加载一层节点,当需要时才加载下级节

点,这样页面无需一次加载解决了此问题。

Ext的TreePanel组件提供了此功能即异步树(asynchronism tree),使用其实现需以下两步:

后台数据加载的实现,并以JSON形式提供给前台。

前台Ext的Tree组件实现。

实现预览:

1. 首先是JavaBean的节点模型(Tree Node Model):

Java代码

/**

* Method: 异步加载树型结点

* Origin Time: 2008-8-15 下午03:56:28

*

* @author Seraph

* @email: seraph115@gmail.com

*/

publicclassAsyncTreeNode {

privateString id;

privateString text;// 结点显示名称

privatebooleanleaf;// 是否为叶子结点

privatebooleandisabled;// 是否可用

privateString cls;// 显示的样式,file、folder

privateString iconCls;// 结点图标样式

privateString href;// 点击后时的链接

privateString hrefTarget;// 在何frame中显示

privatebooleandraggable;// 是否可拖拽

// Omit the get and set method

... ...

}

/**

* Method: 异步加载树型结点

* Origin Time: 2008-8-15 下午03:56:28

*

* @author Seraph

* @email: seraph115@gmail.com

*/

public class AsyncTreeNode {

private String id;

private String text; // 结点显示名称

private boolean leaf; // 是否为叶子结点

private boolean disabled; // 是否可用

private String cls; // 显示的样式,file、folder

private String iconCls; // 结点图标样式

private String href; // 点击后时的链接

private String hrefTarget; // 在何frame中显示

private boolean draggable; // 是否可拖拽

// Omit the get and set method

... ...

}

数据库中的表结构:

COLUMN_NAME

DATA_TYPE

ID

NUMBER

PARENT

NUMBER

TEXT

VARCHAR2

LEAF

VARCHAR2

DISABLED

VARCHAR2

CLS

VARCHAR2

ICON_CLS

VARCHAR2

HREF

VARCHAR2

HREF_TARGET

VARCHAR2

取下级节点的接口定义:

Java代码

/**

* Method: 获取异步加载树型子结点

* Author: Seraph

* Origin Time: 2008-9-9 下午05:46:02

*

* @param menuId 当前结点的id

* @return 下级节点组成的List

*/

publicList getLowerTreeNodes(String menuId);

/**

* Method: 获取异步加载树型子结点

* Author: Seraph

* Origin Time: 2008-9-9 下午05:46:02

*

* @param menuId 当前结点的id

* @return 下级节点组成的List

*/

public List getLowerTreeNodes(String menuId);

数据提供的Spring的Controller:

Java代码

/**

* Method:

* Origin Time: 2008-8-15 上午11:07:55

* @author Seraph

* @email: seraph115@gmail.com

*/

publicclassAsyncTreeProviderControllerextendsJsonProviderController {

privateTreeManager treeManager;

publicvoidsetTreeManager(TreeManager treeManager) {

this.treeManager = treeManager;

}

protectedModelAndView handleRequestInternal(HttpServletRequest request,

HttpServletResponse response) throwsException {

String rootId = request.getParameter("id");

List list = treeManager.getLowerTreeNodes(rootId);

super.pushJsonResponse(response, list);

returnnull;

}

}

/**

* Method:

* Origin Time: 2008-8-15 上午11:07:55

* @author Seraph

* @email: seraph115@gmail.com

*/

public class AsyncTreeProviderController extends JsonProviderController {

private TreeManager treeManager;

public void setTreeManager(TreeManager treeManager) {

this.treeManager = treeManager;

}

protected ModelAndView handleRequestInternal(HttpServletRequest request,

HttpServletResponse response) throws Exception {

String rootId = request.getParameter("id");

List list = treeManager.getLowerTreeNodes(rootId);

super.pushJsonResponse(response, list);

return null;

}

}

此步将查询到的下级结点的List转换为JSON数据通过Ajax方式返回给Ext的TreePanel组件用以渲染下级结点。

PS: 推荐使用json-lib来转换javabean为json数据。下面是json-lib的maven的dependency。

Xml代码

net.sf.json-lib

json-lib

2.2.2

net.sf.json-lib

json-lib

2.2.2

2. JavaScript的Ext TreePanel组件实现:

Js代码

/**

* async-tree.js Power by YUI-EXT and JSON.

*

* @author Seraph

* @email seraph115@gmail.com

*/

varAsyncTree = {

author: "Seraph",

version: "0.1.0"

};

// -> Configuration of tree. e.g: CG[1]

varCG = {

1: "asyncTreeProvider.do",

2: "async"

};

// -> Root-node name in Chinese. e.g: CN[1]

varCN = {

1: "菜单",

2: "配置"

};

// -> Root-node ID of tree. e.g: ID[1]

varID = {

1: "-1",

2: "-2"

};

Ext.onReady(function(){

varTree = Ext.tree;

varmyTreeLoader =newExt.tree.TreeLoader({

url: CG[1]

});

myTreeLoader.on("beforeload",function(treeLoader, node) {

myTreeLoader.baseParams.id = node.attributes.id;

}, myTreeLoader);

vartree =newTree.TreePanel({

el:'tree1',

autoScroll:true,

autoHeight: true,

border: false,

animate:true,

enableDD:true,

rootVisible:false,

containerScroll: true,

loader: myTreeLoader,

root: {

nodeType: CG[2],

text: CN[1],

id: ID[1]

}

});

tree.render();

tree.getRootNode().expand();

});

/**

* async-tree.js Power by YUI-EXT and JSON.

*

* @author Seraph

* @email seraph115@gmail.com

*/

var AsyncTree = {

author: "Seraph",

version: "0.1.0"

};

// -> Configuration of tree. e.g: CG[1]

var CG = {

1: "asyncTreeProvider.do",

2: "async"

};

// -> Root-node name in Chinese. e.g: CN[1]

var CN = {

1: "菜单",

2: "配置"

};

// -> Root-node ID of tree. e.g: ID[1]

var ID = {

1: "-1",

2: "-2"

};

Ext.onReady(function(){

var Tree = Ext.tree;

var myTreeLoader = new Ext.tree.TreeLoader({

url: CG[1]

});

myTreeLoader.on("beforeload", function(treeLoader, node) {

myTreeLoader.baseParams.id = node.attributes.id;

}, myTreeLoader);

var tree = new Tree.TreePanel({

el:'tree1',

autoScroll:true,

autoHeight: true,

border: false,

animate:true,

enableDD:true,

rootVisible:false,

containerScroll: true,

loader: myTreeLoader,

root: {

nodeType: CG[2],

text: CN[1],

id: ID[1]

}

});

tree.render();

tree.getRootNode().expand();

});

ext动态树 java_基于Ext异步加载tree的实例 - Seraph115 - JavaEye技术网站相关推荐

  1. python 异步加载图片_Python 爬取拉钩网异步加载页面

    如下是我简单的获取拉钩网异步加载页面信息的过程 获取的是深圳 Python 岗位的所有信息,并保存在Mongo中 (对于异步加载,有的人说是把你要爬页面的信息整个页面先爬下来,保存本地,然后再看有没有 ...

  2. bootstrap 树形表格渲染慢_layUI之树状表格异步加载组件treetableAsync.js(基于treetable.js)...

    概述 后台框架中使用树状表格是非常常用的操作,layUI本身并没有这种组件. 第三方的treetable.js做到了完美的实现,但是不能实现在双击时异步加载数据,本文就是站在了巨人的肩膀上实现的异步加 ...

  3. extjs2.0 ie8 下拉树_extjs2下拉树选项框comboxWithTree(支持异步加载子节点)

    extjs版本:2.2 简介:支持单选.异步加载子节点(当然一下子拼接好全部节点的json也是绝对没问题的),要支持多选则需要自行设置,(已测试通过)浏览器兼容ie8.谷歌.FF. 资料参考:搜索一下 ...

  4. ExtJS 异步加载树节点

    var Tree_Item = Ext.tree; //定义根节点的Loader if (treepanelItem == undefined) { treepanelItem = new Tree_ ...

  5. JQuery Datatables 动态配置参数异步加载数据

    背景需求 在前端动态设置datatables需要传递到后端的查询参数,异步加载返回的数据.点击这里进入datatables中文网异步加载数据说明 直接上代码 var table; var url = ...

  6. Jquery Ztree异步加载树

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

  7. ztree异步加载数据amp;amp;amp;amp;amp;amp;amp;amp;给父节点动态追加子节点

    对于ztree,整了两天了,在数据库中查出json符合格式的数据,这很好整,但是在ztree追加时出现重复节点,找了半天资源,最终还是用ztree自带的异步加载解决问题,特此记录一下下!!如果不足请指 ...

  8. vue-iview异步加载渲染树

    <Tree v-show="curType=='archive'" :data="archiveTree" :load-data="loadDa ...

  9. vue 项目ztree 异步加载树

    1.在data()添加setting设置 setting: {data: {simpleData: {enable: true,idKey: "",pIdKey: "&q ...

  10. 基于jQuery的图片异步加载和预加载实例

    如今的网页中有很多图片,比如相册列表,那么如果一次性读取图片将会瞬间加重服务器的负担,所以我们用jQuery来实现图片的异步加载和预加载功能,这样在页面的可视范围内才会加载图片,当拖动页面至可视界面时 ...

最新文章

  1. 使用openssl给web站点颁发证书
  2. whitepages 被关闭_除了滑动关闭APP影响电池寿命,还有哪些操作触碰到了你的知识盲区?...
  3. numpy.random.randint详解
  4. pythonif有多个条件怎么办_Python中if有多个条件处理方法
  5. 0027-如何在CDH集群启用Kerberos
  6. mysql pgsql 2017,DB-Engines 2017 年度数据库:PostgreSQL 实至名归
  7. 1.2开发文档简读,了解全貌.mp4
  8. 国内成品油价近期历次调整一览
  9. SpringBoot项目整合Retrofit最佳实践,这才是最优雅的HTTP客户端工具!
  10. 案例学习BlazeDS+Spring之三InSync01查找联系人
  11. homework-06
  12. 《英雄联盟》设计师NORMAN的游戏设计之路
  13. html之页面元素印射
  14. 项目总结:初稿与定稿,方向相差180度
  15. java实验目的_java实验报告一
  16. 云购PHP,高仿一元云购CMS-PHP源码
  17. 移动前端开发和 Web 前端开发的区别是什么?
  18. 小米允许安装未知来源不用sim卡_视频能独立通话的小米手表,会像小米手机一样好用吗?...
  19. win10 远程桌面卡顿_主编教你win10系统使用远程桌面卡顿的步骤
  20. 使用vscode,根据vue基础模板文件生成代码

热门文章

  1. CodeForces - 1077(div3) E.Thematic Contests(枚举+二分)
  2. golang模拟抢票
  3. window office
  4. 如何获取微信小店小程序的AppID
  5. 技术问答-1 跨平台
  6. Android 9 系统修改内设WLAN热点名称
  7. 星际争霸2 AI开发(持续更新)
  8. 旋翼无人机及摄影测量基础
  9. 设计模式10——状态模式
  10. 手机apk应用程序未安装解决办法