前段時間寫了篇關于多級分類樹的設計:
http://www.tkk7.com/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 : )
(本文完)