以下幾種人不宜看本文: 1. 網(wǎng)站計(jì)數(shù)器還只有兩位數(shù)的。 2. 認(rèn)為減少與數(shù)據(jù)庫(kù)服務(wù)器交互毫無(wú)實(shí)際意義的。 3. 未滿18歲的。
半年前,我沉迷于狄更斯的《遠(yuǎn)大前程》,并從一位非常敬業(yè)的站長(zhǎng)先生那里下載到了 這本經(jīng)典的小說(shuō)的HTML版。之所以稱他敬業(yè),不為別的,單看他為了這本別人最愛(ài)就可 以毫不憐惜地動(dòng)用50個(gè)HTML文件加1個(gè)CSS文件的份上,你也會(huì)佩服他的敬業(yè)的。
現(xiàn)在,也許再不會(huì)有人會(huì)為了一篇49章的小說(shuō)用51個(gè)文件,因?yàn)閿?shù)據(jù)庫(kù)與XML讓我們有了 更多的選擇。到了今天,數(shù)據(jù)庫(kù)已經(jīng)成了網(wǎng)站的靈魂,可以說(shuō),沒(méi)有對(duì)數(shù)據(jù)進(jìn)行集中管理 就算不上是一個(gè)真正的網(wǎng)站。而ASP加數(shù)據(jù)庫(kù),更成了主流中的主流,網(wǎng)站里的用戶登錄, 論壇,留言本都成了它們用武之地,從前用51個(gè)文件才能做成的事,現(xiàn)在用2個(gè)文件就可以 了,但ASP加數(shù)據(jù)庫(kù),卻并非完美,尤其是與服務(wù)器進(jìn)行頻繁的交互方面。
比如按ASP+數(shù)據(jù)庫(kù)的方案,我們完全可以將那位敬業(yè)的站長(zhǎng)的工作簡(jiǎn)化為兩個(gè)文件:一個(gè) 數(shù)據(jù)庫(kù)文件,記錄小說(shuō)的所有章節(jié);另一個(gè)ASP文件,用來(lái)讀取數(shù)據(jù)庫(kù)的內(nèi)容;當(dāng)客戶端 點(diǎn)擊“下一章”的時(shí)候便可以瀏覽下一章內(nèi)容……的確,這看似很直觀方便,但不可乎視 的是,每當(dāng)我們?yōu)g覽下一章的時(shí)候,我們的瀏覽器都會(huì)自動(dòng)自覺(jué)地去訪問(wèn)一次數(shù)據(jù)庫(kù),因 此,當(dāng)有訪問(wèn)者耐心地將這本小說(shuō)讀完的時(shí)候,我們的數(shù)據(jù)庫(kù)已經(jīng)與它親密接觸了49次了。 那如果同時(shí)有N個(gè)49次呢?誰(shuí)還能保證自己的服務(wù)器仍然能從容地應(yīng)付所有請(qǐng)求?特別是一 些提供了搜索數(shù)據(jù),將數(shù)據(jù)分頁(yè)顯示的網(wǎng)站,服務(wù)器不堪重負(fù)的現(xiàn)象更應(yīng)該重視,因?yàn)椴樵? 結(jié)果有N頁(yè),就表示訪問(wèn)者遍覽所有結(jié)果需要連接服務(wù)器打N次。
如果現(xiàn)在你說(shuō)“N次就N次吧,咱無(wú)所謂”,那么你應(yīng)該馬上用鼠標(biāo)點(diǎn)擊瀏覽器的“后退” 因?yàn)槲蚁旅鎸⒄劦揭恍├鴥?nèi)容。當(dāng)然,如果你也想讓你的數(shù)據(jù)庫(kù)程序變成“N頁(yè)記錄, 一次交互”的話,歡迎繼續(xù)看下去,我們將一起探討XML與數(shù)據(jù)庫(kù)的整合運(yùn)用。
其實(shí)XML并不像許多人想的那樣空有名聲,而無(wú)實(shí)際用途。我不知道你是不是也這么想,但 在網(wǎng)上很難見(jiàn)到一些真正應(yīng)用了XML的網(wǎng)站,這是事實(shí)。現(xiàn)在,我列出幾條獨(dú)有XML才能實(shí) 現(xiàn)的案例,希望能夠以此證明XML的實(shí)用與強(qiáng)大:
1. 1個(gè)XML文件 + 1個(gè)普通HTML文件 = 49章小說(shuō)分章顯示 適用于那些不支持ASP的普通主頁(yè)空間,這種情況下XML完全代替了數(shù)據(jù) 庫(kù),很經(jīng)典地實(shí)現(xiàn)了數(shù)據(jù)與排版的分離。XML與HTML完全分工。
2. 1個(gè)XML文件 + 1到N個(gè)ASP文件 = 留言本/論壇 適用于那些禁用了文件組件FileSystemObject與數(shù)據(jù)庫(kù)組件的ASP主頁(yè)空 間,不用文件存取與數(shù)據(jù)庫(kù),用XML照樣可以做留言本與論壇,并實(shí)現(xiàn)數(shù) 據(jù)庫(kù)的所有功能。 (我在本論壇發(fā)表的“第三種途徑-----基于XML的ASP留言板”中,詳細(xì) 地闡述了這一技術(shù),有興趣的話可以在論壇中搜索此文。)
3. 1個(gè)數(shù)據(jù)庫(kù) + 1個(gè)嵌入了XML的ASP文件 = “N頁(yè)記錄,一次交互”
可以說(shuō),這幾種技術(shù)都體現(xiàn)了XML的精髓。特別是第2種技術(shù),XML充分證明了自身的優(yōu)勢(shì)—— 既有數(shù)據(jù)庫(kù)的強(qiáng)大又具備文本文件的輕巧(一個(gè).mdb文件上百K,而一個(gè).xml文件才幾k,而且 數(shù)據(jù)庫(kù)文件修改要借助專門軟件或相對(duì)應(yīng)的ASP程序,但xml文件,記事本足矣。)更讓人興 奮的是,XML完全可以拋開(kāi)文件存取組件與數(shù)據(jù)庫(kù)組件實(shí)現(xiàn)數(shù)據(jù)的寫入讀取,甚至新建文件。 而我們將要談到的“N頁(yè)記錄,一次交互”則更是XML對(duì)數(shù)據(jù)庫(kù)的全面超越。
先看下面這個(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瀏覽器打開(kāi) 這個(gè)文件,如果沒(méi)有語(yǔ)法錯(cuò)誤,即可在瀏覽器中顯示XML所獨(dú)有的樹狀頁(yè)面。 點(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++等程序語(yǔ)言的變量命名規(guī)則相似,區(qū)分大小寫。 3.一個(gè)文檔只能有一個(gè)根元素,如實(shí)例中的“<在線播放>” 4.唯一的關(guān)鍵字“XML”,標(biāo)簽不能以這三個(gè)字母開(kāi)頭。 5.如果文檔與規(guī)則有所沖突,將導(dǎo)制XML文檔在瀏覽器中無(wú)法正常顯示,亦表示非合法的XML 文檔。
OK,我們已經(jīng)知道怎樣寫一個(gè)合法的XML文檔了,下一步我們將開(kāi)始探討將XML文件嵌入到HTML 文件中,并用VBScript腳本語(yǔ)言操作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)記,用來(lái)嵌入一個(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,以便后面的腳本語(yǔ)言訪問(wèn)該XML對(duì)象。
“set xml=xmlFile.recordset” 語(yǔ)句創(chuàng)建了一個(gè)可以訪問(wèn)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)容后,我們完全可以開(kāi)始我們真正的服務(wù)器減負(fù) 行動(dòng)了!
我們的思路是:
1.客戶端向服務(wù)器的某個(gè)ASP程序發(fā)出查詢條件。 2.該ASP程序響應(yīng),并連接數(shù)據(jù)庫(kù)。 3.數(shù)據(jù)庫(kù)將查詢結(jié)果返回給該ASP程序。 4.獲得數(shù)據(jù)后,用ASP程序?qū)?shù)據(jù)格式化為XML格式, 從而將查詢結(jié)果建立為該ASP的內(nèi)嵌式XML對(duì)象。 5.在客戶端實(shí)現(xiàn)XML的分頁(yè)(分頁(yè)方法類似于數(shù)據(jù)庫(kù)分頁(yè)) 6.此后,無(wú)論是客戶端將查詢結(jié)果翻多少頁(yè)看多少遍,均不會(huì)再與服務(wù)器發(fā)生交互。 另外,就算是客戶端斷開(kāi)網(wǎng)線,也仍然可以瀏覽還未瀏覽的分頁(yè)頁(yè)面。
下面是我寫的一個(gè)歌曲在線播放程序頁(yè)面程序,由兩個(gè)文件構(gòu)成: songList.mdb 一個(gè)數(shù)據(jù)庫(kù),裝載著歌曲信息。 songList.asp ASP程序,數(shù)據(jù)庫(kù)中的數(shù)據(jù)格式成XML,頁(yè)面完全顯示后,無(wú)論點(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ù)庫(kù)''''''''''''''''''''''''' 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)來(lái)初始化下拉列表--> <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ò)漏,歡迎指正與討論。 感謝站長(zhǎng)miles這些日子來(lái)不倦的幫助,無(wú)以回報(bào),唯有灌上此文。
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!