<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我思故我強

    ajax動態樹的實現(轉)

    一.設計思想:

    1.布局css+div:好處就不多說了

    2.利用ajax,當點擊樹中某個節點時才生成其子節點,這樣能避免了客戶端一次性加載整棵樹,執行速度快

    3.樹的生成用java控制而不是像Dtree的實現是用javascript實現,dtree實現的js代碼看了你都會頭暈,而且這種樹是一次性加載,如果你想利用異步請求(ajax)獲得一個樹,那么實現起來相當麻煩。因為異步請求后執行是在服務器端執行的,js又不能在服務器端執行。但如果數是用java實現就不一樣了,呵呵。

    4.本程序實現分四層:視圖層tree.jsp,treeAction.jsp(可以在通過控制層實現);業務層com.tree.biz.TreeBiz;數據持久層用hibernate,數據庫層用mysql

    二。數據設計:

    很明顯,運用表內關聯是不錯的選擇,有多種實現方式,設計了個parid字段用于標識父級id(也可以通過編號來控制,01,01001,01002的形式,具體根據項目的需求來定)建庫腳本如下:

    ************************************數據腳本 start********************************

    ?


    create database if not exists `template`;

    USE `template`;

    ?

    DROP TABLE IF EXISTS `tree_demo`;

    CREATE TABLE `tree_demo` (
    ? `id` bigint(20) NOT NULL auto_increment,
    ? `item_num` varchar(20) default NULL,
    ? `item_name` varchar(50) default NULL,
    ? `item_parId` bigint(20) default '0',
    ? PRIMARY KEY? (`id`)
    ) TYPE=MyISAM;

    ?

    insert into `tree_demo` values

    (1,'','一級菜單1',0),

    (2,'','一級菜單2',0),

    (3,'','一級菜單3',0),

    (4,'','一級菜單4',0),

    (5,'','一級菜單5',0),

    (6,'','二級菜單11',1),

    (7,'','二級菜單12',1),

    (8,'','二級菜單13',1),

    (9,'','三級菜單121',7),

    (10,'','三級菜單122',7),

    (11,'','三級菜單123',7),

    (12,'','三級菜單124',7),

    (13,'','二級菜單21',2),

    (14,'','二級菜單22',2);

    *************************************數據腳本 end******************************************

    三,持久層實現,我是在myeclipse6.0中實現的,所以pojo類和dao的生成很簡單,文件名是com.tree.hibernate.TreeDemo;com.tree.hibernate.TreeDemoDAO;

    四,業務邏輯層:com.tree.biz.TreeBiz;代碼如下

    ****************************com.tree.biz.TreeBiz???? start**************************************

    package com.tree.biz;

    import java.util.List;

    import com.tree.hibernate.TreeDemo;
    import com.tree.hibernate.TreeDemoDAO;

    public class TreeBiz {
    ?private TreeDemoDAO dao;
    ?public TreeBiz(){
    ??dao = new TreeDemoDAO() ;
    ?}
    ?public TreeDemo getTreeDemoById(Long id){
    ??return dao.findById(id) ;
    ?}
    ?
    ?public List getChlids(TreeDemo treeNode){
    ??List li = null ;
    ??li = dao.findByItemParId(treeNode!=null?treeNode.getId():0) ;
    ??return li ;
    ?}

    }

    *************************************com.tree.biz.TreeBiz???? end***********************************

    五,視圖層

    1.css的實現代碼

    ***********************************************tree.css??????? start*******************************

    TABLE{
    ?border:0px;
    ?margin:0px;
    ?padding:0px;
    ?font-size:12px;
    }
    DIV{
    ?border:0px;
    ?margin:0px;
    ?padding:0px;?
    }
    .treeClass{
    ?height:16px;??
    ?width:200px;????
    ?font-size:12px;
    }

    ******************************************tree.css???? end**********************************

    ?2.ajax.js實現

    ******************************************ajax.js??????? start**********************************

    // JavaScript Document



    var divObject ;
    function createXMLHttpRequest() {
    ??//alert("1");
    ?if (window.ActiveXObject) {
    ??return? new ActiveXObject("Microsoft.XMLHTTP");
    ?} else {
    ??if (window.XMLHttpRequest) {
    ??return new XMLHttpRequest();
    ??}
    ?}
    }

    function sendRequest(url,showAreaId){//第1個是提交的url,第2個是定義要將服務器返回的信息顯示在哪個id域里
    ?var xmlHttp = createXMLHttpRequest();
    ?url += "&sessionId="+parseInt(Math.random()*(10000000));
    ?//alert(url);
    ?xmlHttp.onreadystatechange = function(){
    ??if(xmlHttp.readyState==4){
    ???if(xmlHttp.status==200){
    ????//alert(xmlHttp.responseText);
    ????document.getElementById(showAreaId).innerHTML=xmlHttp.responseText;
    ???}else{
    ????alert('請求的頁面異常'+xmlHttp.responseText);
    ????return;
    ???}
    ??}??
    ?};?
    ?
    ?xmlHttp.open("GET",url, false);??
    ?xmlHttp.send(null);
    }

    ******************************************ajax.js??????? end***********************************

    ?3.tree.jsp,這個頁面用于顯示樹

    ******************************************tree.jsp??????start***********************************

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    ? <head>
    ??? <title>純jsp 動態tree</title>
    ?
    ?<link rel="stylesheet" type="text/css" href="../../css/tree.css">
    ?
    ?<script type="text/javascript" src="../../js/ajax.js"></script>
    ?<script type="text/javascript">
    ??function treeAcion(nodeId,level){//id:父節點id ; level:節點層次
    ???var node = document.getElementById('child'+nodeId);?
    ???var varImg = document.getElementById("varImg"+nodeId);??
    ???if(node.style.display == "none"){
    ????sendRequest("treeAction.jsp?id="+nodeId+"&level="+level,"child"+nodeId);//向頁面treeAction.jsp異步請求節點的下級節點,并將下級節點顯示在id為"child"+nodeId的層里
    ????if(node.innerHTML != ""){??//有下級時才顯示??
    ?????node.style.display = "" ;
    ?????varImg.innerHTML="<img? src='../images/o.gif'/>" ;//更改節點前的圖片
    ????}????
    ???}else{
    ????node.style.display = "none" ;
    ????varImg.innerHTML="<img? src='../images/c.gif'/>";//更改節點前的圖片
    ???}???
    ???return false ;
    ??}
    ?</script>
    ? </head>
    ?
    ? <body>
    ??? <div id="node0" class="treeClass"><a href="#" onclick="return treeAcion('0','0')" >根接點</a></div>
    ??? <div id="child0" style="display:none;">??
    ???? ?
    ??? </div>

    <!--這里我通過js事件來生成一級根目錄,如果想在服務器端生成這個樹,則把這段代碼換成java實現,具體參照treeAction.jsp-->
    ??? <script type="text/javascript">
    ??? ?treeAcion('0','0');
    ??? </script>
    ? </body>
    </html>

    ******************************************tree.jsp????????? end***********************************

    4.treeAction.jsp 用于生成指定節點的下級節點,可以根據需要用servlet,或struts來做控制層實現

    ******************************************treeAction.jsp??????start***********************************

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
    <jsp:directive.page import="com.tree.biz.TreeBiz"/>
    <jsp:directive.page import="com.tree.hibernate.TreeDemo;"/>
    <%
    ?try{
    ??TreeBiz treeBiz = new TreeBiz() ;
    ??Long id = Long.valueOf(request.getParameter("id")) ;//父節點id
    ??int level = Integer.parseInt(request.getParameter("level")) ;??//父節點層次
    ??int curLevel = level+1 ;//計算當前節點層次
    ??String space = "" ;?????????????//菜單前豎虛線數目?
    ??for(int i= 1 ; i<curLevel ; i++){//根據級次生成豎虛線數目???
    ???space +="<td width='19' nowrap><img src='../images/g.gif'></td> " ;
    ??}??
    ??List<TreeDemo> liChild = treeBiz.getChlids(treeBiz.getTreeDemoById(id));//定義要取得的直屬下級列表
    ??for(int i=0 ; i<liChild.size() ; i++){
    ???TreeDemo treeNode = liChild.get(i) ;
    ???String imgSrc = "" ;//圖標名稱
    ???if(treeBiz.getChlids(treeNode).size() == 0){//不存在下級菜單
    ????if(i==liChild.size()-1){ //到了最后一個菜單
    ?????imgSrc = "e.gif" ;
    ????}else{
    ?????imgSrc = "l.gif" ;
    ????}????
    ???}else{??????????//存在下級菜單
    ????imgSrc = "c.gif" ;
    ???}
    %>
    ???<div id="node<%=treeNode.getId()%>"? class="treeClass">
    ???<table cellspacing="0" cellpadding="0" align="center" border="0" height="100%" width="100%">
    ????<tr>
    ?????<%=space %>
    ?????<td width='19' nowrap id="varImg<%=treeNode.getId()%>"><img? src="../images/<%=imgSrc%>"/></td>
    ?????<td nowrap>
    ??????<a href="#" onclick="return treeAcion('<%=treeNode.getId()%>',<%=curLevel %>);"><%=treeNode.getItemName()%></a>
    ?????</td>
    ????</tr>
    ???</table>
    ???</div>
    ???<div id="child<%=treeNode.getId()%>" style="display:none;"></div><%???
    ??}
    ??
    ?}catch(Exception e){
    ??out.println("<font color='red'>出錯了:</font>"+e.getMessage());
    ?}
    %>

    ******************************************treeAction.jsp????????? end*********************************

    ?

    總結:寫一個demo因該越簡單越好,特別是實現上用視圖層加數據庫層,這樣看著也清爽些,不用在各個層之間轉來轉去,呵呵。我們還可以在這個樹上增加右鍵功能,這樣可以通過右鍵直接給指定的節點增加下級節點,效果和效率都不錯。另外asp的實現思想也一樣,兩個頁面就行。代碼量70行左右就能實現了。

    posted on 2008-07-31 11:46 李云澤 閱讀(1604) 評論(1)  編輯  收藏 所屬分類: Ajax

    評論

    # re: ajax動態樹的實現(轉) 2009-06-22 16:21 springfeel

    能發我一份工程文件嗎?謝謝springfeel@126.com  回復  更多評論   

    主站蜘蛛池模板: 亚洲色偷偷狠狠综合网| 亚洲视频中文字幕| 亚洲av无码一区二区三区人妖| 18以下岁毛片在免费播放| 亚洲午夜久久久精品影院| 国产成人精品无码免费看| 国内一级一级毛片a免费| 自拍日韩亚洲一区在线| 免费精品久久天干天干| 国产亚洲成AV人片在线观黄桃| 亚洲噜噜噜噜噜影院在线播放| 国产成人精品免费视频动漫| 亚洲人成色77777| 国产一精品一av一免费爽爽| 久久亚洲精品无码| 九九免费观看全部免费视频| 无遮免费网站在线入口| 亚洲中文字幕无码中文字在线| 4hu四虎免费影院www| 亚洲成av人在线视| 国产电影午夜成年免费视频| 77777亚洲午夜久久多喷| 国产女高清在线看免费观看| 一区二区三区免费电影| 亚洲av日韩av无码| 最新仑乱免费视频| 深夜福利在线视频免费| 亚洲国产精品久久久久久| 日本人的色道免费网站| 国产亚洲Av综合人人澡精品| 亚洲综合图色40p| 免费三级毛片电影片| 国产天堂亚洲精品| 亚洲欧洲免费视频| 性xxxx视频播放免费| 中文字幕在线成人免费看| 亚洲AⅤ优女AV综合久久久| 亚洲国产av玩弄放荡人妇| 一个人看www在线高清免费看| 亚洲成在人线中文字幕| 免费国产a国产片高清|