坦白地說,對(duì)于ASP我一直都不怎么感興趣。如果要我寫這種服務(wù)器端程序的話, 我會(huì)選擇JSP。所以,本人一直都想在網(wǎng)上弄個(gè)便宜點(diǎn)的JSP空間;可是正如miles 前輩所說,連貴一點(diǎn)的都沒有,更不用說便宜的了。沒辦法,只好用ASP了, 對(duì)于用ASP寫留言板的主要途徑,只要是地球人就都知道,用得最多的無外乎就 是文件組件與數(shù)據(jù)庫組件;而大多提供ASP的服務(wù)商基于安全都禁用了文件組件, 也有的禁用了數(shù)據(jù)庫組件。當(dāng)然,就算用不了這兩個(gè)組件,也并不代表我們就不 能用腳本來創(chuàng)建文件和修改文件了,我們還有第三種途徑:MSXML組件。
以下是我用MSXML組件寫的一個(gè)留言本程序,主要文件有g(shù)uest.xml、guest.asp、 include.asp、certain.asp,另加一些圖像文件,分別為1.jpg,2.jpg,……圖像 文件放在pic目錄下。這個(gè)腳本在ASP的各版本中均已測試通過,以下是所有的源 代碼與講解,肯請(qǐng)指正。
---------------------------------------------------------------------- ◆1◆ guest.xml 該文件用來保存留言的數(shù)據(jù)文件,相當(dāng)于數(shù)據(jù)庫。 ---------------------------------------------------------------------- <?xml version="1.0" encoding="gb2312"?> <殷亮的留言本> <留言> <昵稱>殷亮</昵稱> <頭像>pic/20.jpg</頭像> <來自>湖北荊門</來自> <時(shí)間>2002-10-17 22:48:01</時(shí)間> <信箱>ask10@msn.com</信箱> <內(nèi)容>這是一個(gè)基于XML的留言本</內(nèi)容> </留言> <留言> <昵稱>黃娟</昵稱> <頭像>pic/7.jpg</頭像> <來自>湖北武漢</來自> <時(shí)間>2002-10-17 22:48:01</時(shí)間> <信箱>fengzhongluwei@hotmail.com</信箱> <內(nèi)容>你好嗎?</內(nèi)容> </留言> </殷亮的留言本> ------------------------------------------------------------------------- 上面的XML文件記錄了兩條留言,可以用任何文本編輯工具編輯,如果沒有語法錯(cuò)誤, 在瀏覽器中輸入該文件名即可顯示XML所獨(dú)有的樹狀頁面。因?yàn)槭俏谋拘问降模? 從創(chuàng)建到修改都比專門的數(shù)據(jù)庫要方便。而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è)字母開頭。
如果文檔與規(guī)則有所沖突,將導(dǎo)制XML文檔在瀏覽器中無法正常顯示,且當(dāng)ASP腳本調(diào) 用該文檔時(shí)也會(huì)出現(xiàn)錯(cuò)誤,所以強(qiáng)烈建議將寫好的XML文件先在瀏覽器中預(yù)覽,沒有 發(fā)現(xiàn)錯(cuò)誤時(shí),再開始編寫ASP腳本。
下面是關(guān)于ASP中讀寫XML文件的相關(guān)語句:(以上面的XML文件為例)
應(yīng)用組件,讀入文件: set guestXml = Server.CreateObject("MSXML.DOMDocument") guestXml.load Server.MapPath("guest.xml")
顯示第一條留言中的“殷亮” <%=guestXml.documentelement.childNodes.item(0).childNodes.item(0).text%> 可以解釋為:XML對(duì)象.XML根標(biāo)簽.子標(biāo)簽集合.第一條.子標(biāo)簽集合.第一條.文本 這樣,通過一級(jí)一級(jí)的訪問,最終定位到了第三級(jí)標(biāo)簽上。 當(dāng)然,我們也可以先用 set root = guestXml.documentelement.childNodes 這樣,當(dāng)我們要顯示“殷亮”的時(shí)候,就可以用: <%=root.item(0).childNodes.item(0).text%>
顯示第二條留言中的“湖北武漢” <%=guestXml.documentelement.childNodes.item(1).childNodes.item(2).text%> 和數(shù)組類似,XML的下標(biāo)也是由0開始。
顯示一個(gè)標(biāo)簽中所有子標(biāo)簽的個(gè)數(shù),如顯示留言總數(shù): <%=guestXml.documentelement.childNodes.length%>
顯示第一條留言中的項(xiàng)目數(shù): <%=guestXml.documentelement.childNodes.item(0).childNodes.length%>
對(duì)文件修改后,保存XML文件,使修改生效: <%guestXml.save%>
在第一條留言中添加一個(gè)子標(biāo)簽“<主題>a test</主題>” <% set titleTag = guestXml.createelement("主題") ''''先創(chuàng)建一個(gè)標(biāo)簽 titleTag.text= "a test" '''''設(shè)定標(biāo)簽中的文本 guestXml.documentelement.childNodes.item(1).appendchild titleTag '''''添加到指定的標(biāo)簽下 guestXml.save %> 當(dāng)你再次打開guest.xml文件時(shí),你會(huì)發(fā)現(xiàn)添加已經(jīng)成功。
MSXML對(duì)象的相關(guān)語法不止這些,但有了這幾個(gè)關(guān)鍵的,已經(jīng)足夠我們寫留言本了。
-------------------------------------------------------------------------- ◆2◆ guest.asp 該文件為留言本的主頁面,包括顯示留言的總數(shù)與總頁數(shù) -------------------------------------------------------------------------- <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <% '使瀏覽器每次都從服務(wù)器載入網(wǎng)頁 Response.Expires = -1 Response.AddHeader "Pragma","no-cache" Response.AddHeader "cache-control","no-store" %> <html> <head> <meta name="GENERATOR" content="Microsoft FrontPage 5.0"> <meta name="ProgId" content="FrontPage.Editor.Document"> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <style type="text/css"> <!-- A:link {text-decoration:none;color:#000000} A:active {TEXT-DECORATION:none;color:#CC33FF} A:visited {TEXT-DECORATION:none;color:#000000} A:hover {TEXT-DECORATION:underline overline;color:#CCCCFF} p, br, body, td, select, input, form, textarea, option{ font-family: 宋體; font-size: 9pt } .input1 { font-size: 9pt; height: 18px; border: 1px #000000 solid; background-color: #CCCCFF} .input2 { font-size: 9pt; height: 16px; border: 1px #000000 solid; background-color: #CCCCFF} --></style> <title>【殷亮的留言本】謹(jǐn)以此留言板獻(xiàn)給WISHES</title> </head> <body bgcolor="#cc33ff"> <center> <table border="1" cellpadding="0" cellspacing="0" style="BORDER-COLLAPSE: collapse" bordercolor="#111111" width="750" id="AutoNumber3" height="45"> <tr> <td width="100%" bgcolor="#9933ff" align="middle" height="21" colspan="2" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋體"> 【 殷 亮 的 留 言 本 】</td> </tr> <% '''''打開數(shù)據(jù)文件test.xml set guestXml = Server.CreateObject("MSXML.DOMDocument") guestXml.load Server.MapPath("guest.xml") set root = guestXml.documentelement.childNodes
num = root.length '''''獲得留言總數(shù) %> <tr> <td width="77%" bgcolor="#9933ff" align="left" height="21" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋體"> <% for i=1 to (num-1)\5+1 '''''因?yàn)槭敲?條留言為1頁,所以總頁數(shù)就是(num-1)\5+1 Response.Write("<a href=include.asp?page="& i &" target=include>") Response.Write(" 第 "&i&" 頁 |") '''''通過此循環(huán)便制定了一個(gè)頁間的導(dǎo)航。 Response.Write("</a>") '''''相當(dāng)于HTML代碼 <a href=include.asp?page=1 target=include>第1頁</a> next %> </td> <td width="23%" bgcolor="#9933ff" align="middle" height="21" style="FONT-SIZE: 9pt; FONT-FAMILY: 宋體"> <A href="piclist.html" target="_blank">頭像列表</A> | <label id=lab1 onclick="window.scroll(0,70)">書寫留言</label></td> </tr> </table> <p><iframe name="include" width="749" height="314" src="include.asp" style="BORDER-RIGHT: #000000 1px double; PADDING-RIGHT: 4px; BORDER-TOP: #000000 1px double; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; BORDER-LEFT: #000000 1px double; PADDING-TOP: 1px; BORDER-BOTTOM: #000000 1px double"> 瀏覽器不支持嵌入式框架,或被配置為不顯示嵌入式框架。</iframe></p> <table border="1" cellpadding="0" cellspacing="0" bgcolor="#9933ff" style="BORDER-COLLAPSE: collapse" bordercolor="#111111" width="750" id="AutoNumber4" height="1"> <form method="POST" action="certain.asp"> <tr> <td width="21" height="1" align="left" style="VERTICAL-ALIGN: middle; LINE-HEIGHT: 150%; LETTER-SPACING: 3pt" rowspan="3">留言贈(zèng)語</td> <td width="96" height="25" align="middle">您的名字:</td> <td width="171" height="25" align="middle"> <INPUT size="20" name="textname" class="input1"> </td> <td width="88" height="25" align="middle">您在何方:</td> <td width="194" height="25" align="middle"> <INPUT size="20" name="textadd" class="input1"> </td> <td width="173" height="25" align="middle" colspan="2"> <INPUT size="20" name="textmail" value="yourmail@" class="input1"> </td> </tr> <tr> <td width="552" height="1" colspan="4" rowspan="2" align="center"> <TEXTAREA style="border-style:double; border-width:3; WIDTH: 523px; HEIGHT: 37px; background-color:#CCCCFF; overflow:hidden" cols="72" rows="1" name="textmsg" class="input1"> </TEXTAREA></td> <td width="10" height="1" rowspan="2" align="center"><img border="0" src="http://www.okasp.com/techinfo/pic/1.jpg" width="40" height="56" id=idface> </td> <td width="159" height="1" align="center"> <SELECT name="list" class="input1" style="WIDTH: 61;height:61" onchange="document.images['idface'].src=options[selectedIndex].value;"> <option value=http://www.okasp.com/techinfo/pic/1.jpg selected>頭像1 <script language=vbscript> for i=2 to 15 '''''循環(huán),用以設(shè)定下拉列表中的另外14個(gè)文件 document.write("<option value=pic/"&i&".jpg>頭像"&i) next </script> </option> </SELECT> <INPUT style="WIDTH: 65px; HEIGHT: 19px" type="button" value="頭像列表" class="input2"> </td> </tr> <tr> <td width="159" height="1" align="center"><INPUT style="WIDTH: 65px; HEIGHT: 19px" type="reset" size="25" value="清空" class="input2"> <INPUT style="WIDTH: 65px; HEIGHT: 19px" type="submit" value="提交" class="input2"></td> </tr> </form> </table> </center>
<% '''''在瀏覽器的狀態(tài)欄中顯示類似"當(dāng)前共有8條留言,分2頁顯示,最近留言的人是陳樹" status = "當(dāng)前共有"& num &"條留言,分"& (num-1)\5+1 &"頁顯示,最近留言的人是"& guestXml.documentelement.lastchild.firstchild.text Response.Write("<script>") Response.Write("window.status="&chr(34)& status &chr(34)) Response.Write("</script>") %>
</body> </html>
------------------------------------------------------------------------------ ◆ 3 ◆ include.asp 該文件嵌入在主頁面中,用來顯示留言。 ------------------------------------------------------------------------------
<% '使瀏覽器每次都從服務(wù)器載入內(nèi)容 Response.Expires = -1 Response.AddHeader "Pragma","no-cache" Response.AddHeader "cache-control","no-store" %>
<html> <head> <meta http-equiv="Content-Language" content="zh-cn"> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>留言贈(zèng)語</title> <style> <!-- p, br, body, td, select, input, form, textarea, option{ font-family: 宋體; font-size: 9pt } table{border-style:double; border-width:3; padding:0; border-collapse: collapse} .input1 { font-size: 9pt; border: 1px #000000 solid; background-color: #CCCCFF}
--> </style> </head>
<body bgcolor="#CC33FF"> <center>
<% '''''打開留言本數(shù)據(jù)文件 set guestXml = Server.CreateObject("MSXML.DOMDocument") guestXml.load(Server.MapPath("guest.xml")) set root = guestXml.documentelement num = root.childNodes.length
page=Request.QueryString("page") if page=Empty then '''''如果沒有參數(shù)傳遞,即http://…/include.asp時(shí)的情況。 thispage = (num-1)\5+1 '''''每頁顯示5條留言,用thispage表示當(dāng)前頁碼,無參數(shù)傳遞時(shí)顯示最后一頁。 if num mod 5 = 0 then msgTotal = 5 '''''變量 msgTotal 表示當(dāng)前頁應(yīng)該顯示的留言數(shù)量 else msgTotal = num mod 5 end if else thispage = page '''''類似于http://…/include.asp?page=1時(shí)的情況 if StrComp(thispage,(num-1)\5+1,1)=0 then msgTotal = num mod 5 else msgTotal = 5 end if end if msgNum = (thisPage-1)*5+msgTotal ''''msgNum表示當(dāng)前頁顯示的留言是總條數(shù)的第N條 ''''因?yàn)槭堑剐蝻@示,所以第一條留言應(yīng)該是(thisPage-1)*5+msgTotal %>
<%for i=1 to msgTotal%> <% set xmlNode = root.childNodes.item(msgNum-1).childNodes ''定位到要讀取的留言 name = xmlNode.item(0).text '''''name變量表示留言人的姓名. pic = xmlNode.item(1).text '''''pic變量表示頭像的地址。 add = xmlNode.item(2).text '''''add變量表示留言人的地址。 thistime = xmlNode.item(3).text '''''this變量表示留言時(shí)間。 ''''不顯示留言人的EMAIL。 msg = xmlNode.item(5).text ''''msg變量表示留言內(nèi)容。 %> <table border="1" cellpadding="0" cellspacing="0" bordercolor="#111111" width="100%" height="106" bgcolor="#FFFFFF"> <tr> <td width="14%" rowspan="3" height="106" align="center"> <img border="0" src=<%=pic%> width="100" height="143"></td> <td width="9%" height="10" align="center" bgcolor="#99CCFF">姓名</td> <td width="31%" height="10" align="center" bgcolor="#CCCCFF"><%=name%></td> <td width="10%" height="10" align="center" bgcolor="#99CCFF">來自</td> <td width="36%" height="10" align="center" bgcolor="#CCCCFF"><%=add%></td> </tr> <tr> <td width="86%" height="83" colspan="4" align="center" bgcolor="#9933FF" style="line-height: 150%; margin-left: 50; margin-right: 50"> <TEXTAREA name="textmsg" class="input1" rows="6" cols="87" readonly><%=msg%></TEXTAREA></td> </tr> <tr> <td width="86%" height="11" colspan="4" align=right bgcolor="#CCCCFF">第<%=thispage%>頁 | 第<%=msgTotal-i+1%>條 | <%=thistime%> |</td> </tr> </table> <br> <% msgNum = msgNum-1 ''''倒序顯示,所以下一條留言的下標(biāo)應(yīng)是當(dāng)前下標(biāo)-1 next ''''循環(huán)。 %> </center> </body> </html>
------------------------------------------------------------------------- ◆ 4 ◆ certain.asp 該文件用于向XML文件中添加記錄,并確認(rèn)留言。 ------------------------------------------------------------------------- <html>
<head> <meta name="GENERATOR" content="Microsoft FrontPage 5.0"> <meta name="ProgId" content="FrontPage.Editor.Document"> <meta http-equiv="Content-Type" content="text/html;
charset=gb2312"> <title>【殷亮的留言本】留言確認(rèn)</title> </head> <script language=vbscript> sub btn1_onclick '''''當(dāng)按下"查看留言"時(shí),將網(wǎng)頁導(dǎo)至留言頁面 window.location="guest.asp" end sub
sub btn2_onclick window.close end sub </script>
<body>
<% '定義一個(gè)函數(shù),用于檢取留言內(nèi)容。 function htmlencode(str) dim result dim l if isNULL(str) then htmlencode="" exit function end if l=len(str) result="" dim i for i = 1 to l select case mid(str,i,1) case "<" result=result+"<" case ">" result=result+">" case else result=result+mid(str,i,1) end select next htmlencode=result end function
set guestXml = Server.CreateObject("MSXML.DOMDocument") guestXml.load(Server.MapPath("guest.xml")) set root = guestXml.documentelement
name = Request.Form("textname") '''''檢取表單的各項(xiàng)提交。 pic = Request.Form("list") add = Request.Form("textadd") email = Request.Form("textmail") thistime = now() msg = Request.Form("textmsg")
set newTag = guestXml.createelement("留言") root.appendchild newTag
set currentTag = root.lastChild
set nameTag = guestXml.createelement("姓名") nameTag.text=htmlencode(name) currentTag.appendchild nameTag
set picTag = guestXml.createelement("頭像") picTag.text=pic currentTag.appendchild picTag
set addTag = guestXml.createelement("來自") addTag.text=htmlencode(add) currentTag.appendchild addTag
set timeTag = guestXml.createelement("時(shí)間") timeTag.text=thistime currentTag.appendchild timeTag
set emailTag = guestXml.createelement("信箱") emailTag.text=htmlencode(email) currentTag.appendchild emailTag
set msgTag = guestXml.createelement("內(nèi)容") msgTag.text=htmlencode(msg) currentTag.appendchild msgTag
guestXml.save(Server.MapPath("guest.xml")) %> <embed width="350" height="200" src="http://www.okasp.com/techinfo/pic/certain.swf" style="position: absolute; left: 214; top: 86">'''''一個(gè)FLASH文件。 <input type="button" value="查看留言" name="btn1" style="position: absolute; left: 282; top: 313; border-style: solid; border-width: 1; background-color: #ABB52F"> <input type="button" value="關(guān)閉此頁" name="btn2" style="position: absolute; left: 414; top: 313; border-style: solid; border-width: 1; background-color: #ABB52F"> </body> </html>
--------------------------------------------------------------------------------- 備注:
由于我們是用XML文件保存數(shù)據(jù),所以在添加數(shù)據(jù)時(shí)的HTML過濾是很重要的。在基于數(shù)據(jù)庫的 留言本中不小心留下一個(gè)HTML標(biāo)簽也許不會(huì)造成什么太大的問題,但在XML中,后果是嚴(yán)重的 隨便的一個(gè)標(biāo)記,甚至隨便的一個(gè)"<"都可以讓你的留言本癱瘓。 如“<姓名>約翰<列濃</姓名>”………………………
上面四個(gè)文件源代碼都已經(jīng)過測試,復(fù)制后便可使用。 如果你想看示例演示,可以點(diǎn)擊后面的鏈接 示例
你也可以從/article/UploadPic/2006-1/200617201115914.rar處 下載所有腳本文件與圖像文件的壓縮包。
旨在探討,如有錯(cuò)漏,歡迎指正與討論。
感謝站長miles這些日子來不倦的幫助,無以回報(bào),唯有灌上此文。
|