明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

用XML結(jié)合數(shù)據(jù)庫,給服務(wù)器減負(fù)。

[摘要]到了今天,數(shù)據(jù)庫已經(jīng)成了網(wǎng)站的靈魂,可以說,沒有對(duì)數(shù)據(jù)進(jìn)行集中管理就算不上是一個(gè)真正的網(wǎng)站。而ASP加數(shù)據(jù)庫,更成了主流中的主流,網(wǎng)站里的用戶登錄,論壇,留言本都成了它們用武之地,從前用51個(gè)文件才...
到了今天,數(shù)據(jù)庫已經(jīng)成了網(wǎng)站的靈魂,可以說,沒有對(duì)數(shù)據(jù)進(jìn)行集中管理
就算不上是一個(gè)真正的網(wǎng)站。而ASP加數(shù)據(jù)庫,更成了主流中的主流,網(wǎng)站里的用戶登錄,
論壇,留言本都成了它們用武之地,從前用51個(gè)文件才能做成的事,現(xiàn)在用2個(gè)文件就可以
了,但ASP加數(shù)據(jù)庫,卻并非完美,尤其是與服務(wù)器進(jìn)行頻繁的交互方面。

比如按ASP+數(shù)據(jù)庫的方案,我們完全可以將那位敬業(yè)的站長的工作簡化為兩個(gè)文件:一個(gè)
數(shù)據(jù)庫文件,記錄小說的所有章節(jié);另一個(gè)ASP文件,用來讀取數(shù)據(jù)庫的內(nèi)容;當(dāng)客戶端
點(diǎn)擊“下一章”的時(shí)候便可以瀏覽下一章內(nèi)容……的確,這看似很直觀方便,但不可乎視
的是,每當(dāng)我們?yōu)g覽下一章的時(shí)候,我們的瀏覽器都會(huì)自動(dòng)自覺地去訪問一次數(shù)據(jù)庫,因
此,當(dāng)有訪問者耐心地將這本小說讀完的時(shí)候,我們的數(shù)據(jù)庫已經(jīng)與它親密接觸了49次了。
那如果同時(shí)有N個(gè)49次呢?誰還能保證自己的服務(wù)器仍然能從容地應(yīng)付所有請(qǐng)求?特別是一
些提供了搜索數(shù)據(jù),將數(shù)據(jù)分頁顯示的網(wǎng)站,服務(wù)器不堪重負(fù)的現(xiàn)象更應(yīng)該重視,因?yàn)椴樵?br>結(jié)果有N頁,就表示訪問者遍覽所有結(jié)果需要連接服務(wù)器打N次。

如果現(xiàn)在你說“N次就N次吧,咱無所謂”,那么你應(yīng)該馬上用鼠標(biāo)點(diǎn)擊瀏覽器的“后退”
因?yàn)槲蚁旅鎸⒄劦揭恍├鴥?nèi)容。當(dāng)然,如果你也想讓你的數(shù)據(jù)庫程序變成“N頁記錄,
一次交互”的話,歡迎繼續(xù)看下去,我們將一起探討XML與數(shù)據(jù)庫的整合運(yùn)用。

其實(shí)XML并不像許多人想的那樣空有名聲,而無實(shí)際用途。我不知道你是不是也這么想,但
在網(wǎng)上很難見到一些真正應(yīng)用了XML的網(wǎng)站,這是事實(shí),F(xiàn)在,我列出幾條獨(dú)有XML才能實(shí)
現(xiàn)的案例,希望能夠以此證明XML的實(shí)用與強(qiáng)大:

1. 1個(gè)XML文件 + 1個(gè)普通HTML文件 = 49章小說分章顯示
適用于那些不支持ASP的普通主頁空間,這種情況下XML完全代替了數(shù)據(jù)
庫,很經(jīng)典地實(shí)現(xiàn)了數(shù)據(jù)與排版的分離。XML與HTML完全分工。

2. 1個(gè)XML文件 + 1到N個(gè)ASP文件 = 留言本/論壇
適用于那些禁用了文件組件FileSystemObject與數(shù)據(jù)庫組件的ASP主頁空
間,不用文件存取與數(shù)據(jù)庫,用XML照樣可以做留言本與論壇,并實(shí)現(xiàn)數(shù)
據(jù)庫的所有功能。
(我在本論壇發(fā)表的“第三種途徑-----基于XML的ASP留言板”中,詳細(xì)
地闡述了這一技術(shù),有興趣的話可以在論壇中搜索此文。)

3. 1個(gè)數(shù)據(jù)庫 + 1個(gè)嵌入了XML的ASP文件 = “N頁記錄,一次交互”

可以說,這幾種技術(shù)都體現(xiàn)了XML的精髓。特別是第2種技術(shù),XML充分證明了自身的優(yōu)勢(shì)——
既有數(shù)據(jù)庫的強(qiáng)大又具備文本文件的輕巧(一個(gè).mdb文件上百K,而一個(gè).xml文件才幾k,而且
數(shù)據(jù)庫文件修改要借助專門軟件或相對(duì)應(yīng)的ASP程序,但xml文件,記事本足矣。)更讓人興
奮的是,XML完全可以拋開文件存取組件與數(shù)據(jù)庫組件實(shí)現(xiàn)數(shù)據(jù)的寫入讀取,甚至新建文件。
而我們將要談到的“N頁記錄,一次交互”則更是XML對(duì)數(shù)據(jù)庫的全面超越。

先看下面這個(gè)XML文件:

<?xml version="1.0" encoding="gb2312"?>
<在線播放>
<歌曲>
<歌名>Hello Goodbye</歌名>
<URL>ftp://61.139.37.148/music/songs01/english/beatles/hellogoodbye.mp3</URL>
<演唱者>The Beatles</演唱者>
<歌詞>You say yes, I say no</歌詞>
</歌曲>
<歌曲>
<歌名>Yesterday</歌名>
<URL>http://www.mayia.com/beatlescom/beatles/mp3/mp3/yesterday.mp3</URL>
<演唱者>The Beatles</演唱者>
<歌詞>Yesterday, all my troubles seemed so far away</歌詞>
</歌曲>
</在線播放>
試試看,用記事本編輯一下這個(gè)文件,并保存文件名為songList.xml,然后用IE瀏覽器打開
這個(gè)文件,如果沒有語法錯(cuò)誤,即可在瀏覽器中顯示XML所獨(dú)有的樹狀頁面。
點(diǎn)擊后面的鏈接查看效果:      XML文件

這就是一個(gè)合法的XML文檔,而XML文檔的規(guī)則與格式也非常自由,如果你要?jiǎng)?chuàng)建一個(gè)新的XML
文件,只需一字不改地照寫第一行“<?xml version="1.0" encoding="gb2312"?>”,而后面
的標(biāo)簽與標(biāo)簽之間的text就可以很隨意,僅僅遵守以下規(guī)則即可:

1.首標(biāo)簽與尾標(biāo)簽必須對(duì)應(yīng),可以重復(fù),但不可以嵌套。
2.標(biāo)簽的命名規(guī)則與JAVA/C/C++等程序語言的變量命名規(guī)則相似,區(qū)分大小寫。
3.一個(gè)文檔只能有一個(gè)根元素,如實(shí)例中的“<在線播放>”
4.唯一的關(guān)鍵字“XML”,標(biāo)簽不能以這三個(gè)字母開頭。
5.如果文檔與規(guī)則有所沖突,將導(dǎo)制XML文檔在瀏覽器中無法正常顯示,亦表示非合法的XML
 文檔。

OK,我們已經(jīng)知道怎樣寫一個(gè)合法的XML文檔了,下一步我們將開始探討將XML文件嵌入到HTML
文件中,并用VBScript腳本語言操作XML文檔中的數(shù)據(jù)。先看下面這個(gè)文件:


<html>
<head>
<title>用XML嵌入HTML</title>
</head>
<body bgcolor="#000000" text="#FFFFFF">

<xml id = "xmlFile">
<在線播放>
<歌曲>
<歌名>Hello Goodbye</歌名>
<URL>ftp://61.139.37.148/music/songs01/english/beatles/hellogoodbye.mp3</URL>
<演唱者>The Beatles</演唱者>
<歌詞>You say yes, I say no</歌詞>
</歌曲>
<歌曲>
<歌名>Yesterday</歌名>
<URL>http://www.mayia.com/beatlescom/beatles/mp3/mp3/yesterday.mp3</URL>
<演唱者>The Beatles</演唱者>
<歌詞>Yesterday, all my troubles seemed so far away</歌詞>
</歌曲>
</在線播放>
</xml>

<script language="VBScript">
set xml=xmlFile.recordset
xml.MoveFirst
document.write "第一條記錄<BR>"
document.write xml("歌名")&"<BR>"
document.write xml("演唱者")&"<BR>"
document.write xml("URL")&"<BR>"
document.write xml("歌詞")&"<BR><br>"
xml.MoveNext
document.write "第二條記錄<BR>"
document.write xml("歌名")&"<BR>"
document.write xml("演唱者")&"<BR>"
document.write xml("URL")&"<BR>"
document.write xml("歌詞")&"<BR>"
</script>
</body>
</html>
點(diǎn)擊后面的鏈接查看實(shí)例:          查看
在這個(gè)HTML文件中,我們加入了一對(duì)<xml></xml>標(biāo)記,用來嵌入一個(gè)內(nèi)部XML文檔。
嵌入在HTML文件中的XML文檔一樣地遵循與獨(dú)立的XML文檔一樣的規(guī)則,只是省去了獨(dú)立
XML文檔的聲明部分“<?xml version="1.0" encoding="gb2312"?>”。在<XML>標(biāo)簽中,
我們?cè)O(shè)置了XML的ID:xmlFile,以便后面的腳本語言訪問該XML對(duì)象。

“set xml=xmlFile.recordset”      語句創(chuàng)建了一個(gè)可以訪問XML的游標(biāo)。這個(gè)游標(biāo)
類似于ASP中的RecordSet對(duì)象,所擁有的方法與后者也幾乎是完全一樣的。如:

當(dāng)我們用set xml=xmlFile.recordset創(chuàng)建了一個(gè)名為xml的數(shù)據(jù)游標(biāo)后,我們就可以使
用以下方法與屬性:

xml.MoveFirst() 移到第一條記錄
xml.MoveNext() 移到下一條
xml.MovePrevious() 移到上一條
xml.MoveLast() 移到最后一條

xml.BOF 表示游標(biāo)在第一條記錄之前
xml.EOF 表示游標(biāo)在最后一條記錄之后
xml.RecordCount 記錄集總數(shù)
xml.AbsolutePosition 游標(biāo)當(dāng)前位置

xml.AddNew() 添加一條記錄
xml.Delete() 刪除一條記錄

例如:我們要顯示某一首歌的歌名,我們只須將游標(biāo)移到該記錄上,再用xml("歌名")
便可獲取XML文檔中<歌名>與</歌名>之間的文本。非常方便。

好了,在了解以上關(guān)于XML的這些內(nèi)容后,我們完全可以開始我們真正的服務(wù)器減負(fù)
行動(dòng)了!

我們的思路是:

1.客戶端向服務(wù)器的某個(gè)ASP程序發(fā)出查詢條件。
2.該ASP程序響應(yīng),并連接數(shù)據(jù)庫。
3.數(shù)據(jù)庫將查詢結(jié)果返回給該ASP程序。
4.獲得數(shù)據(jù)后,用ASP程序?qū)?shù)據(jù)格式化為XML格式,
 從而將查詢結(jié)果建立為該ASP的內(nèi)嵌式XML對(duì)象。
5.在客戶端實(shí)現(xiàn)XML的分頁(分頁方法類似于數(shù)據(jù)庫分頁)
6.此后,無論是客戶端將查詢結(jié)果翻多少頁看多少遍,均不會(huì)再與服務(wù)器發(fā)生交互。
 另外,就算是客戶端斷開網(wǎng)線,也仍然可以瀏覽還未瀏覽的分頁頁面。

下面是我寫的一個(gè)歌曲在線播放程序頁面程序,由兩個(gè)文件構(gòu)成:
songList.mdb 一個(gè)數(shù)據(jù)庫,裝載著歌曲信息。
songList.asp ASP程序,數(shù)據(jù)庫中的數(shù)據(jù)格式成XML,頁面完全顯示后,無論點(diǎn)多少次
“下一首”,也不會(huì)與服務(wù)器交互。

◆songList.asp◆      
點(diǎn)擊后面的鏈接查看實(shí)例            查看

<html>
<head>
<title>殷亮的在線播放</title>
<style type="text/css">
<!--
.input 
{
background-color: #000000;
border: #000000;
color: #FF9900;
}
-->
</style>
</head>

<body bgcolor="#000000" text="#FF9900">
<% ''''''''''''''''''''連接數(shù)據(jù)庫'''''''''''''''''''''''''
set songCon = Server.CreateObject("ADODB.connection")
conPath = Server.MapPath("songList.mdb")
conStr = "DRIVER={Microsoft Access Driver (*.mdb)}; dbq="
songCon.open(conStr & conPath)
set rs = Server.CreateObject("ADODB.Recordset")
rs.open "Select * from songList",songCon,3,3
%>

<!--動(dòng)態(tài)生成內(nèi)嵌式XML文檔,"在線播放"是根標(biāo)記-->
<xml id = "xmlFile">
<在線播放>
<% 
If not rs.eof then
while not rs.eof
%>
<歌曲>
<歌名><%= trim(rs("song_name")) %></歌名>
<URL><%= trim(rs("song_url")) %></URL>
<演唱者><%= trim(rs("songer")) %></演唱者>
<歌詞><%= trim(rs("song_lyrics")) %></歌詞>
</歌曲>
<% 
rs.movenext
wend
End If 
%>
</在線播放>
</xml>
<div id="Layer1" style="position:absolute; width:500px; height:59px; z-index:1; left: 118px; top: 4px;">
 <!--Window Media Player控件--> 
 <OBJECT classid="clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95" width="500" height="43" id="player" style="WIDTH: 500px; HEIGHT: 43px" VIEWASTEXT>
   <PARAM NAME="AudioStream" VALUE="-1">
<PARAM NAME="AutoSize" VALUE="0">
<PARAM NAME="AutoStart" VALUE="-1">
<PARAM NAME="AnimationAtStart" VALUE="-1">
<PARAM NAME="AllowScan" VALUE="-1">
<PARAM NAME="AllowChangeDisplaySize" VALUE="-1">
<PARAM NAME="AutoRewind" VALUE="0">
<PARAM NAME="Balance" VALUE="0">
<PARAM NAME="BaseURL" VALUE="">
<PARAM NAME="BufferingTime" VALUE="5">
<PARAM NAME="CaptioningID" VALUE="">
<PARAM NAME="ClickToPlay" VALUE="-1">
<PARAM NAME="CursorType" VALUE="0">
<PARAM NAME="CurrentPosition" VALUE="-1">
<PARAM NAME="CurrentMarker" VALUE="0">
<PARAM NAME="DefaultFrame" VALUE="">
<PARAM NAME="DisplayBackColor" VALUE="0">
<PARAM NAME="DisplayForeColor" VALUE="16777215">
<PARAM NAME="DisplayMode" VALUE="0">
<PARAM NAME="DisplaySize" VALUE="4">
<PARAM NAME="Enabled" VALUE="-1">
<PARAM NAME="EnableContextMenu" VALUE="-1">
<PARAM NAME="EnablePositionControls" VALUE="-1">
<PARAM NAME="EnableFullScreenControls" VALUE="0">
<PARAM NAME="EnableTracker" VALUE="-1">
<PARAM NAME="Filename" VALUE="">
<PARAM NAME="InvokeURLs" VALUE="-1">
<PARAM NAME="Language" VALUE="-1">
<PARAM NAME="Mute" VALUE="0">
<PARAM NAME="PlayCount" VALUE="1">
<PARAM NAME="PreviewMode" VALUE="0">
<PARAM NAME="Rate" VALUE="1">
<PARAM NAME="SAMILang" VALUE="">
<PARAM NAME="SAMIStyle" VALUE="">
<PARAM NAME="SAMIFileName" VALUE="">
<PARAM NAME="SelectionStart" VALUE="-1">
<PARAM NAME="SelectionEnd" VALUE="-1">
<PARAM NAME="SendOpenStateChangeEvents" VALUE="-1">
<PARAM NAME="SendWarningEvents" VALUE="-1">
<PARAM NAME="SendErrorEvents" VALUE="-1">
<PARAM NAME="SendKeyboardEvents" VALUE="0">
<PARAM NAME="SendMouseClickEvents" VALUE="0">
<PARAM NAME="SendMouseMoveEvents" VALUE="0">
<PARAM NAME="SendPlayStateChangeEvents" VALUE="-1">
<PARAM NAME="ShowCaptioning" VALUE="0">
<PARAM NAME="ShowControls" VALUE="-1">
<PARAM NAME="ShowAudioControls" VALUE="-1">
<PARAM NAME="ShowDisplay" VALUE="0">
<PARAM NAME="ShowGotoBar" VALUE="0">
<PARAM NAME="ShowPositionControls" VALUE="-1">
<PARAM NAME="ShowStatusBar" VALUE="0">
<PARAM NAME="ShowTracker" VALUE="-1">
<PARAM NAME="TransparentAtStart" VALUE="0">
<PARAM NAME="VideoBorderWidth" VALUE="0">
<PARAM NAME="VideoBorderColor" VALUE="0">
<PARAM NAME="VideoBorder3D" VALUE="0">
<PARAM NAME="Volume" VALUE="0">
<PARAM NAME="WindowlessVideo" VALUE="0">
</OBJECT>
</div>


<div id="Layer3" style="position:absolute; width:200px; height:115px; z-index:3; left: 120px; top: 140px;"><img src="http://www.okasp.com/techinfo/P_online.jpg" width="300" height="170"></div>
<div id="Layer4" style="position:absolute; width:191px; height:54px; z-index:4; left: 430px; top: 199px;"> 
 <table width="190" height="52" border="1" align="right" bordercolor="#000000" bgcolor="#FF9900">
   <tr>
     <td height="23" valign="bottom"> 
       <div align="center"></div>
         
       <div align="right">
         <input name="btnPre" type="button" disabled="true" id="btnPre" value="上一首">
       </div></td>
   </tr>
   <tr>
     <td valign="top">
<div align="right"> 
         <input name="btnNext" type="button" id="btnNext" value="下一首">
       </div></td>
   </tr>
 </table>
</div>
<div id="Layer2" style="position:absolute; width:503px; height:58px; z-index:2; left: 120px; top: 67px;"> 
 <table width="501" border="1">
   <tr> 
     <td width="100"><font color="#FFFFFF" size="2">播放內(nèi)置歌曲:</font></td>
     <td width="317">
  <SELECT name="list" size="1" id="list" style="WIDTH: 328px; BACKGROUND-COLOR: darkorange">
 <!--用循環(huán)來初始化下拉列表-->
         <script language="VBScript">
set xml=xmlFile.recordset
xml.MoveFirst
dim num
for num=0 to xml.RecordCount-1
document.write("<OPTION value="&xml("url")&">"&xml("歌名")&"</OPTION>")
xml.MoveNext
next
xml.MoveFirst 
</script>
  </SELECT>
 </td>
     <td width="62"><div align="right">
         <input name="btnLAN" type="button" id="btnLAN" value="播放">
       </div></td>
   </tr>
   <tr> 
     <td><font color="#FFFFFF" size="2" >播放網(wǎng)絡(luò)歌曲:</font></td>
     <td><input name="textURL" type="text" id="textURL" style="WIDTH: 328px; BACKGROUND-COLOR: darkorange;color: #000000;"></td>
     <td><div align="right">
         <input name="btnNET" type="reset" id="btnNET" value="播放">
       </div></td>
   </tr>
 </table>
</div>
<div id="Layer5" style="position:absolute; width:500px; height:20px; z-index:5; left: 120px; top: 320px;"> 
 <p><font color="#FFFFFF" size="2">正在播放: 
   <input name="textSonger" type="text" class="input" id="textSonger" size="15">
   演唱的 
   <input name="textSongName" type="text" class="input" id="textSongName" size="35">
   </font></p>
</div>
<div id="Layer6" style="position:absolute; width:500px; height:150px; 
z-index:6; left: 120px; top: 349px;">
 <textarea name="area" cols="68" rows="15" id="area" 
  style="BORDER-RIGHT: white double; BORDER-TOP: white double; 
BORDER-LEFT: white double;COLOR: #000000; DIRECTION: ltr; 
BORDER-BOTTOM: white double;BACKGROUND-COLOR: darkorange; 
TEXT-ALIGN: left">
 </textarea>
</div>

<!--各按鈕的單擊事件-->
<script language="VBScript">
sub play()
textSonger.value=xml("演唱者")
textSongName.value=xml("歌名")
textURL.value=""
area.value=xml("歌詞")
player.filename=xml("URL")

if xml.AbsolutePosition=xml.recordcount then
btnNext.disabled=true
else
btnNext.disabled=false
end if

if xml.AbsolutePosition=1 then
btnPre.disabled=true
else
btnPre.disabled=false
end if
end sub

sub btnLAN_onclick
xml.MoveFirst
while xml("URL")<>list.value
xml.MoveNext
wend
call play()
end sub

sub btnNET_onclick
player.filename = textURL.value
textSonger.value = ""
textSongName.value = ""
area.value = "自定義網(wǎng)絡(luò)歌曲"
end sub

sub btnPre_onclick
xml.MovePrevious
list.selectedIndex = list.selectedIndex - 1
call play()
end sub

sub btnNext_onclick
xml.MoveNext
list.selectedIndex = list.selectedIndex + 1
call play()
end sub
</script>
</body>
</html>
現(xiàn)在,你知道怎么給服務(wù)器減負(fù)了嗎?^-^

本文旨在探討,如有錯(cuò)漏,歡迎指正與討論。
感謝站長miles這些日子來不倦的幫助,無以回報(bào),唯有灌上此文。