jsp树形菜单的实现

 1。原理简介
 dtree是一个免费的javascript脚本,只需定义有限的几个参数,就可以做出漂亮的树型菜单。下载目录:http://www.destroydrop.com/javascripts/tree/
 以下是dtree的用法示例:
 1)初始化菜单
 

< script type = " text/javascript " >
  
<!--
  
var  Tree  =   new  Array;
  
//  nodeId | parentNodeId | nodeName | nodeUrl
  Tree[ 0 ]   =   " 1|0|Page 1|# " ;
  Tree[
1 ]   =   " 2|1|Page 1.1|# " ;
  Tree[
2 ]   =   " 3|1|Page 1.2|# " ;
  Tree[
3 ]   =   " 4|3|Page 1.2.1|# " ;
  Tree[
4 ]   =   " 5|1|Page 1.3|# " ;
  Tree[
5 ]   =   " 6|2|Page 1.1.1|# " ;
  Tree[
6 ]   =   " 7|6|Page 1.1.1.1|# " ;
  Tree[
7 ]   =   " 8|6|Page 1.1.1.2|# " ;
  Tree[
8 ]   =   " 9|1|Page 1.4|# " ;
  Tree[
9 ]   =   " 10|9|Page 1.4.1|# " ;
  Tree[
10 =   " 11|0|Page 2|# " ;
  
// -->
  </ script >

 2)调用函数
 

< div  class ="tree" >
  
< script  type ="text/javascript" >
  
<!--
   createTree(Tree,
1,7);  // starts the tree at the top and open it at node nr. 7
  //-->
  
</ script >
 
</ div >

 显然,如果用动态的脚本来初始化菜单数组(asp,jsp均可),那就可以很方便的实现动态的树型菜单了。

2。jsp动态实现
   分以下步骤实现动态的树型菜单:
   1)在数据库建tree_info表,有nodeId,parentNodeId,nodeName,nodeUrl四个字段,来存储节点信息。
   2)编写java类,用于从数据库找出节点信息,并且生成javascript脚本。
   3)编写tag类。用于封装逻辑,简化jsp的开发。
   4)建一个web程序进行测试。

3。详细过程
   1)在数据库建表,脚本如下:
  

  CREATE   TABLE  `test`.`tree_info` (
   `node_id` 
INTEGER  UNSIGNED  NOT   NULL   DEFAULT   - 1 ,
   `parent_id` 
INTEGER  UNSIGNED  NOT   NULL   DEFAULT   - 1 ,
   `node_name` 
VARCHAR ( 45 NOT   NULL ,
   `ref_url` 
VARCHAR ( 45 NOT   NULL ,
   
PRIMARY   KEY (`node_id`)
 )

 我使用mysql数据库,如果脚本细节有出入,请自行修改
    按照上面的dTree示例插入数据
   2)编写TreeInfo.java,这个类用于封装节点信息

 

   package  com.diegoyun.web.tree;
  
/**
   * 
@author Diegoyun
   * 
@version 1.0
   
*/

  
public   class  TreeInfo  {
   
private int nodeId = -1;//node id
   private int parentId = -1;//parentId
   private String nodeName = null;//node name
   private String url = null;//url references

   
public int getNodeId() {
    
return nodeId;
   }


   
public void setNodeId(int nodeId) {
    
this.nodeId = nodeId;
   }


   
public int getParentId() {
    
return parentId;
   }


   
public void setParentId(int parentId) {
    
this.parentId = parentId;
   }


   
public String getNodeName() {
    
return nodeName;
   }


   
public void setNodeName(String nodeName) {
    
this.nodeName = nodeName;
   }


   
public String getUrl() {
    
return url;
   }


   
public void setUrl(String url) {
    
this.url = url;
   }


  }



      编写TreeUtil.java,用于从数据库得到节点信息,封装到TreeInfo对象,并生成javascript脚本

 

 TreeUtil.java
   
package  com.diegoyun.web.tree;
  
import  java.util.Collection;
  
import  java.util.ArrayList;
  
import  java.util.Iterator;
  
import  java.util.List;
  
import  java.sql.PreparedStatement;
  
import  java.sql.ResultSet;
  
import  java.sql.Connection;
  
import  java.sql.DriverManager;

  
/**
   * 
@author Diegoyun
   * 
@version 1.0
   
*/

  
public   class  TreeUtil  {
   
public static List retrieveNodeInfos(){
    List coll 
= new ArrayList();

    String driverName 
= "com.mysql.jdbc.Driver";
    String host 
= "localhost";
    String port 
= ":3306";
    String serverID 
= "test";
    String userName 
= "root";
    String userPwd 
= "root";
    String url 
= "jdbc:mysql://" + host + port + "/" + serverID ;

    Connection conn 
= null ;
    PreparedStatement ps 
= null;
    ResultSet rs 
= null;
    
try{
     Class.forName(driverName).newInstance();
     conn 
= DriverManager.getConnection(url , userName , userPwd);
     String sql 
= "select * from tree_info";
     ps 
= conn.prepareStatement(sql);
     rs 
= ps.executeQuery();

     TreeInfo info 
= null;
     
while(rs!=null && rs.next()){
      info 
= new TreeInfo();
      info.setNodeId(rs.getInt(
1));
      info.setParentId(rs.getInt(
2));
      info.setNodeName(rs.getString(
3));
      info.setUrl(rs.getString(
4));
      coll.add(info);
     }

  
//            if(rs!=null){
  
//                rs.close();
  
//                rs=null;
  
//            }
  
//            if(ps!=null){
  
//                ps.close();
  
//                ps=null;
  
//            }
    }
catch(Exception e){
     System.out.println(e);
    }



    
return coll;
   }

   
public static String createTreeInfo(List alist){
    StringBuffer contents 
= new StringBuffer();
    contents.append(
"<!-- ");
    contents.append(
"var Tree = new Array;");//create a array in javascript
    TreeInfo info =null;
    
for(int max = alist.size(),i=0;i<max;i++){
     info 
= (TreeInfo)alist.get(i);
     
//define elements of array
     contents.append("Tree[");
     contents.append(i);
     contents.append(
"]="");
     contents.append(info.getNodeId());
     contents.append(
"|");
     contents.append(info.getParentId());
     contents.append(
"|");
     contents.append(info.getNodeName());
     contents.append(
"|");
     contents.append(info.getUrl());
     contents.append(
"";");
    }


contents.append(
"docment.writer(Tree);");
    contents.append(
"//-->");

    
return contents.toString();
   }

   
public static void main(String[]args){
    List alist 
= TreeUtil.retrieveNodeInfos();
  
//        TreeInfo info = null;
  
//        for(Iterator i = c.iterator();i.hasNext();){
  
//            info = (TreeInfo)i.next();
  
//            System.out.println("*****" + info.getNodeName());
  
//        }
    System.out.println(TreeUtil.createTreeInfo(alist));
   }

  }



   3)编写标签类
 InitTreeTag.java

 

package  com.diegoyun.web.taglibs;
 
import  com.diegoyun.web.tree.TreeUtil;
 
import  javax.servlet.jsp.tagext.TagSupport;
 
import  javax.servlet.jsp.JspException;
 
import  java.io.IOException;

 
/**
  * 
@author Diegoyun
  * 
@version 1.0
  
*/

 
public   class  InitTreeTag  extends  TagSupport {

  
public int doEndTag() throws JspException {
   StringBuffer tree 
= new StringBuffer();
   tree.append(
"<script type="text/javascript"> ");
   tree.append(TreeUtil.createTreeInfo(TreeUtil.retrieveNodeInfos()));
   tree.append(
"</script> ");
   
try{
    pageContext.getOut().println(tree.toString());
   }
catch(IOException ioe){
    ioe.printStackTrace();
   }

   
return super.doEndTag();
  }

 }


 ShowTreeTag.java : 

 
package  com.diegoyun.web.taglibs;

 
import  javax.servlet.jsp.tagext.TagSupport;
 
import  javax.servlet.jsp.JspException;
 
import  java.io.IOException;

 
/**
  * 
@author Diegoyun
  * 
@version 1.0
  
*/

 
public   class  ShowTreeTag  extends  TagSupport {
  
public int doEndTag() throws JspException {
   StringBuffer buffer 
= showTree();
   
try {
    pageContext.getOut().println(buffer.toString());
   }

   
catch (IOException ioe) {
    ioe.printStackTrace();
   }

   
return super.doEndTag();
  }

  
private StringBuffer showTree(){
   StringBuffer sb 
= new StringBuffer();
   sb.append(
"<div class="tree"> ");
   sb.append(
"<script type="text/javascript"> ");
   sb.append(
"<!-- ");
   sb.append(
"createTree(Tree); ");
   sb.append(
"//--> ");
   sb.append(
"</script> ");
   sb.append(
"</div> ");
   
return sb;
  }
   
 }



  标签的tld如下:
 

<? xml version="1.0" encoding="ISO-8859-1"  ?>
 
<! DOCTYPE taglib
   PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"
>
 
< taglib >
  
< tlib-version > 1.0 </ tlib-version >
  
< jsp-version > 1.2 </ jsp-version >
  
< short-name > tree </ short-name >
  
<!-- initTreeTag -->
  
< tag >
   
< name > init </ name >
   
< tag-class > com.diegoyun.web.taglibs.InitTreeTag </ tag-class >
   
< body-content > empty </ body-content >
  
</ tag >
  
<!-- ShowTreeTag -->
  
< tag >
   
< name > show </ name >
   
< tag-class > com.diegoyun.web.taglibs.ShowTreeTag </ tag-class >
   
< body-content > empty </ body-content >
  
</ tag >
 
</ taglib >

 4)建立web过程,编写jsp进行测试。

 index.jsp如下:
 

<% @ page language="java" %>
 
<% @ taglib uri="/WEB-INF/tlds/tree.tld" prefix="tree" %>


 
< html >
 
< head >
  
< title > Tree example </ title >
  
< meta  http-equiv ="Content-Type"  content ="text/html; charset=iso-8859-1" >
  
< link  rel ="StyleSheet"  href ="tree.css"  type ="text/css" >
  
< script  type ="text/javascript"  src ="tree.js" ></ script >
  
< tree:init />
 
</ head >

 
< body >


 
< b > Tree example : </ b >< br  />< br  />
 
< tree:show />
 
< br  />< br  />

  
</ body >
 
</ html >

 测试,enjoy yourself!

 

4。待解决问题
 dTree有点小bug,如果把css,img,js的路径改变,树就有可能不会正确显示。

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值