国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JSP > 正文

純jsp打造無(wú)限層次的樹代碼

2024-09-05 00:21:16
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
很多人在開發(fā)中遇到過這樣的問題:一個(gè)表,有自己編號(hào),內(nèi)容,上級(jí)編號(hào),如何用這些數(shù)據(jù)在jsp中構(gòu)造一個(gè)樹?

做樹并不復(fù)雜,但我們通常做的是2層或3層,那樣的數(shù)據(jù)一般來(lái)自多個(gè)表,比如:部門,員工
然而這種自連接的表,其沒有確定的層次,可能是無(wú)限多級(jí)
比如:a是b的上級(jí),b是c的上級(jí),c是d的上級(jí)...
每個(gè)上級(jí)有幾個(gè)下級(jí),下級(jí)的層次,都是動(dòng)態(tài)的
解決這個(gè)問題,其實(shí)主要用到j(luò)s的知識(shí)
可以使用div的innerHTML屬性
當(dāng)然也可以用table,用append的方法
下面就用div的innerHTML屬性來(lái)實(shí)現(xiàn)
主要思路是通過super,在document中查找id與自身super關(guān)聯(lián)的div,這個(gè)div就是自身的上級(jí),把自己附加到這個(gè)div中就可以了
另外,通過設(shè)置自己的title,保存了自己上級(jí)的id
為了看到層層縮進(jìn)效果,設(shè)置了div的style為左邊距有10px
+ 和 - 通過div中的span實(shí)現(xiàn),這里改變的是span的innerHTML,也可以換為用圖片,改變img的src即可
而在點(diǎn)擊這些 + 或 - 的時(shí)候,會(huì)調(diào)用一個(gè)js函數(shù),傳入自己的id,這個(gè)函數(shù)會(huì)在document的所有div中查找自己的下級(jí),由于每個(gè)div的title保存了其上級(jí)的id,所以只有找到那些title為自己id的就可以了
找到這些下級(jí),就設(shè)置其隱藏或顯示即可
建表
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,'長(zhǎng)沙分公司',1);
insert into tb values (3,'株洲分公司',1);
insert into tb values (4,'湘潭公司',1);
insert into tb values (5,'長(zhǎng)沙東區(qū)分點(diǎn)',2);
insert into tb values (6,'長(zhǎng)沙南區(qū)分點(diǎn)',2);
insert into tb values (7,'湘潭東區(qū)分點(diǎn)',4);
insert into tb values (8,'長(zhǎng)沙東區(qū)分點(diǎn)一處',5);
insert into tb values (9,'長(zhǎng)沙東區(qū)分點(diǎn)二處',5);
insert into tb values (10,'長(zhǎng)沙東區(qū)分點(diǎn)三處',5);
insert into tb values (11,'長(zhǎng)沙南區(qū)分點(diǎn)一處',6);
insert into tb values (12,'長(zhǎng)沙南區(qū)分點(diǎn)二處',6);
insert into tb values (13,'湘潭東區(qū)分點(diǎn)一處',7);
insert into tb values (14,'湘潭東區(qū)分點(diǎn)二處',7);
insert into tb values (15,'長(zhǎng)沙東區(qū)分點(diǎn)一處一門市部',8);
insert into tb values (16,'長(zhǎng)沙東區(qū)分點(diǎn)一處二門市部',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"%>
<%
//獲取數(shù)據(jù)庫(kù)的數(shù)據(jù),并保存為雙層集合,然后放到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") {
//頂層:設(shè)置其上級(jí)為div0
obj = document.getElementById("div0");
//定義自身內(nèi)容,設(shè)置自身可見 -- display:block
//span用于確定 + 或 - ,并且ope函數(shù)用于點(diǎn)擊時(shí)顯示或隱藏下級(jí)
str2 = "<div><span>+</span> " + ary2[1] + "</div>";
}
else {
//其他:查找其上級(jí),即:ID為 'div' + ary2[2] 的div
//如:如果ary2[2]為3,那么其上級(jí)為 div3
obj = document.getElementById("div" + ary2[2]);
//定義自身內(nèi)容,其中title用于存儲(chǔ)其上級(jí)ID,設(shè)置自身不可見 -- display:none
str2 = "<div + ary2[2] + "'><span>+</span> " + ary2[1] + "</div>";
}
str = obj.innerHTML; //獲取上級(jí)原來(lái)的內(nèi)容
str = str + str2; //附加當(dāng)前div
obj.innerHTML = str; //設(shè)置上級(jí)的新內(nèi)容
}
}
//點(diǎn)某個(gè)節(jié)點(diǎn)時(shí),展開或隱藏其下級(jí)
function ope(id) {
//首先改變 + 和 -
var obj = document.getElementById("span" + id);
if(obj.innerHTML == "+") {
obj.innerHTML = "-";
}
else {
obj.innerHTML = "+";
}
//然后找到下級(jí),并改變其可見性
var objs = document.getElementsByTagName("div"); //獲取所有的div
var len = objs.length;
//遍歷這些div,找到所有的下級(jí),即: title為id 的div,對(duì)于這些下級(jí)
//如果原來(lái)是隱藏,就讓其顯示;否則,隱藏--通過設(shè)置其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>
<div></div>
------------------------------------------------------------------------------------------------------------------------------
大家可以進(jìn)一步想,實(shí)際點(diǎn)每個(gè)內(nèi)容的時(shí)候,一般會(huì)鏈接到某個(gè)url,那么,這里怎么處理?
如果你熟悉html和js,當(dāng)然就是很容易的
思路:數(shù)據(jù)庫(kù)中該表增加一個(gè)字段,url,定義鏈接地址
在js中修改代碼
大家還可以考慮把它做成標(biāo)簽,更方便

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 杭锦旗| 开封市| 石楼县| 手机| 庄河市| 民乐县| 竹溪县| 玉田县| 虞城县| 连云港市| 策勒县| 德格县| 东乡| 封丘县| 阿克苏市| 竹山县| 灵台县| 吉首市| 临洮县| 同德县| 咸宁市| 德化县| 山西省| 丁青县| 玉门市| 都兰县| 伊宁县| 津市市| 布拖县| 苗栗市| 志丹县| 吉安市| 安达市| 西安市| 盖州市| 宁波市| 林甸县| 商丘市| 大城县| 华池县| 池州市|