分享

基于Ext异步加载tree的实例 - Seraph115 - JavaEye技术网站

 zybingliu 2008-11-19

使 用JS生成树形结构的菜单是基于J2EE的B/S系统常用的UI方式。但长期以来的问题是同步(即一次加载整棵树)加载一棵完整的树给前台及后台同时带来 压力,由于加载数据及渲染时间过长使用户体验度很低。Ajax的异步数据传输方式是解决此问题的较好方式,即每次只加载一层节点,当需要时才加载下级节 点,这样页面无需一次加载解决了此问题。

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

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

实现预览:

 


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

Java代码 复制代码
  1. /** 
  2.  * Method: 异步加载树型结点<br> 
  3.  * Origin Time: 2008-8-15 下午03:56:28<br> 
  4.  *  
  5.  * @author Seraph<br> 
  6.  * @email: seraph115@gmail.com<br> 
  7.  */  
  8. public class AsyncTreeNode {  
  9.   
  10.     private String id;  
  11.   
  12.     private String text; // 结点显示名称  
  13.   
  14.     private boolean leaf; // 是否为叶子结点  
  15.   
  16.     private boolean disabled; // 是否可用  
  17.   
  18.     private String cls; // 显示的样式,file、folder  
  19.   
  20.     private String iconCls; // 结点图标样式  
  21.   
  22.     private String href; // 点击后时的链接  
  23.   
  24.     private String hrefTarget; // 在何frame中显示  
  25.   
  26.     private boolean draggable; // 是否可拖拽  
  27.   
  28.         // Omit the get and set method  
  29.         ... ...  
  30. }  



数据库中的表结构:

 

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代码 复制代码
  1. /** 
  2.  * Method: 获取异步加载树型子结点<br> 
  3.  * Author: Seraph<br> 
  4.  * Origin Time: 2008-9-9 下午05:46:02<br> 
  5.  *  
  6.  * @param menuId 当前结点的id 
  7.  * @return 下级节点组成的List 
  8.  */  
  9. public List getLowerTreeNodes(String menuId);  

 

数据提供的Spring的Controller:

 

Java代码 复制代码
  1. /** 
  2.  * Method:<br> 
  3.  * Origin Time: 2008-8-15 上午11:07:55<br> 
  4.  * @author Seraph<br> 
  5.  * @email: seraph115@gmail.com<br> 
  6.  */  
  7. public class AsyncTreeProviderController extends JsonProviderController {  
  8.   
  9.     private TreeManager treeManager;  
  10.       
  11.     public void setTreeManager(TreeManager treeManager) {  
  12.         this.treeManager = treeManager;  
  13.     }  
  14.   
  15.     protected ModelAndView handleRequestInternal(HttpServletRequest request,  
  16.             HttpServletResponse response) throws Exception {  
  17.   
  18.         String rootId = request.getParameter("id");  
  19.         List list = treeManager.getLowerTreeNodes(rootId);  
  20.           
  21.         super.pushJsonResponse(response, list);  
  22.   
  23.         return null;  
  24.     }  
  25.   
  26. }  

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

 

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

 

Xml代码 复制代码
  1. <dependency>  
  2.     <groupId>net.sf.json-lib</groupId>  
  3.     <artifactId>json-lib</artifactId>  
  4.     <version>2.2.2</version>  
  5. </dependency>  
 

 

2. JavaScript的Ext TreePanel组件实现:

 

Js代码 复制代码
  1. /** 
  2.  * async-tree.js Power by YUI-EXT and JSON. 
  3.  *  
  4.  * @author Seraph 
  5.  * @email seraph115@gmail.com 
  6.  */  
  7.    
  8. var AsyncTree = {   
  9.     author: "Seraph",  
  10.     version: "0.1.0"  
  11. };  
  12.   
  13. // -> Configuration of tree. e.g: CG[1]  
  14. var CG = {  
  15.     1: "asyncTreeProvider.do",  
  16.     2: "async"  
  17. };  
  18.   
  19. // -> Root-node name in Chinese. e.g: CN[1]  
  20. var CN = {  
  21.     1: "菜单",  
  22.     2: "配置"  
  23. };  
  24.   
  25. // -> Root-node ID of tree. e.g: ID[1]  
  26. var ID = {  
  27.     1: "-1",  
  28.     2: "-2"  
  29. };  
  30.   
  31. Ext.onReady(function(){  
  32.       
  33.         var Tree = Ext.tree;  
  34.       
  35.         var myTreeLoader = new Ext.tree.TreeLoader({  
  36.             url: CG[1]  
  37.         });  
  38.      
  39.         myTreeLoader.on("beforeload"function(treeLoader, node) {  
  40.                 myTreeLoader.baseParams.id = node.attributes.id;  
  41.             }, myTreeLoader);  
  42.      
  43.         var tree = new Tree.TreePanel({  
  44.             el:'tree1',  
  45.             autoScroll:true,  
  46.             autoHeight: true,  
  47.             border: false,  
  48.             animate:true,  
  49.             enableDD:true,  
  50.             rootVisible:false,  
  51.             containerScroll: true,  
  52.             loader: myTreeLoader,  
  53.             root: {  
  54.                 nodeType: CG[2],  
  55.                 text: CN[1],  
  56.                 id: ID[1]  
  57.             }  
  58.         });  
  59.         tree.render();  
  60.         tree.getRootNode().expand();  
  61.           
  62.     });  
 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多