进销存,进销存软件,进销存管理软件,Web进销存,定制进销存系统,Web系统开发,进销存分销版,进销存企业版 -欢迎咨询viooma.com

当前位置: 主页 > Web技术 > 网络编程语言 >

树形菜单和树形目录实现(带图)

时间:2009-08-24 11:34来源:未知 作者:admin 点击:
现在做系统都喜欢用树形菜单,表示部门结构和层次结构的时候也是比较喜欢用树形菜单来显示. 图片1 今天就主要给大家介绍一下,在BS程序中树形菜单的制作全过程! 首先我们学要两个类
 现在做系统都喜欢用树形菜单,表示部门结构和层次结构的时候也是比较喜欢用树形菜单来显示.


图片1




今天就主要给大家介绍一下,在BS程序中树形菜单的制作全过程!
首先我们学要两个类:
一个是TreeBean
一个是TreeAction
他们分别是存放树的节点对象和树的执行动作.

* TreeInfo.java
*
* Created on 2007年5月8日, 下午1:19
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package com.oat33.uitl;

/**
* 此类主要保存树的所有信息,如 当前结点、父结点、URL、图标等
* nodeId         => 结点ID
* parentId       => 父结点ID
* nodeName       => 结点名称
* url            => 结点链接地址
* @author 李栋
*/
public class TreeBean {
    
      /** Creates a new instance of TreeInfo */
      private int nodeId = -1;                  //结点ID
      private int parentId = -1;                //父结点ID
      private String nodeName = null;           //结点名称
      private String url = null;                //结点链接地址
    
      public TreeBean() {
      }

      public int getNodeId() {
          return nodeId;
      }

      public void setNodeId(int nodeId) {
          this.nodeId = nodeId;
      }
...... 上面就是一些get和set方法咯.
/*------------------------------------------------------------------*/
package com.oat33.uitl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import com.oat33.interfaces.TreeInterface;
import com.oat33.model.group.beans.*;

public class TreeAction {
      private int urlType;
    
      /*
      * 构造函数<br>
       * @param
       *        _rulType 0或1
       * 如果是0则以peoID传递参数
       * 如果是1 则用javascript传递参数 javascript的
       * function sendDataFunction(id,logName,name)
       *
       */
      public TreeAction(int urlType){
          this.urlType = urlType;
      }

      /**
      * 首先是得到顶级节点,然后调用addSubFolders()方法,递归加入子节点到集合中<br/>
      * 并返回所有封装成TreeInfoBean的实例的List集合
      * @param deptID
      * @return 返回集合
      */
      public List retrieveNodeInfos(int deptId,TreeInterface treeIF,String url){
          List _treeList = new ArrayList();
          /* 设置顶级目录的实体 */
          TreeBean _tempTree = new TreeBean();
          _tempTree.setNodeId(0);
          _tempTree.setNodeName("公司");
          _tempTree.setParentId(-1);
          _tempTree.setUrl("");
          //把顶级目录存入集合中
          _treeList.add(_tempTree);
        
          this.addSubFolders(_treeList, deptId, treeIF,url);
        
          return _treeList;
      }
    
      /**
      * 递归循环把所有的子部门全部加入到List集合中,每一个元素都是一个TreeInfoBean<br/>
      * @param _list
      * @param deptId
      * @param treeIF
      */
      public void addSubFolders(List _list,int deptId,TreeInterface treeIF,String url){
          /*用接口的一个引用去指向一个对象*/

          /*参数零表示从根目录开始递归得到所有子部门*/
        List _temp = treeIF.getTreeList(deptId);
          for (Iterator iter = _temp.iterator(); iter.hasNext();) {
           DepartmentBean element = (DepartmentBean) iter.next();
              TreeBean temp = new TreeBean();
              temp.setNodeId(element.getDepartmentNumber());
              temp.setParentId(element.getDepartmentFater());
              temp.setNodeName(element.getDepartmentName());        //当前结点名
            
              //确定传递参数的方式
              if(this.getUrlType()==0)
              {
                  temp.setUrl(url+"?id="+element.getDepartmentNumber());
              }
              else if(this.getUrlType()==1)
              {
                  temp.setUrl("javascript:sendDataFunction("+element.getDepartmentNumber()+",\'"+element.getDepartmentName()+"\')");
              }
            
              _list.add(temp); //每次得到一个 TreeInfo 后,添加到 Arr
          }

      }
    
    
    
      /**
      * 生成组件树的方法,直接通过调用JS来在JSP页面写出JS代码<br/>
      * JS中每d.add()调用一次就会在页面生成一个树节点.<br/>
      * @param alist
      * @return 生成HTML的代码
      */
      private static String createMenu(Collection alist)
      {
          StringBuffer contents = new StringBuffer();
          contents.append("<!--\n");
          contents.append("d = new dTree('d');");           //在JavaScript 里创建一个 dTree 对象
          TreeInfoBean tree = new TreeInfoBean();
          Iterator it = alist.iterator();
          while(it.hasNext())
          {
              tree = (TreeInfoBean)it.next();
              //define elements of array
              contents.append("d.add(");
              contents.append(tree.getNodeId());
              contents.append(",");
              contents.append(tree.getParentId());
              contents.append(",\"");
              contents.append(tree.getNodeName());
              contents.append("\",\"");
              contents.append(tree.getUrl());
              contents.append("\");\n");
          }
          contents.append("document.write(d);");
          contents.append("d.openAll()");
          contents.append("\n//-->");
        
          return contents.toString();
      }
    
      /**
      * 树的调用类,主要用于JSP页面被调用<br/>
      * @param deptID 顶级部门的Id,我们数据库中没有,所以直接定义为0。<br/>
      * @param treeIF 传入实现TreeInterface 接口的引用,接口里面只定义了
      * 一个用于取得树记录的集合方法,public List getTreeList(int arg0);<br/>
      * @return 得到所有HTML代码 并返回到JSP页面中.
      */
      public String showMenu(int deptID,TreeInterface treeIF,String url)
      {
//          System.err.println("--------deptStoageTree ShowMenu ");
          StringBuffer tree = new StringBuffer();
          tree.append("<div class=\"dtree\">");
          tree.append("<script type=\"text/javascript\">\n");
          tree.append(createMenu(retrieveNodeInfos(deptID,treeIF,url)));
          tree.append("</script>\n");
          tree.append("</div>");
        
          return tree.toString();
      }
    
      private int getUrlType()
      {
          return this.urlType;
      }
    
}
/* ---------------------------------------------------------------------- */
这个上面就是TreeAction类的全部代码.

其中红色的部分就是通过接口方法,调用实体类的处理方法,得到一个List集合(我这里是部门)

部门的数据库设计如下:


图片2

其中DepartmentFater是节点的父ID,DeparmentNumber是当前节点的ID.

在DepartmentDAO中,我写入一个递归求出所有部门的算法.

/*
      * 方法:递归所有部门
      * (非 Javadoc)
      * @see com.oat33.interfaces.DepartmentInterfaces#getAllDempart(int)
      * @param int arg0 =0 表示 是中根目录开始求下级目录
      * @return List
      */
    
      public List getAllDempart(int arg0){
        
          //查询DEPARTMENT_INFO_TB表所有信息
          sql="select * from DEPARTMENT_INFO_TB where DepartmentFater="+arg;
        
        
          //实例化数据库对象
          session = new SessionSqlServerImpl();
        
          //把查询返回的结果赋值给rs,此rs不可为全局变量
          ResultSet rs = session.execQuery(sql);
        
        
        
              try {
                  //循环得到arg0参数下面的子部门
                  while(rs.next()){
                    
                    
                      beans = new DepartmentBean();
                      beans.setDepartmentName(rs.getString(1));
                      beans.setDepartmentTel(rs.getString(2));
                      beans.setDepartmentFacsimile(rs.getString(3));
                      beans.setDepartmentFater(Integer.parseInt(rs.getString(4)));
                      beans.setDepartmentNumber(Integer.parseInt(rs.getString(5)));
                      beans.setDepartmentRemark(rs.getString(6));
                    
                      list.add(beans);
                      this.getAllDempart(beans.getDepartmentNumber());
                  }
                
              } catch (SQLException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
        
          /*返回的是部门名称*/
        
          return list;
      }
    
///////////////////////////////////////////////////////////////////////////////////////////////

通过TreeAction类中的addSubFolders()方法把所有的部门转化成TreeBean节点
放入一个结合内,在通过createMenu()方法生固定格式的js脚本语句.然后通过
showMenu()在jsp页面上输出~

但是,这所有的一切还是为一个叫dTree.js服务,因为只用通过这个js才能在页面上
显示所有的代码效果.当然还要配上dTree.css的样式表

脚本和样式表就不发布出来,因为代码太长的缘故!

展示一下最终的效果~~


图片3
顶一下
(2)
100%
踩一下
(0)
0%
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:

建站技术最新文章

进销存最新客户

湖南兴鑫教育发展有限公司

湖南联大教育培训学校

山东恩凯科技发展有限公司

北京东方迪码科技有限公司

郑州威科姆科技股份有限公司

北京华旗资讯科技发展有限公司

苏州大方特种车辆有限公司

如东飞腾科技

福建松溪晖帆科技发展有限公司

韩服在线

化妆精品一店

辽宁百利达医疗

西点商务合作

香港大兴门业公司

台湾红青蜓皮鞋

台湾华达电脑科技公司

湖南娄底双鹤药业有限公司