前段时间写了篇关于多级分类树的设计:
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 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 : )
(本文完)