jQuery MiniUI

 找回密码
 立即注册
查看: 11546|回复: 7
打印 上一主题 下一主题

【分享JAVA】树结构 懒加载模式下 展开第二节点 [复制链接]

Rank: 2

跳转到指定楼层
楼主
发表于 2012-6-12 18:45:41 |只看该作者 |倒序浏览

【Java】

树结构 懒加载模式

【JSON数据格式】

大家都清楚,每次只加载一级节点,很明显因为一次性查询树的所有数据,如果树结构数据很多的话,树控件加载速度肯定会很慢。

如:

----Hosp

     ---Item1

        ----Jseon

        ----Tom

     ---Item2

JQuery MiniUI

懒加载模式

其实加载的方式无论是什么,都是JSON数据结构的问题。

我们看下懒加载初次加载生成的JSON数据【注: 也是每次展开树结构时的数据[{}, {},]】:

[{

      "id": "-1",

       "text":"System",

       "sort":0,

       "pid":"0",

       "lazy":"-1",

       "isLeaf":false,    //是否是叶子节点 false 就是下面还有子节点 则显示 小文件夹图片

       "expanded":false, //是否展开

       "url":null

从这里看,我们也许会想初次加载不就是要展开,expanded: true 就好了吗?

实际上你设置属性展开,需要显示下级节点数据,可是你没有数据,那么即使你设置了属性,也是没有用的。

下来我们看下首次加载后出现二级节点的JSON数据

图:

数据

[{

       "id":"-1",

       "text":"System",

       "sort":0,

       "isLeaf":false,

       "children":[{       //注意这里: children 子节点数据属性

              "id":"base",

              "text":"Base",

              "sort":1,

              "isLeaf":false,

              "pid":"-1",

              "lazy":"-1",

              "expanded":false,

              "url":null

       },

       {

              "id":"model",

              "text":"Model",

              "sort":6,

              "isLeaf":false,

              "pid":"-1",

              "lazy":"-1",

              "expanded":false,

              "url":""

       }],

       "pid":"0",

       "lazy":"-1",

       "expanded":true,

       "url":null

从这里我们就可以看到初次懒加载的时候数据在拼接的时候,加上chidren属性和其数据就可以了。

下来我们看下后台是如何拼接的:

【后台JSON数据拼接】

数据表结构

Id varchar

Pid varchar

Name varchar

节点 ID 父节点 PID

  1. public void LoadNodes(HttpServletRequest request, HttpServletResponse response) throws Exception
  2. {  
  3.     //获取提交的数据
  4.     String id = request.getParameter("id"); //每次展开树结构节点ID
  5.     System.out.print(id);
  6.     if(StringUtil.isNullOrEmpty(id)) id = "0"; //首次加载时request里试没有的,那么我们设置它初次加载的节点ID
  7.     Map paramMap = new HashMap();
  8.     paramMap.put("PID", id); //当前树节点的ID为父节点ID
  9.     String treeJsonData = BaseMenu.getTreeJson(paramMap); //返回的JSON数据
  10.     response.getWriter().write(treeJsonData);
  11. }
复制代码

JAVA代码】

  1. public static String getTreeJson(Map paramMap) {
  2.        String json = "";
  3.        try {
  4.          
  5.            //paramMap 参数 PID
  6.          
  7.            /*
  8.             * PluSoft.Utils.JSON.Encode(list)
  9.             * 大家看这个方法传入的参数是 List
  10.             * 返回的是String JSON数据格式
  11.             * [{
  12.             * id,
  13.             * pid,
  14.             * name
  15.             * },{
  16.             * ...
  17.             * }]
  18.             * 其实就是
  19.             * [map1{}, map2{}]
  20.             * List内放入的Map 就一个节点
  21.             * */
  22.          
  23.            IBoBaseModel boBaseModel = (IBoBaseModel) BeansHelp
  24.                   .getBeanInstance("boBaseModel");
  25.            //第一次查询我们可以获得一组数据
  26.            //list [ Map1{id, pid, name}]
  27.            //我们看到了吧
  28.            List list = boBaseModel.getListBaseModel(paramMap);

  29.             //首次加载处理方式
  30.             for (int i = 0, l = list.size(); i < l; i++) {
  31.               HashMap node = (HashMap) list.get(i);
  32.               String nodeId = node.get("id").toString();
  33.               HashMap pMap = new HashMap();
  34.               pMap.put("PID", nodeId); //以当前节点作为此次查询的父节点
  35.               List nodes = boBaseModel.getListBaseModel(pMap);
  36.             
  37.               //判断这个节点下是否还有子节点
  38.               if (nodes.size() > 0) {
  39.                   node.put("isLeaf", false); // 则不是叶子节点
  40.                   node.put("expanded", false); //不展开
  41.               }
  42.                
  43.               //在此处查询出第一个父节点下的数据
  44.               //下面就一样了
  45.               if(node.get("pid").equals("0")) {
  46.                     HashMap childMap = new HashMap();
  47.                     childMap.put("PID", "-1");
  48.                     List childNodes = boBaseModel.getListBaseModel(childMap);
  49.                     for(int j=0; j<childNodes.size(); j++) {
  50.                         HashMap childNode = (HashMap) childNodes.get(j);
  51.                         String cChildID = childNode.get("id").toString();
  52.                         HashMap cCMap = new HashMap();
  53.                         cCMap.put("PID", cChildID);
  54.                         List cChilds = boBaseModel.getListBaseModel(cCMap);
  55.                         if(cChilds.size() > 0) {
  56.                             childNode.put("isLeaf", false);
  57.                           childNode.put("expanded", false);
  58.                         }
  59.                     }
  60.                     node.put("children", childNodes); //children 就是第一个父节点下的子节点数据
  61.                     node.put("expanded", true);
  62.                 }
  63.            }



  64.             //此时的List是什么呢可以看下
  65.             [{
  66.               Map1{
  67.                  id,
  68.                  pid,
  69.                  text,
  70.                  //注意children 里放入的是List
  71.                  children: [{
  72.                     
  73.                  },{
  74.                     
  75.                  }]
  76.               }
  77.             }
  78.              ]
  79.            json = PluSoft.Utils.JSON.Encode(list);
  80.             System.out.println(json);
  81.        } catch (NoSuchBeanException e) {
  82.            throw new ServiceLocatorException(e.getMessage(), e);
  83.        } catch (DaoException e) {
  84.            throw new ServiceLocatorException(e.getMessage(), e);
  85.        }
  86.        return json;
  87.     }
复制代码

附件: 你需要登录才可以下载或查看附件。没有帐号?立即注册

Rank: 9Rank: 9Rank: 9

沙发
发表于 2012-6-13 08:53:41 |只看该作者
很不错的分享。
其实后台只需要返回一个树形节点片段就可以了。

处理JSON的时候,先在后台生成java对象,然后用JSON序列化类一下子转换为JSON字符串。

Rank: 2

板凳
发表于 2012-6-13 09:21:31 |只看该作者
niko 发表于 2012-6-13 08:53
很不错的分享。
其实后台只需要返回一个树形节点片段就可以了。

嗯 这个我也想过 如果单纯的树形节点判断 完全可以List Map自己拼接
但是这后期如果多个节点的话,拼接需要改变,这样写的好处我觉得,后期树是动态的,那么就可以省略再次修改代码了。

哎 问几个问题
附件: 你需要登录才可以下载或查看附件。没有帐号?立即注册

Rank: 8Rank: 8

地板
发表于 2012-6-13 10:53:16 |只看该作者
yeqing4562011 发表于 2012-6-13 09:21
嗯 这个我也想过 如果单纯的树形节点判断 完全可以List Map自己拼接
但是这后期如果多个节点的话,拼接 ...

1.你在代码上把west这个区域删除掉就可以了.
2.初次加载的时候,让这个节点默认选中,selectNode(node)

Rank: 2

5#
发表于 2012-6-13 11:41:37 |只看该作者
factory 发表于 2012-6-13 10:53
1.你在代码上把west这个区域删除掉就可以了.
2.初次加载的时候,让这个节点默认选中,selectNode(node) ...

有些小问题 我试下 System不行 别的都行 难道是Node传错了?

Rank: 2

6#
发表于 2012-6-13 11:48:11 |只看该作者
yeqing4562011 发表于 2012-6-13 11:41
有些小问题 我试下 System不行 别的都行 难道是Node传错了?
  1. window.onload = function(){
  2.     var tree1 = firstTree.sender;
  3.     firstTree.node.id = -1;
  4.     tree1.selectNode(firstTree.node);
  5.     alert("123");
  6. //执行通过了。 就这个System节点不会高亮 其他的都行
  7. }

  8. var firstTree = null;

  9. function onBeforeTreeLoad(e) {
  10.         var tree = e.sender; // 树控件
  11.         var node = e.node; // 当前节点
  12.         var params = e.params; // 参数对象
  13.         // 可以传递自定义的属性
  14.         // params.myField = "123"; //后台:request对象获取"myField"
  15.     firstTree = e;
  16. }
复制代码

Rank: 2

7#
发表于 2012-6-13 11:50:52 |只看该作者
yeqing4562011 发表于 2012-6-13 11:48

初次加载的JSON数据

[{
        "id": "-1",
        "text": "System",
        "sort": 0,
        "isLeaf": false,
        "children": [{
                "id": "base",
                "text": "Base",
                "sort": 1,
                "isLeaf": false,
                "pid": "-1",
                "lazy": "-1",
                "expanded": false,
                "url": null
        },
        {
                "id": "model",
                "text": "Model",
                "sort": 6,
                "isLeaf": false,
                "pid": "-1",
                "lazy": "-1",
                "expanded": false,
                "url": ""
        }],
        "pid": "0",
        "lazy": "-1",
        "expanded": true,
        "url": null
}]

Rank: 2

8#
发表于 2012-6-13 11:55:29 |只看该作者
yeqing4562011 发表于 2012-6-13 11:50
初次加载的JSON数据

[{

结贴!
完成了,原来是Node传的不对!
第一次加载时 我得到的Node不是System
我用getNode(value)这样获取了 System的Node

Archiver|普加软件

GMT+8, 2024-11-26 00:43 , Processed in 1.086710 second(s), 10 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部