
图片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
