zoukankan      html  css  js  c++  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的环境搭建大家自己实现以下吧,我这里就不细说了。那个也很简单!整体目录如下所示:

                                         



    欢迎多多评论,多多留言,不足地方还请业内高手指点,鸣谢!!!

  • 相关阅读:
    什么是 bean 的自动装配?
    什么是 Spring 的内部 bean?
    什么是 Spring 的 MVC 框架?
    Spring AOP and AspectJ AOP 有什么区别?
    解释 JDBC 抽象和 DAO 模块?
    volatile 类型变量提供什么保证?
    一个 Spring Bean 定义 包含什么?
    什么是 Spring MVC 框架的控制器?
    使用 Spring 访问 Hibernate 的方法有哪些?
    什么是 Callable 和 Future?
  • 原文地址:https://www.cnblogs.com/a1111/p/7459719.html
Copyright © 2011-2022 走看看