当前位置: 首页 > 图文教程 > 网络编程 > JSP > 纯jsp打造无限层次的树代码

JSP
Java 创建cookie和删除cookie
jsp 从web.xml读取连接数据库的参数
jsp 不支持EL表达式,解决办法
jsp 获取客户端的浏览器和操作系统信息
struts2 session 解读
struts2 spring整合fieldError问题
jsp 生成验证码代码
搭建java WEB开发环境和应用
JSP 自定义标签
Java 区分文本中的中英文字符函数
通用JSP页面 jsp入门级文章
jsp struts1 标签实例详解
一个jdbc 测试程序代码
SSH整合中 hibernate托管给Spring得到SessionFactory
jsp SmartUpload 实现上传功能代码
jsp Unsupported encoding: gb2312 错误原因
java Struts2 在拦截器里的跳转问题
jsp 对request.getSession(false)的理解(附程序员常疏忽的一个漏洞)
Java 项目生成静态页面的代码
jdk与jre的区别 很形象,很清晰,通俗易懂

JSP 中的 纯jsp打造无限层次的树代码


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 52 ::
收藏到网摘: n/a

很多人在开发中遇到过这样的问题:一个表,有自己编号,内容,上级编号,如何用这些数据在jsp中构造一个树? 做树并不复杂,但我们通常做的是2层或3层,那样的数据一般来自多个表,比如:部门,员工
然而这种自连接的表,其没有确定的层次,可能是无限多级
比如:a是b的上级,b是c的上级,c是d的上级...
每个上级有几个下级,下级的层次,都是动态的
解决这个问题,其实主要用到js的知识
可以使用div的innerHTML属性
当然也可以用table,用append的方法
下面就用div的innerHTML属性来实现
主要思路是通过super,在document中查找id与自身super关联的div,这个div就是自身的上级,把自己附加到这个div中就可以了
另外,通过设置自己的title,保存了自己上级的id
为了看到层层缩进效果,设置了div的style为左边距有10px
+ 和 - 通过div中的span实现,这里改变的是span的innerHTML,也可以换为用图片,改变img的src即可
而在点击这些 + 或 - 的时候,会调用一个js函数,传入自己的id,这个函数会在document的所有div中查找自己的下级,由于每个div的title保存了其上级的id,所以只有找到那些title为自己id的就可以了
找到这些下级,就设置其隐藏或显示即可
建表
use tempdb
go
create table tb
(
id int primary key,
name varchar(50) not null,
super int references tb
)
insert into tb values (1,'总公司',null);
insert into tb values (2,'长沙分公司',1);
insert into tb values (3,'株洲分公司',1);
insert into tb values (4,'湘潭公司',1);
insert into tb values (5,'长沙东区分点',2);
insert into tb values (6,'长沙南区分点',2);
insert into tb values (7,'湘潭东区分点',4);
insert into tb values (8,'长沙东区分点一处',5);
insert into tb values (9,'长沙东区分点二处',5);
insert into tb values (10,'长沙东区分点三处',5);
insert into tb values (11,'长沙南区分点一处',6);
insert into tb values (12,'长沙南区分点二处',6);
insert into tb values (13,'湘潭东区分点一处',7);
insert into tb values (14,'湘潭东区分点二处',7);
insert into tb values (15,'长沙东区分点一处一门市部',8);
insert into tb values (16,'长沙东区分点一处二门市部',8);
select id,name,isnull(super,0) as super from tb order by super
-------------------------------------------------------------------------------------------------------------------------
tree.jsp文件
<%@ page language="java" import="java.sql.*,java.util.*" pageEncoding="gbk" contentType="text/html; charset=gbk" isELIgnored="false"%>
<%
//获取数据库的数据,并保存为双层集合,然后放到pageContext中
//这样与使用dao和servlet得到的,放到request中的方式是一致的
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
String url = "jdbc:microsoft:sqlserver://localhost:1433;databasename=tempdb";
Connection cn = DriverManager.getConnection(url,"sa","sa");
Statement st = cn.createStatement();
String sql = "select id,name,isnull(super,0) as super from tb order by super";
ResultSet rs = st.executeQuery(sql);
ArrayList lstAll = new ArrayList();
ArrayList lstLine;
while(rs.next()) {
lstLine = new ArrayList();
lstLine.add(rs.getString(1));
lstLine.add(rs.getString(2));
lstLine.add(rs.getString(3));
lstAll.add(lstLine);
}
pageContext.setAttribute("lstAll",lstAll);
%>
<script>
//初始化树
function ini() {
var str = "${lstAll}";
var ary = str.split("], [");
var i,j;
var len = ary.length;
var ary2,len2;
var str,str2,obj;
for(i=0;i<len;i++) {
ary[i] = ary[i].replace("[[","");
ary[i] = ary[i].replace("]]","");
ary2 = ary[i].split(", ");
if(ary2[2]=="0") {
//顶层:设置其上级为div0
obj = document.getElementById("div0");
//定义自身内容,设置自身可见 -- display:block
//span用于确定 + 或 - ,并且ope函数用于点击时显示或隐藏下级
str2 = "<div style='display:block' id='div" + ary2[0] + "'><span id='span" + ary2[0] + "' onclick='ope(" + ary2[0] + ")'>+</span> " + ary2[1] + "</div>";
}
else {
//其他:查找其上级,即:ID为 'div' + ary2[2] 的div
//如:如果ary2[2]为3,那么其上级为 div3
obj = document.getElementById("div" + ary2[2]);
//定义自身内容,其中title用于存储其上级ID,设置自身不可见 -- display:none
str2 = "<div style='display:none' id='div" + ary2[0] + "' title='" + ary2[2] + "'><span id='span" + ary2[0] + "' onclick='ope(" + ary2[0] + ")'>+</span> " + ary2[1] + "</div>";
}
str = obj.innerHTML; //获取上级原来的内容
str = str + str2; //附加当前div
obj.innerHTML = str; //设置上级的新内容
}
}
//点某个节点时,展开或隐藏其下级
function ope(id) {
//首先改变 + 和 -
var obj = document.getElementById("span" + id);
if(obj.innerHTML == "+") {
obj.innerHTML = "-";
}
else {
obj.innerHTML = "+";
}
//然后找到下级,并改变其可见性
var objs = document.getElementsByTagName("div"); //获取所有的div
var len = objs.length;
//遍历这些div,找到所有的下级,即: title为id 的div,对于这些下级
//如果原来是隐藏,就让其显示;否则,隐藏--通过设置其style的display即可
var i,title;
for(i=0;i<len;i++) {
obj = objs[i];
title = obj.title;
if(title==null || isNaN(title)) {
continue;
}
if(parseInt(title)==parseInt(id)) {
if(obj.style.display=="none") {
obj.style.display = "block";
}
else {
obj.style.display = "none";
}
}
}
}
</script>
<style>
div{margin-left:10px;color:darkblue}
span{color:red;cursor:hand}
</style>
<body onload="ini();">
<div id="div0"></div>
------------------------------------------------------------------------------------------------------------------------------
大家可以进一步想,实际点每个内容的时候,一般会链接到某个url,那么,这里怎么处理?
如果你熟悉html和js,当然就是很容易的
思路:数据库中该表增加一个字段,url,定义链接地址
在js中修改代码
大家还可以考虑把它做成标签,更方便