知识大全 不用迭代算法而快速实现的jsp树结构
Posted 单位
篇首语:知识的价值不在于占有,而在于使用。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 不用迭代算法而快速实现的jsp树结构相关的知识,希望对你有一定的参考价值。
在web页面上实现树状结构 有点麻烦
在最近的一个MIS系统的开发中 我们项目组大量用到了树结构:比如人员的选择 单位的选择等待
这个MIS系统所用的数据库是oracle i oracle i 的sql支持迭代查询 我们的树是由牛人彭越写的 不过
也参照了网络上比较著名的xtree(可以到此下载 他的树算法支持无限级的树结构 不过性能好像
很慢 我持保留态度
他用到的关键技术就是这句话:
String sql = "select dwxh dwbh dwmc dwfxh level cc from xt_dw connect by prior dwxh = dwfxh start with dwfxh = ";
可是许多数据库不支持迭代查询 并且迭代查询速度真是不能忍受 有什么更好的办法呢 下面说说我的解决方案
一:需求的提出
:客户需要一个关于部门人员的树结构 数据库为mysql
:java实现
二:建表:
:
用户信息表:
各字段为:用户序号 用户编号 用户名称 单位序号 密码 用户登陆号
create table XT_YH
(
YHXH INT( ) NOT NULL auto_increment PRIMARY KEY
YHBH VARCHAR( )
YHMC VARCHAR( )
DWXH INT( )
PWD VARCHAR( )
YHDLH VARCHAR( )
)
插入三条测试数据:
insert into xt_yh(yhbh yhmc dwxh pwd yhdlh) values( licl 李春雷 password licl )
insert into xt_yh(yhbh yhmc dwxh pwd yhdlh) values( fengx 冯欣 password fengx )
insert into xt_yh(yhbh yhmc dwxh pwd yhdlh) values( wangqx 王庆香 password wangqx )
:
单位部门表
各字段为:单位序号 单位编号 单位名称 单位父序号
create table XT_DW
(
DWXH int( ) NOT NULL auto_increment PRIMARY KEY
DWBH VARCHAR( )
DWMC VARCHAR( )
DWFXH int( )
)
插入 条测试数据
insert into xt_dw(dwbh dwmc dwfxh) values( 武汉科技局 );
insert into xt_dw(dwbh dwmc dwfxh) values( 人事处 );
insert into xt_dw(dwbh dwmc dwfxh) values( 后勤处 );
insert into xt_dw(dwbh dwmc dwfxh) values( 人事处son );
insert into xt_dw(dwbh dwmc dwfxh) values( 人事处son );
insert into xt_dw(dwbh dwmc dwfxh) values( 后勤处son );
注意:
为了实现快速的树结构实现 我需要充分利用单位编号DWBH DWBH才有 位编码 其中 第一第二位表示一级单位 第三第四位表示二级单位
第五六位表示三级单位 那么 位编码就可以实现五级单位的树结构
比如:测试数据的树结构如下:
武汉科技局:
人事处
人事处son
人事处son
后勤处
后勤处son
其实XT_DW表中的父序号是多余的 不过如果你要用迭代算法来实现 就是必须的
才有 位编码 我只需要一句简单快速的sql语句就可以实现树结构:
String sql = "select dwxh dwbh dwmc dwfxh from xt_dw order by dwbh"
这句sql在几乎所有的数据库平台都能执行 速度也快
下面贴出采用xtree 用 位编码而不是迭代算法实现的树:
/*******Constants java**********/
package lcl mon;
public class Constants
public static final String DBDRIVER = " mysql jdbc Driver"; //MYSQL驱动
public static final String DBUrl="jdbc:mysql://localhost/beauoa"; //数据库url
public static final String USERNAME="root"; //数据库用户名
public static final String PASSWORD="root"; //数据库密码
/**********DbAccess java****************/
package lcl mon;
import java sql *;
import java lang *;
/**
* @author 李春雷
*
* TODO 要更改此生成的类型注释的模板 请转至
* 数据库访问类
*/
public class DbAccess
String strDBDriver = Constants DBDRIVER;
String strDBUrl = Constants DBUrl;
String username = Constants USERNAME;
String password = Constants PASSWORD;
private Connection conn = null;
private Statement stmt = null;
ResultSet rs=null;
//注册数据库驱动程序
public DbAccess()
try
Class forName(strDBDriver);
//异常处理
catch( java lang ClassNotFoundException e)
System err println("DbAccess():"+e getMessage());
//建立数据库连接及定义数据查询
public ResultSet executeQuery(String sql)
rs=null;
try
conn=DriverManager getConnection(strDBUrl username password);
stmt=conn createStatement();
rs=stmt executeQuery(sql);
catch(SQLException ex)
System err println("ap executeQuery:"+ex getMessage());
return rs;
//定义数据操库作
public void executeUpdate(String sql)
stmt=null;
rs=null;
try
conn=DriverManager getConnection(strDBUrl username password);
stmt=conn createStatement();
stmt executeQuery(sql);
stmt close();
conn close();
catch(SQLException ex)
System err println("ap executeQuery:"+ex getMessage());
//关闭数据库
public void closeStmt()
try
stmt close();
catch(SQLException e)
e printStackTrace();
public void closeConn()
try
conn close();
catch(SQLException e)
e printStackTrace();
public static void main(String[] args)
System out println("hello it s test");
DbAccess dbaccess = new DbAccess();
String sql = "select * from xt_yh";
ResultSet rs = dbaccess executeQuery(sql);
try
while(rs next())
System out print(rs getString( )+rs getString( )+rs getString( )+rs getString( )+rs getString( )+rs getString( ));
System out println();
dbaccess closeStmt();
dbaccess closeConn();
catch (SQLException e)
// TODO 自动生成 catch 块
e printStackTrace();
/*********DepEmplConfig jsp************/
<%@ page contentType="text/; charset=gb " language="java" import="java sql * lcl mon *" errorPage="" %>
<!DOCTYPE HTML PUBLIC " //W C//DTD HTML Transitional//EN" "
<>
<head>
<meta equiv="Content Type" content="text/; charset=gb ">
<title>无标题文档</title>
<HEAD>
<script type=text/javascript src= /resources/xDataTree js></script>
<link type=text/css rel="stylesheet" href=" /resources/xtree css" />
<style type=text/css>
body
background: white;
color: black;
</style>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<script type=text/javascript>
webFXTreeConfig rootIcon = " /resources/images/xp/folder png";
webFXTreeConfig openRootIcon = " /resources/images/xp/openfolder png";
webFXTreeConfig folderIcon = " /resources/images/xp/folder png";
webFXTreeConfig openFolderIcon = " /resources/images/xp/openfolder png";
webFXTreeConfig fileIcon = " /resources/images/xp/file png";
webFXTreeConfig lMinusIcon = " /resources/images/xp/Lminus png";
webFXTreeConfig lPlusIcon = " /resources/images/xp/Lplus png";
webFXTreeConfig tMinusIcon = " /resources/images/xp/Tminus png";
webFXTreeConfig tPlusIcon = " /resources/images/xp/Tplus png";
webFXTreeConfig iIcon = " /resources/images/xp/I png";
webFXTreeConfig lIcon = " /resources/images/xp/L png";
webFXTreeConfig tIcon = " /resources/images/xp/T png";
webFXTreeConfig blankIcon = " /resources/images/blank png";
var tree = new WebFXTree("单位人员基本情况" "R ");
var child;
var nodeToAddPerson;
function addDeptTreeNode(preNodeLevel curNodeLevel dispLabel sKey sTag)
if(curNodeLevel== )
child = tree add(new WebFXTreeItem(dispLabel sKey sTag));
else
if(curNodeLevel==preNodeLevel)
if(child parentNode)
child = child parentNode add(new WebFXTreeItem(dispLabel sKey sTag));
if(curNodeLevel>preNodeLevel)
child = child add(new WebFXTreeItem(dispLabel sKey sTag));
if(curNodeLevel<preNodeLevel)
for(i= ;i<preNodeLevel curNodeLevel+ ;i++)
child = child parentNode;
child = child add(new WebFXTreeItem(dispLabel sKey sTag));
return child;
function treeClick()
if(tree getSelected())
if(tree getSelected() childNodes length== &&tree getSelected() key!="R ")
cmdDelete disabled = false;
else
cmdDelete disabled = true;
if(tree getSelected() key substr( )=="RZ")
cmdAddDept disabled = true;
cmdAddPeople disabled = true;
var strYhxh;
strYhxh = tree getSelected() key substr( );
//window open(" /userAdm/editYh do?yhxh="+strYhxh "main");
else if(tree getSelected() key substr( )=="RB")
cmdAddDept disabled = false;
cmdAddPeople disabled = false;
var strDwxh;
strDwxh = tree getSelected() key substr( );
//window open(" /userAdm/editBm do?dwxh="+strDwxh "main");
else
cmdAddDept disabled = false;
cmdAddPeople disabled = true;
//window open("yhroot jsp" "main");
function addPeople()
var strDwxh;
if(tree getSelected())
if (tree getSelected() key substr( )=="RB")
strDwxh = tree getSelected() key substr( );
//window open(" /userAdm/addYh do?dwxh="+strDwxh "main");
alert("addPeople");
function addDept()
var strDwxh;
if(tree getSelected())
if (tree getSelected() key substr( )=="RB")
strDwfxh = tree getSelected() key substr( );
//window open(" /userAdm/addBm do?dwfxh="+strDwfxh "main");
alert("addDept");
else if(tree getSelected() key=="R ")
//window open(" /userAdm/addBm do?dwfxh= " "main");
alert("addDept");
function deleSelected()
if(!confirm("确认删除该节点吗?"))
return;
if(tree getSelected())
if(tree getSelected() key substr( )=="RB")
var strDwxh;
strDwxh = tree getSelected() key substr( );
//window open(" /userAdm/delBm do?dwxh="+strDwxh "main");
alert("deleSelected");
else if(tree getSelected() key substr( )== RZ )
var strYhxh strYhbh;
strYhxh = tree getSelected() key substr( );
strYhbh = tree getSelected() tag;
//window open(" /userAdm/delYh do?yhxh="+strYhxh+"&yhbh="+strYhbh "main");
alert("deleSelected");
function removeNode()
if(tree getSelected())
var node = tree getSelected();
node remove();
function addPeopleNode(strParentKey strKey strText strTag)
if(tree getSelected())
var node = tree getSelected();
var childNode;
//node expand();
childNode = node add(new WebFXTreeItem(strText strKey strTag "" "" " /resources/images/people png"));
node expand(); //why I do so? I dont want to tell you hah!
childNode focus();
treeClick();
function addDeptNode(strParentKey strKey strText strTag)
if(tree getSelected())
var node = tree getSelected();
var childNode;
childNode = node add(new WebFXTreeItem(strText strKey strTag));
node expand();
childNode focus();
treeClick();
function updateDeptNode(strTag strText)
if(tree getSelected())
var node = tree getSelected();
node text = strText;
node tag = strTag;
node focus();
function updatePeopleNode(strTag strText)
if(tree getSelected())
var node = tree getSelected();
node text = strText;
node tag = strTag;
node focus();
</script>
<%
int dwxh;
int dwfxh;
int yhxh;
String dwbh = null;
String dwmc = null;
String yhmc = null;
String yhbh = null;
int preLevel = ;
int level = ;
DbAccess dbaccess = new DbAccess();
String sql = "select dwxh dwbh dwmc dwfxh from xt_dw order by dwbh";
ResultSet rs = dbaccess executeQuery(sql);
try
while(rs next())
dwxh = rs getInt( );
dwbh = rs getString( );
dwmc = rs getString( );
dwfxh = rs getInt( );
//通过单位编号计算level
String last = dwbh substring( );
int i = ;
while(last equals(" ") && i> )
i ;
last = dwbh substring(i i+ );
if(i== || i== ) level = ;
if(i== || i== ) level = ;
if(i== || i== ) level = ;
if(i== || i== ) level = ;
if(i== || i== ) level = ;
//
%>
<script type=text/javascript>
nodeToAddPerson = addDeptTreeNode(<%=preLevel%> <%=level%> "<%=dwmc%>" "RB<%=dwxh%>" "<%=dwbh%>");
</script>
<%
preLevel = level;
String subsql = "select yhxh yhmc yhbh from xt_yh where dwxh = "+Integer toString(dwxh);
ResultSet subRs = dbaccess executeQuery(subsql);
while(subRs next())
yhxh = subRs getInt( );
yhmc = subRs getString( );
yhbh = subRs getString( );
%>
<script type=text/javascript>
nodeToAddPerson add(new WebFXTreeItem("<%=yhmc%>" "RZ<%=yhxh%>" "<%=yhbh%>" "" "" " /resources/images/people png"));
</script>
<%
dbaccess closeStmt();
dbaccess closeConn();
catch(Exception e)
%>
<base target="_self">
<META HTTP EQUIV="PRAGMA" CONTENT="NO CACHE">
</head>
<body>
<table border= width= % cellspacing=" " cellpadding=" ">
<tr>
<td width= colspan=" ">
<font face="宋体" size=" ">
</font>
</td>
</tr>
<tr>
<th width= % align=center nowrap>
<p align=center>
<INPUT id=cmdAddDept name=AddDept type=button value="增加部门" onclick="addDept()" >
</p>
</th>
<th width= % align=center nowrap>
<p align=center>
<INPUT id=cmdAddPeople name=AddPeople type=button value="增加用户" onclick="addPeople()" >
</p>
</th>
<th width= % align=center nowrap>
<p align=center>
<INPUT id=cmdDelete name=Delete type=button value=" 删除 " onclick="deleSelected()" disabled>
</p>
</th>
</tr>
<tr>
<td width= height= colspan=" ">
</td>
</tr>
</table>
</body>
<div onclick="treeClick()">
<script type=text/javascript>
document write(tree);
</script>
</div>
</HTML>
cha138/Article/program/Java/JSP/201311/20035相关参考
JSP实现论坛树型结构的具体算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 实现论坛树型结构
JSP页面文件目录树源码(递归算法) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! <%@
希赛教育计算机专业考研专业课辅导招生 希赛教育计算机专业考研专业课辅导视频 希赛教育计算机考研专业课在线测试系统 普里姆算法构造生成树的过程cha138/Article/progr
希赛教育计算机专业考研专业课辅导招生 希赛教育计算机专业考研专业课辅导视频 希赛教育计算机考研专业课在线测试系统 在二叉查找树上进行查找的过程类似于次优查找树 若二叉查找树为空则查找不成功
希赛教育计算机专业考研专业课辅导招生 希赛教育计算机专业考研专业课辅导视频 希赛教育计算机考研专业课在线测试系统 对于动态查找表在查找不成功时尚需进行插入即当二叉查找树中不存在其关键字等于给
希赛教育计算机专业考研专业课辅导招生 希赛教育计算机专业考研专业课辅导视频 希赛教育计算机考研专业课在线测试系统 BiTNode*CopyTree(BiTNode*T) //已知二叉树
广义树和基本树的主要区别就是有任意的度 usingSystem; usingSystemCollections; namespaceDataStructure ///<summary
希赛教育计算机专业考研专业课辅导招生 希赛教育计算机专业考研专业课辅导视频 希赛教育计算机考研专业课在线测试系统 BiTreeCrtExptree(char*exp) //建立由合法的
希赛教育计算机专业考研专业课辅导招生 希赛教育计算机专业考研专业课辅导视频 希赛教育计算机考研专业课在线测试系统 在一棵二叉树上删除其中某个结点将隔断其祖先和子孙的关系因此在二叉树的抽象数据
知识大全 数据结构 9.10 二叉查找树的删除算法演示(二)
希赛教育计算机专业考研专业课辅导招生 希赛教育计算机专业考研专业课辅导视频 希赛教育计算机考研专业课在线测试系统 T在函数DeleteBST中是一个递归调用的引用型参数第一次调用时的参数是指