ASP做象資源管理員的樹形目錄

來源:互聯網
上載者:User
 一、讀者指引

  讀者指引協助你掌握本文的梗概。以免你看了大半才明白這編文章不適合你,給你造成視覺汙染。

  如果你正在用ASP+XML寫一些程式,或者你正在學XML那就值得一看。

  閱讀本文須具備的知識,對ASP有基本的瞭解,對XML和DOM有基本瞭解,如果你不瞭解那麼你通過學習本文基本上能夠撐握ASP+XML和DOM的應用,並能根據本文範寫出自已更進階的ASP+XML程式。

  二、基本思想

  本文思想是基於用ASP和DOM來讀取和儲存XML資料,並利用XML資料來儲存留言資訊,達到同用資料庫儲存資料的功能。

  三、XML留言本的優勢

  或許你會問用ASP+TXT文本也可以達到不用資料庫實上留言的功能,不錯確實能夠做到,而且網上也有很多這樣的留言本免費下載,但這裡我要講一下ASP+XML的優越性。

  1、XML+ASP比ASP+TXT速度要快。可能你也發現當TXT檔案很少時速度出奇的快,但是隨著留言資訊的增加TXT文本變大,速度卻又是出奇的慢這就是ASP+TXT的弱點。當然我不能說ASP+XML就一定是出奇的快,但是比起ASP+TXT來說是快了許多,當然隨著留言資訊的增加XML文本增大速度也下降很快,但是比起TXT來說就還是好了許多(這一點可以從WAS測試證明讀者可以自行測試),當然ASP+XML比不上資料庫,因為資料庫對查詢做了特別的最佳化,而XML只是純文字,在ASP建立對像是要把XML資料全部讀入記憶體中,如果資料量大的話可想而知速度會慢下來。

  那你也許會問那我什麼時候用關聯式資料庫儲存資料,又什麼時候用XML儲存資料呢?我這裡也順便提一下,就是當資料比較複雜無規率時用XML資料比較合適,還有就是你打算這些資料要在不同的作業系統上讀取運用時那就是XML大顯身手的時候了。如果你是普通的資料那麼不到關鍵時刻或不支援資料庫的空間時還是不要用XML檔案來儲存資料為好。

  2、XML資料的易讀取性,TXT文本是比較難操作的,我們必須一行一行的讀取判斷,而且很多功能無法實上,只能編製比較簡單的留言本,而XML資料則不同了,利用DOM可以輕易的訪問每一個節點,而不是TXT那些煩人的Readline() Witeline()了,我們可以隨意的加入刪除更新某一個我們感興趣的節點,利用ASP或者JS或者資料島都可以輕鬆實上這一點,當然我這裡為發考慮相容性,用了ASP來讀取XML資料,而沒有用資料島來讀取節點資料(因為只有IE5以上版本才支援資料島技術)而用ASP來實上就不存在這些問了因為客戶得到的是HTML檔案。

  3、XML資料誇作業系統性,只要我們把這些資料存放區為XML那麼這些資料就能被應何基它語言或系統所識別,而不用做應何改動。TXT顯然不具備這些效能。例如我們在網上的留言資訊可以直接被被轉換成wap格式在手機上顯示。

  四、建立儲存留言資訊的XML檔案(List.xml)

  我們這裡不打算使用DTD,因為我們這是我們自已編製並測試通過的XML資料,所以不需要DTD來驗證(如果你對此感興趣當然可以加一個這不影響程式的運行)。現在我們來看看建立一個留言本的基本要素

  0、留言ID號--定義為<id>

  1、使用者名稱我們--定義為<username>

  2、來自那裡們--定義為<fromwhere>

  3、留言時間定--義為<Posttime>

  4、使用者首頁定--義為<homepage>

  5、使用者的信箱--定義為<email>

  6、留言內容定--義為<text>

  當然以上不是必須的讀者可以自行命名並加減相關標籤,把它們組合起來就得到List.xml的檔案了


   <?xml version="1.0" encoding="gb2312"?>
  <site>
  <NewList>
  <list>
  <id>1</id>
  <username>苛子</username>
  <fromwhere>中國廣州</fromwhere>
  <Posttime>01-4-23 18:26:56</Posttime>
  <homepage>http://page2000.xiloo.com</homepage>
  <email>lucaihui@cmmail.com</email>
  <text>這是我的第一個XML檔案</text>
  </list>
  </NewList>
  </site>
 


  注意:必須加上encoding="gb2312"否則會報錯為非法字元,因為XML預設不支援中文。<site>為根節點<NewList><ist>等為子節點。對這個檔案的意思我就不多說了大家也應該看的明白了。接下來就是我們如何來顯示它了。

  五、建立顯示XML資料的ASP檔案(index.asp)
  這個檔案要實現的功能就是讀取並顯示XML資料,首先建立一個XML對像然後把XML讀入記憶體中,利用DOM分離出我們所要的資料。


   <%
  strSourceFile = Server.MapPath("/") & "\List.xml"
  '擷取XML檔案的路徑這雷根據你的虛擬目錄不同而不同
  Set objXML = Server.CreateObject("Microsoft.FreeThreadedXMLDOM")
  '以自由線程建立一個XML對像
  objXML.load(strSourceFile)'把XML檔案讀入記憶體
  Set objRootsite = objXML.documentElement.selectSingleNode("NewList")
  '選取NewList節點
  %>
  <html>
  <head>
  <title>留言本</title>
  <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  <style type="text/css">
  <!--
  td { font-family: "宋體"; font-size: 9pt; text-decoration: none}
  a { font-family: "宋體"; font-size: 9pt; color: #0066CC; text-decoration: none}
  a:hover { color: #FF6600; text-decoration: underline}
  -->
  </style>
  </head><body bgcolor="#0099CC" text="#000000">
  <table width="80%" border="0" cellspacing="1" cellpadding="4" align="center" bgcolor="#CCCCCC">
  <tr bgcolor="#000000">
  <td colspan="2"><font color="#FFFFFF">留言溥 <a href="PostNew.asp"><font color=#FFFFFF>寫新留言
  </font></a></font></td>
  </tr>
  <%
  PageSize =10'假設每頁顯示10條留言
  AllNodesNum =objRootsite.childNodes.length-1
  '擷取子節點資料(因為是從節點數從0開始的所最大子節點數要減1)
  PageNum=AllNodesNum\PageSize+1'算出總頁數
  PageNo=request.querystring("PageNo")
  if PageNo="" then'如果是每一次獲得頁面則定位到每一頁顯示最新的留言
  PageNo=PageNum
 
樹形目錄顯示程式

  問題描述:

  在我們項目中常常會出現自關聯的資料表,如果我們從整體看去,整個表就呈現為一個樹形資料結構(對於複雜的情況,它可能變成一個圖)。當我們對這個表進行顯示,編輯時,如果不採用好的表現形式,會顯得很笨拙,為此,我們開發這樣的樹形結構的程式。在上一版本中,我們使用的是遞迴演算法來實現,在我們對這個演算法評測時發現,對於擁有成千上萬條記錄的資料庫就不再能勝任了,所以在新的演算法版本中,我們使用了XML技術,動態探索資料,以解決一次從伺服器下在大量資料的尷尬,同時也遍免了如果表資料結構呈現為圖時就會進入死迴圈的錯誤。

  實際思路:

  1、 初始顯示時只顯示根與二級節點,根與二級節點同在一層次
  2、 點擊一節點,如果它的子節點地區對象不存在,則建立對象,同時下載資料更新資料,顯示所有子節點。
  3、 每個節點在建立後都就有相同的功能,如檢查子節點是否存在,顯示隱藏子節點等等
  4、 DHTML+XML+ASP+CSS同時使用

  技術痛點:

  1、 使用xmlhttp介面時亂碼問題:
  因為在asp輸出頁面中,預設的編碼方案並不是中文的,那麼在用戶端頁面的xmlhttp中解釋時,就會以預設的方案解析,所以就會出現亂碼。為此,我們在Server端的asp頁面中,加入如下代碼定義編碼方案:

   Response.CharSet="GB2312"
  Response.ContentType="text/html"


  2、 如何在介面上保持上一版本的風格(類資源管理員形式):
  在上一版本中,所有的頁面內容都是一氣呵成的,在控制上採用遞迴等思想,所有時的介面相對友好,當時本版中的機制發生了變化,內容是有多次合成的關鍵問題,img ,span 對象的id 如何確定經過求證,在介面上,本版本的介面難以與第一介面相同,所以只能保留一部分,但是總體來說,新介面同樣也能滿足需要

  因為在這裡不好使用附件,所以只能貼源碼了:


   ---xtree.html------

  <HTML>
  <HEAD>
  <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
  <SCRIPT LANGUAGE=javascript src="xtree.js">
  </SCRIPT>
  <style type="text/css">
  <!--
  a:link { font-size: 14px; text-decoration: none; color: #0000FF}
  a:visited { font-size: 14px; color: #0000FF; text-decoration: none}
  a:hover { font-size: 14px; color: #FF0000; background-color: #CCCC99; text-decoration: none}
  a:active { font-size: 14px; color: #FFFFFF; background-color: #191970; text-decoration: none}
  .item{ font-size:14px}
  -->
   </style>
  </HEAD>
  <BODY leftMargin=0 rightMargin=0 topMargin=0 border=0>
  <bold>樹形菜單示範程式</bold><br>
  <table border=0>
  <tr><td nowrap>
  <span id='oSpanroot' border=0></span><SCRIPT LANGUAGE=javascript>createChildNode("root",0);</SCRIPT></td></tr>
  </table>
  </BODY>
  </HTML>

  -------xtree.asp------------

  <%@ Language=VBScript %>
  <%
  Response.CharSet="GB2312"
  Response.ContentType="text/html"
  '''''''''''''''''''''''''''''''Server code start'''''''''''''''''''''''''''''''
  dim parId,nodeLayer
  parid=Request.QueryString("parId")
  nodeLayer=cint(Request.QueryString("nodeLayer"))

  if(parid="") then
  Response.Write("root id can't is null")
  Response.End()
  end if
  if(nodeLayer<0) then
  nodeLayer=0

  end if
  %>
  <%
  strconn="at"
  strsql="select * from tree where par='"&parid&"'"
 

  ''SQL 陳述式書寫要求:在記錄集的前面三個欄位必須依次為:row_id(惟一的主鍵)、name(菜單條顯示的內容)、par_id(父節點row_id),其它根據需要輸出與顯示

   set conn=server.createobject("ADODB.connection")
  conn.open strconn

  set rs=server.createobject("ADODB.Recordset")
  rs.open strsql,conn,3,3
 




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.