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的環境搭建大家自己實現以下吧,我這里就不細說了。那個也很簡單!整體目錄如下所示:
?????????????????????????????????????
?
?
歡迎多多評論,多多留言,不足地方還請業內高手指點,鳴謝!!!
總結
以上是生活随笔為你收集整理的java实现遍历树形菜单方法——设计思路【含源代码】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样看一台电脑的配置好与坏?
- 下一篇: java实现遍历树形菜单方法——实体类V