手机
当前位置:查字典教程网 >编程开发 >JSP教程 >纯jsp打造无限层次的树代码
纯jsp打造无限层次的树代码
摘要:做树并不复杂,但我们通常做的是2层或3层,那样的数据一般来自多个表,比如:部门,员工然而这种自连接的表,其没有确定的层次,可能是无限多级比如...

做树并不复杂,但我们通常做的是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 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 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中修改代码

大家还可以考虑把它做成标签,更方便

【纯jsp打造无限层次的树代码】相关文章:

jsp中一个页面引入另一个页面的实现代码

jsp/javascript打印九九乘法表代码

jsp include引用非本级目录网页实现代码

jsp统计在线人数代码

图片轮播js代码

jsp留言板源代码三: 给jsp初学者.

jsp留言板源代码四: 给jsp初学者.

jsp留言板源代码二: 给jsp初学者.

jsp Hibernate批量更新和批量删除处理代码

jsp计数器代码

精品推荐
分类导航