|
一.概述: 留言簿是網(wǎng)站的一個(gè)重要組成部分,是訪問者發(fā)表意見的場所,也是網(wǎng)站管理員了解網(wǎng)站基本運(yùn)行情況的有力工具,所以留言簿在現(xiàn)在的網(wǎng)站中扮演了十分重要的角色。 不過在以前開發(fā)一個(gè)留言簿并不是一件容易的事,開發(fā)者的工作量往往會很大。而現(xiàn)在隨著微軟推出VS.NET,相應(yīng)的技術(shù)也推陳出新。特別是XML技術(shù)在.NET Framework中的廣泛運(yùn)用,使得整個(gè).NET構(gòu)架具有十分優(yōu)越的基礎(chǔ)。而ASP.NET中推出的嶄新的編程模型更使得開發(fā)Web應(yīng)用程序變得非常容易。本文就結(jié)合ASP.NET技術(shù)和XML技術(shù)的優(yōu)點(diǎn)向大家介紹如何打造一個(gè)屬于自己的留言簿。 二.實(shí)現(xiàn)方法: 一個(gè)基本的留言簿應(yīng)至少包括兩個(gè)功能:接受用戶輸入的信息并保存該信息到后臺數(shù)據(jù)庫;顯示用戶輸入的信息。用戶輸入的信息一般包括用戶名、Email地址、QQ號碼、用戶主頁、留言信息等,這些信息通常是保存在后臺數(shù)據(jù)庫的某個(gè)表中的,不過本文要運(yùn)用一個(gè)XML文件來存儲這些信息。顯示用戶輸入的信息時(shí)一般得把所有的信息都顯示出來,這里的方法就是從XML文件中讀取數(shù)據(jù)并運(yùn)用XSLT技術(shù)對其進(jìn)行格式轉(zhuǎn)換,最后以HTML的形式顯示在瀏覽器中。 這樣,我們的留言簿就需要兩個(gè)Web頁面,一個(gè)用于接受用戶的輸入信息,另一個(gè)用于顯示用戶已經(jīng)輸入過的信息。而存儲信息的XML文件(guestbook.xml)則需具有如下的結(jié)構(gòu): <?xml version="1.0" encoding="GB2312"?> <guestbook> <guest> <name>令狐沖</name> <email>doose@etang.com</email> <qq>10102350</qq> <homepage>www.doose.com</homepage> <comment>本留言簿由"令狐沖"創(chuàng)建,希望你能喜歡哦:)要知道如何創(chuàng)建一個(gè)屬于自己的留言簿,那么就請仔細(xì)閱讀《運(yùn)用ASP.NET和XML技術(shù)打造留言簿》一文!</comment> </guest> </guestbook> 下面我們先來創(chuàng)建用于接受用戶輸入信息的Web頁面-GuestBook.aspx。根據(jù)前面所提的基本要求,該Web頁面包括了以下幾個(gè)部分:留言簿標(biāo)題、"用戶名:"標(biāo)簽及輸入框、"Email地址:"標(biāo)簽及輸入框、"QQ號碼:"標(biāo)簽及輸入框、"個(gè)人主頁:"標(biāo)簽及輸入框、"留言信息:"標(biāo)簽及輸入框、一個(gè)"確定"按鈕、一個(gè)"重置"按鈕、一個(gè)"查看留言簿"按鈕,同時(shí)該頁面還包括了兩個(gè)驗(yàn)證按鈕,分別用于驗(yàn)證用戶名以及Email地址是否為空,若為空,則提醒用戶輸入。同時(shí),為使留言簿具有良好的用戶界面,我運(yùn)用了表格進(jìn)行頁面布置,這樣留言簿中的各個(gè)成分就能有條有理,層次分明了。有關(guān)該Web頁面的詳細(xì)代碼請參考文后附帶的源代碼,這里就不給出了。頁面布置的圖示如下:
 圖1 完成了該Web頁面的布置,我們僅僅是完成了一部分的工作,到此為止我們并沒有進(jìn)行過真正的編碼。我想大家對ASP.NET中的代碼后置技術(shù)肯定是了解或熟悉的,它將Web頁面的布置工作和后端的編碼工作區(qū)分開來,達(dá)到了良好的分離效果。下面我們就為該Web頁面中的三個(gè)按鈕分別編寫消息相應(yīng)函數(shù): private void btnOK_Click(object sender, System.EventArgs e) { SaveXMLData(); name.Text = "; email.Text = "; qq.Text = "; homepage.Text = "; comment.Text = "; } private void btnReset_Click(object sender, System.EventArgs e) { name.Text = "; email.Text = "; qq.Text = "; homepage.Text = "; comment.Text = "; } private void btnView_Click(object sender, System.EventArgs e) { // 顯示所有用戶的留言信息 Response.Redirect( "ViewGuestBook.aspx" ); } 其中,第一個(gè)按鈕是最重要的,它能將用戶的輸入信息存儲到XML文件中,調(diào)用的方法就是SaveXMLData();而第二個(gè)按鈕僅僅完成文本框的重置清空工作;第三個(gè)按鈕的作用是運(yùn)用另一個(gè)Web頁面顯示所有的用戶輸入信息。同時(shí),第一個(gè)按鈕在成功保存信息后也會將瀏覽器導(dǎo)向到顯示所有用戶輸入信息的頁面。 下面我們來詳細(xì)分析一下SaveXMLData()方法,其實(shí)現(xiàn)如下: private void SaveXMLData() { try { // 創(chuàng)建一個(gè)XmlDocument對象,用于載入存儲信息的XML文件 XmlDocument xdoc = new XmlDocument(); xdoc.Load( Server.MapPath( "guestbook.xml" )); // 創(chuàng)建一個(gè)新的guest節(jié)點(diǎn)并將它添加到根節(jié)點(diǎn)下 XmlElement parentNode = xdoc.CreateElement( "guest" ); xdoc.DocumentElement.PrependChild( parentNode ); // 創(chuàng)建所有用于存儲信息的節(jié)點(diǎn) XmlElement nameNode = xdoc.CreateElement( "name" ); XmlElement emailNode = xdoc.CreateElement( "email" ); XmlElement qqNode = xdoc.CreateElement( "qq" ); XmlElement homepageNode = xdoc.CreateElement( "homepage" ); XmlElement commentNode = xdoc.CreateElement( "comment" ); // 獲取文本信息 XmlText nameText = xdoc.CreateTextNode( name.Text ); XmlText emailText = xdoc.CreateTextNode( email.Text ); XmlText qqText = xdoc.CreateTextNode( qq.Text ); XmlText homepageText = xdoc.CreateTextNode( homepage.Text ); XmlText commentText = xdoc.CreateTextNode( comment.Text ); // 將上面創(chuàng)建的各個(gè)存儲信息的節(jié)點(diǎn)添加到guest節(jié)點(diǎn)下但并不包含最終的值 parentNode.AppendChild( nameNode ); parentNode.AppendChild( emailNode ); parentNode.AppendChild( qqNode ); parentNode.AppendChild( homepageNode ); parentNode.AppendChild( commentNode ); // 將上面獲取的文本信息添加到與之相對應(yīng)的節(jié)點(diǎn)中 nameNode.AppendChild( nameText ); emailNode.AppendChild( emailText ); qqNode.AppendChild( qqText ); homepageNode.AppendChild( homepageText ); commentNode.AppendChild( commentText ); // 保存存儲信息的XML文件 xdoc.Save( Server.MapPath( "guestbook.xml" )); // 顯示所有用戶的留言信息 Response.Redirect( "ViewGuestBook.aspx" ); } catch( Exception e ) {} } 該方法主要運(yùn)用了XmlDocument類、XmlElement類以及XmlText類等,這些類都是包含在System.Xml命名空間中的,所以請?jiān)诖a文件的開頭處添加using System.Xml的語句。該方法運(yùn)用了一個(gè)try-catch語句塊,在try部分首先通過創(chuàng)建一個(gè)XmlDocument對象來載入XML文件,然后創(chuàng)建根節(jié)點(diǎn)的兒子-guest節(jié)點(diǎn)并在guest節(jié)點(diǎn)下添加存儲信息所必須的五個(gè)子節(jié)點(diǎn)。所有這些子節(jié)點(diǎn)都是XmlElement對象,它們是通過XmlDocument對象的CreateElement()方法來獲取的。同時(shí),XmlDocument對象還通過CreateTextNode()方法來獲取文本信息并在后面將其添加到相對應(yīng)的節(jié)點(diǎn)中。在合理的添加guest節(jié)點(diǎn)及其子節(jié)點(diǎn)以及文本信息后,XmlDocument對象通過Save()方法將用戶輸入的信息保存到XML文件中。最后,瀏覽器會導(dǎo)向到顯示所有用戶輸入信息的頁面。這樣,該Web頁面運(yùn)行的效果如圖2所示:
 圖2 下面我們來創(chuàng)建用于顯示所有用戶輸入信息的頁面-ViewGuestBook.aspx。在該Web頁面中,我們要運(yùn)用到XSLT技術(shù),它能將前面創(chuàng)建的XML文件中的數(shù)據(jù)以HTML的形式顯示出來。由于是運(yùn)用XSLT技術(shù)顯示用戶輸入信息的,所以在設(shè)計(jì)該Web頁面時(shí)我們無需添加任何Web控件,只要重載該Web頁面的Load()方法即可。 private void Page_Load(object sender, System.EventArgs e) { // 創(chuàng)建一個(gè)XmlDocument對象以載入存儲信息的XML文件 XmlDocument xdoc = new XmlDocument(); xdoc.Load( Server.MapPath( "guestbook.xml" )); // 創(chuàng)建一個(gè)XslTransform對象并導(dǎo)入XSL文件 XslTransform xslt = new XslTransform(); xslt.Load( Server.MapPath( "guestbook.xsl" )); string xmlQuery = "http://guestbook"; XmlNodeList nodeList = xdoc.DocumentElement.SelectNodes( xmlQuery ); MemoryStream ms = new MemoryStream(); xslt.Transform( xdoc, null, ms ); ms.Seek( 0, SeekOrigin.Begin ); StreamReader sr = new StreamReader( ms ); // 顯示輸出結(jié)果 Response.Write( sr.ReadToEnd() ); } 該方法首先創(chuàng)建一個(gè)XmlDocument對象用于載入前面創(chuàng)建的XML數(shù)據(jù)文件,之后創(chuàng)建一個(gè)XslTransform對象并導(dǎo)入相應(yīng)的XSL文件。通過該XSL文件中的內(nèi)容它能將原來的XML文件中的數(shù)據(jù)格式化為HTML的形式并顯示在瀏覽器中。因?yàn)槠渲羞\(yùn)用到了XSLT轉(zhuǎn)換,所以我們還得在代碼文件的開頭處添加using System.Xml.Xsl的語句。 下面便是XSL文件的源代碼,其中最重要的部分是<xsl:template match="name">……</xsl:template>一塊。 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <table border="1" style="border-collapse: collapse" bordercolor="Teal" align="center" width="505" height="34"> <tr> <td valign="middle" align="center" bgcolor="Teal" colspan="2" width="505" height="85"> <font style="color:White;background-color:Teal;font-family:華文行楷;font-size:X-Large;font-weight:bold;">歡迎訪問"令狐沖"的留言簿!</font> </td> </tr> <tr><td width="505" height="26" align="left" colspan="2"></td></tr> <xsl:for-each select="http://guest"> <xsl:apply-templates select="name"/> </xsl:for-each> <tr> <td valign="middle" align="center" colspan="2" width="505"> <font> 本留言簿由<a href="mailto:0024108@fudan.edu.cn">王凱明</a>開發(fā)! </font> </td> </tr> </table> </xsl:template> <xsl:template match="name"> <tr> <td width="95" height="26" align="right"> <font>用戶名:</font> </td> <td width="400" height="26" valign="middle" align="left"> <font><xsl:value-of select='.'/></font> </td> </tr> <tr> <td width="95" height="26" align="right" bgcolor="e0e0e0"> <font>Email地址:</font> </td> <td width="400" height="26" valign="middle" align="left" bgcolor="#e0e0e0"> <font><a HREF="mailto:{../email}"><xsl:apply-templates select="../email"/></a></font> </td> </tr> <tr> <td width="95" height="26" align="right"> <font>QQ號碼:</font> </td> <td width="400" height="26" valign="middle" align="left"> <font><xsl:apply-templates select="../qq"/></font> </td> </tr> <tr> <td width="95" height="26" align="right" bgcolor="#e0e0e0"> <font>個(gè)人主頁:</font> </td> <td width="400" height="26" valign="middle" align="left" bgcolor="#e0e0e0"> <font><a HREF="http://{../homepage}" target="_blank"><xsl:apply-templates select="../homepage"/></a></font> </td> </tr> <tr> <td width="95" height="26" valign="top" align="right"> <font>留言信息:</font> </td> <td width="400" height="26" valign="top" align="left"> <font><xsl:apply-templates select="../comment"/></font> </td> </tr> <tr><td width="505" height="26" align="left" colspan="2"></td></tr> </xsl:template> </xsl:stylesheet> 這樣,當(dāng)用戶點(diǎn)擊"查看留言簿"按鈕或是成功輸入信息后瀏覽器便導(dǎo)向到該顯示所有用戶輸入信息的Web頁面,其運(yùn)行效果圖示如下:
 圖3 三.總結(jié): 這樣,一個(gè)具有基本功能的留言簿就完成了,從中我們可以體會到運(yùn)用ASP.NET技術(shù)開發(fā)Web應(yīng)用程序是相當(dāng)容易的,同時(shí)在結(jié)合了XML技術(shù)之后,ASP.NET可以變得更加強(qiáng)大。還有文章中介紹的XSLT技術(shù)是非常有用的,你可以參考其它相關(guān)的更多資料以使它成為你開發(fā)過程中的一個(gè)有力工具。
|