1. 程式人生 > >java實現遍歷樹形選單方法——設計思路【含原始碼】

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的環境搭建大家自己實現以下吧,我這裡就不細說了。那個也很簡單!整體目錄如下所示:

                                     

歡迎多多評論,多多留言,不足地方還請業內高手指點,鳴謝!!!