• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    纯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;ilen;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>nbsp;nbsp;" + 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>nbsp;nbsp;" + 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;ilen;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中修改代码
    大家还可以考虑把它做成标签,更方便
    上一篇:一个简单的JAVA字符集过滤器实现
    下一篇:JSP连接MySql/MS SQL Server/Oracle数据库连接方法[整理]
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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