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(" ");
}
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();
}
}