java實現遍歷樹形選單方法——設計思路【含原始碼】
開發工具:MyEclipse 10
後臺框架:Hibernate + Struts2
資料庫:Oracle 11g
前臺框架:EasyUi
瀏覽器:谷歌
在開發中我們經常會遇到左邊是樹形選單,右邊是一個顯示列表,單擊左邊的樹形選單項時,右邊會顯示該選單裡面相對應的內容。那麼左邊的樹形選單怎麼從資料庫裡面獲取資料在遍歷實現呢?我們不妨來看看設計思路。
一個良好的思路是離不開一個設計完美的資料表,那麼我們來想想這個資料表怎麼設計呢?
先來明確一下思路,我們要用到什麼內容:
1.當前選單的編號,我們設為id(不管是在哪個節點上),贊同的朋友們繼續往下看!
2.既然編號都有了,我們要顯示出來不能光有個編號吧,只顯示出來1 2 3 .......之類的肯定不靠譜,我們得顯示文字,也就是各個編號所對應的文字。我們設為text
3.當前的的選單在哪一節點呢?我們如何來區分呢?大家肯定會想到直接用主外來鍵關聯起來,OK,這就好說了,我們在設定個pid,作為每個節點的父id,父id的含義大家肯定都懂,就是當前的節點的父目錄是哪個?用這個pid來區分。
4.nice,現在有了上面的欄位是不是就夠了呢?還不夠,咱們得再加一個欄位,那就是等級levels,這個等級是來區分當前節點是屬於二級呢?還是二級的兒子,或者二級的孫子,再或者三級的孫子等等。
我們現在隨便舉個例子,大家請看:
1.功能選單:
1-1.系統管理
1-2.使用者管理
1-2-1.個人資訊
1-2-2.投票記錄
1-3.投票管理
1-3-1.維護
1-3-2.釋出新投票
1-3-3.所有投票
簡要說明一下這個案例:
可以看到,一級選單是功能選單,他有三個兒子,分別是系統管理,使用者管理,投票管理。既然有兒子,那麼有孫子是遲早的事,可以看到功能選單一共有5個孫子。其中老大(系統管理)沒兒子,老二(使用者管理)有兩個兒子,個人資訊和投票記錄!老三(投票管理)有3個兒子,維護、釋出新投票和所有投票。
我們接著來分析一下資料表:
id text pid levels
1 功能選單 0 0
2 系統管理 1 1
3 使用者管理 1 1
4 個人資訊 3 2
5 投票記錄 3 2
6 投票管理 1 1
7 維護 6 2
8 釋出新投票 6 2
9 所有投票 6 2
對照上面的分析,相信大家都看理解了這個案例了吧!
這裡我們只寫分析思路,不寫程式碼,原始碼我會附在文章的最後供大家分享的!!!
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
接著我們分析怎麼在java中實現。
我們這裡用到一個前端外掛easyui,easyui的 tree,有不懂的可以去百度問問。一搜一大堆,這裡就不過多的闡述了。
那麼怎麼實現呢?
【注意:下面所用到的查詢語句均為hql語句,VoteTree是實體類名】
1:我們先查詢出最小的levels,也就是根目錄,對應案例中的長輩:功能選單:
Integer minLevel = select min(levels) from VoteTree;
2:根據最小level查詢所有一級目錄 對應案例中長輩的兒子3個: 1-1.系統管理 1-2.使用者管理 1-3.投票管理
List<VoteTree> ts = from TreeVote where leves=minLevel;
3:遍歷一級目錄集合 ts
foreach(VoteTree tr : ts){
根據1級目錄ID查詢所有子集 getNextLevels(tr.getId)
List<VoteTree> tNextLevel=getNextLevels(tr.getId);
tr.setTrees(tNextLevel)
}
4: list<VoteTree> getNextLevels(tr.getId)方法實現
select count(id) from table where pid=tr.getId 儲存為總數totoal
5:判斷totoal
list<TreeVote> nextLevel = from table where pid= tr.getId
list<TreeVote> getNextLevels(tr.getId){
list<TreeVote> tvs = getDeeptLevel(tr.getId);
}
下面我們就用到一個遞迴 ,遍歷所有的子節點,也就是找孫子; 1-2-1.個人資訊 1-2-2.投票記錄 1-3-1.維護 1-3-2.釋出新投票 1-3-3.所有投票
list<TreeVote> getDeeptLevel(TreeVote tvote){
list<TreeVote> list= from VoteTree where pid= tvote.getId
if(list.size>0){
tvote.add(list);
for(int i=0;i<list.size();i++){
getDeeptLevel(list[i]);
}
}
分析了這麼大半天,估計就有人看蒙圈了,那麼我來吧程式碼實現放上來,簡單暴力,直接看!!!
1.建立資料庫,以及新增資料庫:
2.實體類VoteTree:
3.實體類對應的對映檔案 VoteTree.hbm.xml:
4.Dao層的介面和實現類 IVoteTreeDao IVoteTreeDaoImpl :
5service層介面和實現類IVoteTreeService VoteTreeServiceImpl:
6.HibernateUtil實現類:
7.TreeAction實現:
8.OpenSessionView 的實現:
9.struts.xml實現
10.index.jsp的實現
easyui的環境搭建大家自己實現以下吧,我這裡就不細說了。那個也很簡單!整體目錄如下所示:
歡迎多多評論,多多留言,不足地方還請業內高手指點,鳴謝!!!