efa's blog

以用户角度出发,你就已经成功一半了.

导航

<2005年8月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

统计

常用链接

留言簿(18)

我参与的团队

随笔分类

随笔档案

文章分类

文章档案

Bi report

dba

info security

other

perl

php

python

tech blogs

tech websites

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

[多级分类树设计] 如何将取得controller层返回的list以生成XML格式的数据

         前段时间写了篇关于多级分类树的设计:
         http://www.blogjava.net/davidxu/archive/2005/08/17/multilevelTree.html
        有网友问到如果将取得的list数据生成为XML格式的数据
以方便js 解释。在这里另起一笔。简单介绍,供大家参考一下 :)

笔者简单做一个demo

1、最快搭起示范例子
<%!
    
//取得 tree List
     private List getTree()
     
{
        List treeList 
= new ArrayList();
        
//
        return treeList;
     }

%>
<%
    List treeList 
= getTree();
    request.setAttribute(
"treeList",treeList);
%>
<?xml version="1.0" encoding="GBK"?>
<tree>
   
<c:forEach var="tree" items="${treeList}">
        
<tree text="<c:out value='${tree.name}'/>" />
   
</c:forEach>
</tree>

执行以上代码可以发现生成的文件内容将会为以下所示
 <?xml version="1.0" encoding="GBK" ?>
- <tree>
        <tree text="中国" />
    <tree text="华南地区" />
       <tree text="广东" />
       <tree text="广西" />
        <tree text="华北地区" />
</tree>

2、例子存在问题
       很容易发现,以上的办法并不是我们所期待的,根本没有等级划分:(
       再来看我们其实想实现的效果应该如下, [笔者加了注释以方便说明问题]
<?xml version="1.0" encoding="GBK"?>
<tree>                                                     // 等级
        
<tree text="中国">                          //1      不关闭
            <tree text="华南地区">              //2      不关闭
               <tree text="广东"></tree>        //3      关闭
                  <tree text="广西"></tree>        //3  关闭
    </tree>
                                       //         再一次关闭
           <tree text="华北地区" />             //2      关闭
        </tree>                                             //        再一次关闭
           <tree text="笔者虚拟的,并不存在" / > //1
</tree>

3、找寻规律
   
    节点何时关闭?????这是关键的………………
     
    如果你认真地观察(可能更多的数据会更清楚),很快就可以看到规律了.
    如上面注释所示:
 "中国"  ->  "华南地区" 1-> 2    (2>1,不关闭)
    "华南地区"  -> "广东 "    2->3    (3>2 ,不关闭)     
    "广东"  -> "广西 "            3->3    (3=3  ,关闭1 次)     
    "广西"  -> "华北地区 "    3->2    (3<2  ,关闭 2 次)     

最后:华北地区后就没有了,
           我们可以模拟一个最高级别的区域,可以想象"华北地区"下一个就是最高级别的区域
   '华北地区' - >' 笔者虚拟的,并不存在'   2->1  (2<1 关闭2 次)

 当下一个区域的级别(LEVEL)高于或等于当前区域(数值上相反,小于上一个区域) 的时候,当前区域就应该关闭N次,公式表示为 N  *  </tree> ,至于N等于多少,即取决于下一个区域的级别与当前区域的级别的差距.
     
  3-3 = 0 关闭一次
  3-2 =1 关闭二次
 …………
 …………
如果你愿意,可以增加更多等级的区域,以确认有这样的一种规律:
N = (上一个级别 - 下一个级别) + 1   
前提是下一个级别 <= 上一个级别

源代码
 <%!
       
private void closeNodes(JspWriter out,int nowLevel,int oldLevel) throws Exception
    
{
       
int num = (oldLevel - nowLevel) + 1;
       
for (int j = 0; j < num; j++)
       
{
           
out.println("</tree>");
       }

    }

%>
<%
    List treeList 
= getTree();
    request.setAttribute(
"treeList", treeList);
%>
<?xml version="1.0" encoding="GBK"?>
<tree>
   
<c:forEach var="tree" items="${treeList}">
       
<c:set var="nowLevel" value="${tree.LEVEL}"/>
     
<%
       
//取当前级别
       int nowLevel = Integer.parseInt(pageContext.getAttribute("nowLevel").toString());
       
int oldLevel = 0;
       
if (pageContext.getAttribute("oldLevel"!= null)
       
{
           
//取上一级别
           oldLevel = Integer.parseInt(pageContext.getAttribute("oldLevel").toString());
       }

   
%>
       
<%
           
if (oldLevel != 0)
           
{
               
if (nowLevel <= oldLevel)
               
{
                   closeNodes(
out,nowLevel,oldLevel);
               }

           }

       
%>
       
<tree text="<c:out value="${tree.name}"/>">
       
<c:set var="oldLevel" value="${tree.LEVEL}"/>
   
</c:forEach>
   
<%
       
int lastLevel = Integer.parseInt(pageContext.getAttribute("oldLevel").toString());
         // 最后一级别为最高 1
       closeNodes(
out,1,lastLevel);
   
%>
</tree>

写得比较快,欢迎查bug : )
 (本文完)

posted on 2005-08-18 13:37 一凡@ITO 阅读(2535) 评论(3)  编辑  收藏

评论

# re: [多级分类树设计] 如何将取得controller层返回的list以生成XML格式的数据 2005-08-19 10:16 hope

老大看了你的文章让我大概明白怎么回事了 我的xml的树节点判断跟你这个不大一样
老大要是需要我可以给老大一份呵呵 ,上边有几个例子是asp的 我主要不知道java怎么写成xml文件用jdom么 还是有什么更简单的办法 老大帮帮我呵呵 我的邮箱zxggwan@163.com  回复  更多评论   

# re: [多级分类树设计] 如何将取得controller层返回的list以生成XML格式的数据 2005-08-19 11:39 hope

老大你能留个msn或者邮箱么 我给你一些程序帮我看看 我找到一些比较好的标签的类是朋友公司的 可是我初学没多久 所以看不懂 清老大帮我看看呵呵  回复  更多评论   

# re: [多级分类树设计] 如何将取得controller层返回的list以生成XML格式的数据 2005-08-22 09:11 goodbaby

没看明白,遍历的时候是怎么遍历,好象是用xsl,没看出递归的代码。不明白,学习中。。。  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: