javascript动态添加无限级树状目录

package com.ljy.catalog;

import java.sql.*;
import java.util.*;

/**
 * <p>Title: N层目录树自动生成器</p>
 * <p>Description: 需要的前提条件:数据库是绑死的(一个遗憾,不过很好做)!
 * <p>1>表结构:id,parent_id,title三个字段/p>
 * <p>2>输出数据:页面表示/JavaScript脚本全自动生成 </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: </p>
 * @author ADA(梁金玉)
 * @version 1.0
 */

public class CatalogTest {
  static final String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
  static final String url =
      "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";

  Connection cn;

  int i = 0; //目录树层次控制
  StringBuffer sb = new StringBuffer("<body οnlοad=closes()><table border=1>");
  ArrayList ids = new ArrayList(); //保存所有子树的id
  HashMap child = new HashMap(); //保存单独子树的所有id和处理这些id的方法名
  ArrayList tt = new ArrayList(); //保存单独子树的所有id

  public CatalogTest() {
    try {
      Class.forName(driver);
      cn = DriverManager.getConnection(url, "sa", "");
    }
    catch (SQLException ex) {
      System.out.println("sql异常");
    }
    catch (ClassNotFoundException ex) {
      System.out.println("驱动没有找到");
    }
  }

  public void getCatalogHTML(int rootId) {
    getCatalog(rootId);
    createScript();
  }

  /**
   * 自动生成JavaScript脚本
   */
  private void createScript() {
    sb.append("</table>");
    sb.append("<script language=/"javascript/">");
    sb.append("function closes(){");
    Iterator it = ids.iterator();
    while (it.hasNext()) {
      sb.append("this.tree");
      sb.append(it.next());
      sb.append(".style.display=/"none/";");
    }
    sb.append("}");

    Set key = child.keySet();
    it = key.iterator();
    while (it.hasNext()) {
      String k = (String) it.next();
      ArrayList value = (ArrayList) child.get(k);
      if (!value.isEmpty()) {
        sb.append("function ");
        sb.append(k);
        sb.append("(){");
        sb.append("closes();");
        Iterator its = value.iterator();
        while (its.hasNext()) {
          sb.append("this.");
          sb.append(its.next());
          sb.append(".style.display=/"/";");
        }
        sb.append("}");
      }
    }
    sb.append("</script>");
  }

  //测试方法
  private void display() {
    Set t = child.keySet();
    Iterator it = t.iterator();
    while (it.hasNext()) {
      System.out.println(it.next());
    }
    t = child.entrySet();
    it = t.iterator();
    while (it.hasNext()) {
      System.out.println(it.next());
    }

  }

  /**
   * 递归使用注意事项:注意输入和输出的区分。注意全局和局部的区分。
   */
  ArrayList temp=new ArrayList();
  private void getCatalog(int id) {
    String sql = "select id,title from catalog_data where parent_id=" + id;
    try {
      Statement st = null;
      ResultSet rs = null;
      st = cn.createStatement();
      rs = st.executeQuery(sql);
      if (null != rs) {
        while (rs.next()) {
          int temp_id = rs.getInt("id");
          String title = rs.getString("title");
          sb.append("<tr><td id=/"tree");
          sb.append(temp_id);
          sb.append("/">");
          if (-1 != id) {
            ids.add(new Integer(temp_id));
            for (int j = 0; j < i * 2; j++) {
              sb.append("&nbsp;");
            }
            sb.append("|-");
            sb.append("<a href=#>");
            tt.add("tree" + temp_id);
          }
          if (0 == i) {
            String str = "treeClick" + temp_id;
            child.put(str, tt);

            sb.append("<a href=# οnclick=treeClick");
            sb.append(temp_id);
            sb.append("()>");
          }
          sb.append(title);
          sb.append("</a></td></tr>");
          i++;
          getCatalog(temp_id);
          i--;
          if (0 == i) { //i==0时意味着下一个根的子树遍历开始。所以要重新构造保存子树id的集合
            tt = new ArrayList();
          }
        }
      }else{
        temp.add(new Integer(id));
      }
    }
    catch (SQLException ex) {
      System.out.println("SQL执行失败");
      ex.printStackTrace();
    }
  }
  private void putchild(){
    Iterator it=temp.iterator();
    while(it.hasNext()){
      System.out.println(it.next());
    }
  }
  public String getText() {
    return sb.toString();
  }

  public static void main(String[] args) {
    CatalogTest t = new CatalogTest();
    t.getCatalogHTML( -1);
    System.out.println(t.getText());
//    t.putchild();
//    t.display();
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值