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

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

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

    iNeo

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      30 Posts :: 8 Stories :: 2 Comments :: 0 Trackbacks
    2.3 業(yè)務(wù)邏輯層設(shè)計

      2.3.1 動態(tài)加載技術(shù)

      如果一次性獲取完整的先序樹,構(gòu)造成xml提供給JavaScript解析,數(shù)據(jù)量越大,消耗的資源越多,客戶端響應(yīng)延遲時間就越長,因此對于大數(shù)據(jù)量的樹,采用動態(tài)加載方式,即每次單擊“+”圖片時,判斷是否已加載子節(jié)點數(shù)據(jù),如果未加載則通過Ajax的XMLHTTP組件XMLHTTPRequest對象異步發(fā)送請求,連接服務(wù)器執(zhí)行SQL 語句“select * from tree_class where parent = ?order by classcode ”獲取節(jié)點數(shù)據(jù)。相關(guān)JavaScript 代碼如下:

    /*判斷是否已經(jīng)加載數(shù)據(jù),未加載則訪問服務(wù)器加載數(shù)據(jù)*/

    dhtmlTree.prototype.Loading=function(pObject){
     if(((pObject.XMLload==0)&&(this.XMLsource))&&(!this.XMLloading)){
      pObject.XMLload=1;
      this.loadXML(this.XMLsource+getUrlSymbol(this.XMLsource)+"id="+escape(pObject.id));
     }
    }
    dtmlXMLObject.prototype.loadXML=function(url){//加載數(shù)據(jù)
     try {
      this.xmlDoc = new XMLHttpRequest();
      /*通過GET方法異步連接到 url 加載數(shù)據(jù)*/
      this.xmlDoc.open("GET", url,true);//true:異步;false:同步
      this.xmlDoc.send(null);
     } catch(e){
      this.xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");//使用IE
      this.xmlDoc.open("GET", url,true);//true:異步;false:同步
      this.xmlDoc.send(null);
     }
     return this.xmlDoc.responseXML;
    }

      每次只取同一個父節(jié)點ParentId的子節(jié)點序列,按XML格式封裝成樹的文檔結(jié)構(gòu),例如:

    <tree id="0">
    <leaf child=”1" name="國防科技大學(xué)" id="1" im0="leaf.gif" im1="folderOpen.gif" im2=" folderClosed.gif"/>
    </tree>

      提供給JavaScript的dhtmlTreeObject.prototype.insertItem()解析并組織好html輸出節(jié)點;其中 child:1表示有子節(jié)點,0表示沒有子節(jié)點;im0表示沒有子節(jié)點時的圖標;im1表示有子節(jié)點并且打開節(jié)點時的圖標;im2表示有子節(jié)點并且關(guān)閉時的圖標;所以還可以在構(gòu)造XML時自定義圖標。

      2.3.2 樹型結(jié)構(gòu)的構(gòu)造

      從數(shù)據(jù)庫中返回的是有序的先序樹,而XML是完整的樹型結(jié)構(gòu)文檔,所以將樹型數(shù)據(jù)構(gòu)造成預(yù)定義的XML格式,只需從根節(jié)點開始,遍歷一遍樹,即可將樹全部生成。相關(guān)JavaScript代碼如下:

    /*動態(tài)加載樹的構(gòu)造方法*/

    dtmlXMLObject.prototype.constructTree=function(){

    //采用動態(tài)加載時獲取的xml數(shù)據(jù),解析樹型數(shù)據(jù)

    var node=this.XMLLoader.getXMLTopNode("tree");

    var parentId=node.getAttribute("id");

    for(var i=0;i<node.childNodes.length;i++) { //逐個解析xml文件的leaf節(jié)點

     if((node.childNodes[i].nodeType==1)&&(node.childNodes[i].tagName == "leaf")){
      var name=node.childNodes[i].getAttribute("text");
      …………
      var temp=dhtmlObject.a0Find(parentId);//獲取父節(jié)點對象
      temp.XMLload=1;//已加載
      //構(gòu)造html輸出節(jié)點
      dhtmlObject.insertItem(parentId,cId,name,im0,im1,im2,chd);
      dhtmlObject.addDragger = this;//設(shè)置可拖放的對象
     };
    }

      2.3.3 樹型結(jié)構(gòu)的維護

      在維護樹型結(jié)構(gòu)表時,刪除節(jié)點較為簡單,SQL 語句為: "delete from tree_class where classcode like′"+ classcode +"%′",即可將其節(jié)點和孩子一并刪除;增加節(jié)點時,分為前插、后插、和插入子節(jié)點三種情況,前兩種情況需要更新遞歸更新類別代碼,后者只需找到父節(jié)點的孩子的最大類別代碼加1 后,作為增加節(jié)點的類別代碼;通過拖放來改變樹的結(jié)構(gòu)時,只需將拖動節(jié)點的parentId更新為目標節(jié)點的Classid即可,對應(yīng)的SQL語句為:"update tree_class set parentId = "+ classidTo+" where classid = "+ classidFrom。

      3、效率分析

      對于樹的存儲一般有兩種形式:二維表和鏈表,遍歷方式一般也有深度遍歷和廣度遍歷兩種方式,遍歷的時間復(fù)雜度都是O( n )。用二維表存儲時,在內(nèi)存中用數(shù)組的下標能準確定位節(jié)點的父節(jié)點、兄弟節(jié)點所在的數(shù)組下標。數(shù)據(jù)庫中節(jié)點的定位也是準確的,但是將節(jié)點信息從數(shù)據(jù)庫中讀到內(nèi)存中時,如果無法通過內(nèi)存數(shù)組下標定位節(jié)點信息,那么就必須遍歷一遍尋找一個節(jié)點,n 個節(jié)點中尋找一個節(jié)點的時間是O(n/2),n 個節(jié)點排序的時間復(fù)雜度將是O( n 2/2),這也是一般實現(xiàn)的B/S 模式的樹結(jié)構(gòu)效率低下的原因。本方案采用字典序編號方案,使得從數(shù)據(jù)庫中取得的樹是已經(jīng)排序的,直接遍歷生成客戶頁面程序,時間復(fù)雜度為O( n )。

      4、結(jié) 論

      本文討論了基于Ajax的動態(tài)樹型結(jié)構(gòu)的實現(xiàn)方案,支持無刷新動態(tài)維護樹的節(jié)點信息,支持拖放節(jié)點改變樹的節(jié)點結(jié)構(gòu)以及次序;同時采用數(shù)據(jù)庫存儲節(jié)點信息,保證了該方案有一定的通用性,此外結(jié)合XML描述樹的節(jié)點信息,使得任何按本方案預(yù)定的xml文檔描述的信息都可以通過樹來展現(xiàn)。本方案已經(jīng)應(yīng)用在我校的數(shù)字迎新系統(tǒng)以及老百姓大藥房信息系統(tǒng)中。

    posted on 2005-12-30 08:32 只牽這只狗 閱讀(393) 評論(0)  編輯  收藏 所屬分類: Ajax
    主站蜘蛛池模板: 久久精品国产亚洲AV麻豆不卡| 国产一级淫片a视频免费观看| 中文字幕久精品免费视频| 男人进去女人爽免费视频国产| 99re视频精品全部免费| 成人片黄网站A毛片免费| 亚洲第一区精品日韩在线播放| 久久精品国产亚洲一区二区| 亚洲人片在线观看天堂无码| 成人免费视频一区二区| 2019中文字幕免费电影在线播放| 日韩一品在线播放视频一品免费| 亚洲日韩精品无码专区网址| 亚洲高清视频在线| 中文字幕无码免费久久| 亚洲天堂男人天堂| h视频在线观看免费| 青春禁区视频在线观看直播免费| 亚洲性色高清完整版在线观看| 成人午夜影视全部免费看| 亚洲天堂中文字幕在线| 久久久国产亚洲精品| 国产午夜免费秋霞影院| www免费插插视频| 免费日本黄色网址| 国产在线观a免费观看| 免费精品一区二区三区在线观看 | 亚洲Av熟妇高潮30p| 免费一级毛suv好看的国产网站| 2022久久国产精品免费热麻豆| 激情内射亚洲一区二区三区爱妻| 久久国产精品免费看| 亚洲国产91在线| 国产91色综合久久免费| 亚洲AV日韩精品久久久久久久| 无码精品A∨在线观看免费| 亚洲AV成人无码久久精品老人| 曰批视频免费30分钟成人| 香蕉97碰碰视频免费| 在线观看成人免费视频| 国产成人精品日本亚洲网址|