直播中
一.概要:
留言簿是網(wǎng)站的一個(gè)重要組成部分,是訪問者發(fā)表意見的場所,也是網(wǎng)站管理員了解網(wǎng)站基本情況的有力工具。所以留言簿在現(xiàn)在的網(wǎng)站中扮演了重要的角色。
可是在以前開發(fā)一個(gè)留言簿并不是一件容易的事,開發(fā)者的工作量往往會(huì)很多。而現(xiàn)在隨著微軟推出VS.net,相應(yīng)的技術(shù)推陳出新。特別是XML在.net Framework中的廣泛運(yùn)用,使得整個(gè).net構(gòu)架具有十分優(yōu)越的基礎(chǔ)。在VS.net推出的同時(shí),也伴隨而來了一門新興的語言C#。C#作為微軟.net戰(zhàn)略的重要部分,具有特別優(yōu)秀的性能。所以本文的asp.net程序是用C#語言描述的,同時(shí)整個(gè)程序又是基于XML的。我用到了XML作為程序的數(shù)據(jù)庫,主要是因?yàn)樗缘姆?wù)器都是支持XML文件的。
二.要求:
(1) .Net SDK Beta2及以后版本
(2) 支持Asp.net的Web服務(wù)器
三.說明:
本文的實(shí)例由兩部分組成:
(1) guestpost.aspx-將用戶信息添加到一個(gè)XML文件中
(2) viewguestbook.aspx-先建立一個(gè)數(shù)據(jù)集對象,建立后,就很容易顯示其中的數(shù)據(jù)了。我這里用到了一個(gè)“Repeater”來顯示數(shù)據(jù)集中的數(shù)據(jù)。還有,讀者可試著根據(jù)自己的喜好來修改查看頁。
四.代碼:
(1) guestpost.aspx:
< %@ Page Language="C#" EnableSessionState="False" % >
< %@ Import Namespace="System" % >
< %@ Import Namespace="System.IO" % >
< %@ Import Namespace="System.Data" % >
< %-- 這些是本程序正常運(yùn)用所必須的名字空間 --% >
< html >
< head >
< title >歡迎來到我的留言簿< /title >
< script Language="C#" runat="server" >
///< summary >
/// 當(dāng)提交(submit)按鈕按下后,調(diào)要這個(gè)函數(shù)
///< /summary >
public void Submit_Click(Object sender, EventArgs e)
{
//保存數(shù)據(jù)的XML文件的路徑
//如果你的路徑和下面的不同,則請修改之
string dataFile = "db/guest.xml" ;
//運(yùn)用一個(gè)Try-Catch塊完成信息添加功能
try{
//僅當(dāng)頁面是有效的時(shí)候才處理它
if(Page.IsValid){
errmess.Text="" ;
//以讀的模式打開一個(gè)FileStream來訪問數(shù)據(jù)庫
FileStream fin;
fin= new FileStream(Server.MapPath(dataFile),FileMode.Open,
FileAccess.Read,FileShare.ReadWrite);
//建立一個(gè)數(shù)據(jù)庫對象
DataSet guestData = new DataSet();
//僅從數(shù)據(jù)庫讀取XML Schema
guestData.ReadXmlSchema(fin);
fin.Close();
//從數(shù)據(jù)集的Schema新建一個(gè)數(shù)據(jù)行
DataRow newRow = guestData.Tables[0].NewRow();
//用相應(yīng)值填寫數(shù)據(jù)行
newRow["Name"]=Name.Text;
newRow["Country"]=Country.Text;
newRow["Email"]=Email.Text;
newRow["Comments"]=Comments.Text;
newRow["DateTime"]=DateTime.Now.ToString();
//填寫完畢,將數(shù)據(jù)行添加到數(shù)據(jù)集
guestData.Tables[0].Rows.Add(newRow);
//為數(shù)據(jù)庫文件新建另一個(gè)寫模式的FileStream,并保存文件
FileStream fout ;
fout = new FileStream(Server.MapPath(dataFile),FileMode.Open,
FileAccess.Write,FileShare.ReadWrite);
guestData.WriteXml(fout, XmlWriteMode.WriteSchema);
fout.Close();
//隱藏當(dāng)前的面板
formPanel.Visible=false;
//顯示帶有感謝信息的面板
thankPanel.Visible=true;
}
}
catch (Exception edd)
{
//捕捉異常
errmess.Text="寫入XML文件出錯(cuò),原因:"+edd.ToString() ;
}
}
< /script >
< LINK href="mystyle.css" type=text/css rel=stylesheet >
< /head >
< body >
< %-- 包含一個(gè)頭文件:header.inc --% >
< !-- #Include File="header.inc" -- >
< br >
< h3 align="center" class="newsbody" >留言者信息< /h3 >
< br >
< asp:label id="errmess" text="" style="color:#FF0000" runat="server" / >
< asp:Panel id=formPanel runat=server >
< form runat="server" >
< table border="0" width="80%" align="Center" >
< tr >
< td class="newsheading" >< b >請?jiān)谖伊粞圆玖粝履鷮氋F的信息!!< /b >< /td >
< td class="newsheading" > < /td >
< /tr >
< tr class="newsbody" >
< td >姓名:< /td >
< td >< asp:textbox text="" id="Name" runat="server" / >
< asp:RequiredFieldValidator ControlToValidate=Name display=static
runat=server >
*< /asp:RequiredFieldValidator >< /td >< /tr >
< tr class="newsbody" >< td >國家:< /td >
< td >< asp:textbox text="" id="Country" runat="server"/ >
< asp:RequiredFieldValidator ControlToValidate=Country display=static
runat=server >
*< /asp:RequiredFieldValidator >< /td > < /tr >
< tr class="newsbody" >< td >E-Mail:< /td >
< td >< asp:textbox test="" id="Email" runat="server"/ >
< asp:RequiredFieldValidator ControlToValidate=Email display=static
runat=server >
*< /asp:RequiredFieldValidator >< asp:RegularExpressionValidator
runat="server"
ControlToValidate="Email"
ValidationExpression="[\w-]+@([\w-]+\.)+[\w-]+"
Display="Static"
Font-Name="verdana" Font-Size="10pt" >
請輸入一個(gè)格式正確的Email地址!< /asp:RegularExpressionValidator >< /td >
< /tr >< tr class="newsbody" >< td >留言:< /td >
< td >< asp:Textbox textmode=multiline id="Comments" columns="25"
rows="4" runat="server" / >< /td >< /tr >
< tr class="newsbody" >
< td colspan="2" >
< asp:Button class="newsheading" id="write" Text="Submit"
onClick="Submit_Click" runat="server"/ >< /td >< /tr >< /table >< /form >< /asp:Panel >
< asp:Panel id=thankPanel visible=false runat=server >
< p class="newsbody" align=center >< b >謝謝訪問我的留言簿!< /b >
< br >< a href="viewguestbook.aspx" >請點(diǎn)擊這里 < /a > 查看留言簿。
< /p >
< /asp:Panel >
< !-- #Include File="footer.inc" -- >
< /body >
< /html >
[Page]
2) viewguestbook.aspx:
< %@ Page Language="C#" % >
< %@ Import Namespace="System" % >
< %@ Import Namespace="System.IO" % >
< %@ Import Namespace="System.Data" % >
< %-- 以上是所需的名字空間 --% >
< html >
< head >
< title >歡迎來到我的留言簿< /title >
< script language="C#" runat=server >
//頁面下載完畢后,運(yùn)行這個(gè)腳本
public void Page_Load(Object sender, EventArgs e)
{
//包含所有數(shù)據(jù)的XML文件的路徑
//如果你的路徑和下面的不同,則請修改
string datafile = "db/guest.xml" ;
//運(yùn)用一個(gè)Try-Catch塊完成信息讀取功能
try
{
//建立一個(gè)數(shù)據(jù)集對象
DataSet guestData = new DataSet();
//為數(shù)據(jù)庫文件打開一個(gè)FileStream
FileStream fin ;
fin = new FileStream(Server.MapPath(datafile),FileMode.Open,
FileAccess.Read,FileShare.ReadWrite) ;
//把數(shù)據(jù)庫中內(nèi)容讀到數(shù)據(jù)集中
guestData.ReadXml(fin);
fin.Close();
//將第一個(gè)表中的數(shù)據(jù)集付給Repeater
MyDataList.DataSource = guestData.Tables[0].DefaultView;
MyDataList.DataBind();
}
catch (Exception edd)
{
//捕捉異常
errmess.Text="不能從XML文件讀入數(shù)據(jù),原因:"+edd.ToString() ;
}
}
< /script >
< LINK href="mystyle.css" type=text/css rel=stylesheet >
< /head >
< body topmargin="0" leftmargin="0" marginwidth="0" marginheight="0" rightmargin="0" >
< !-- #Include File="header.inc" -- >
< asp:label id="errmess" text="" style="color:#FF0000" runat="server" / >
< br >
< h3 align="center" class="newsbody" >我的留言簿< /h3 >
< ASP:Repeater id="MyDataList" runat="server" >
< headertemplate >
< table class="mainheads" width="100%" style="font: 8pt verdana" >
< tr style="background-color:#FF9966" >
< th >
姓名
< /th >
< th >
國家
< /th >
< th >
Email
< /th >
< th >
留言
< /th >
< th >
日期/時(shí)間
< /th >
< /tr >
< /headertemplate >
< itemtemplate >
< tr style="background-color:#FFFFCC" >
< td >
< %# DataBinder.Eval(Container.DataItem, "Name") % >
< /td >
< td >
< %# DataBinder.Eval(Container.DataItem, "Country") % >
< /td >
< td >
< %# DataBinder.Eval(Container.DataItem, "Email") % >
< /td >
< td >
< %# DataBinder.Eval(Container.DataItem, "Comments") % >
< /td >
< td >
< %# DataBinder.Eval(Container.DataItem, "DateTime") % >
< /td >
< /tr >
< /itemtemplate >
< footertemplate >
< /table >
< /footertemplate >
< /ASP:Repeater >
< !-- #Include File="footer.inc" -- > < /body >< /html >
五.總結(jié):
這個(gè)程序完成了,相信大家對實(shí)現(xiàn)原理以及技巧都有了大致的了解。通過本文,我主要是想向大家展示用XML處理一些數(shù)據(jù)庫問題時(shí)的優(yōu)點(diǎn):服務(wù)器都支持XML文件,而且處理過程相當(dāng)簡潔明了。當(dāng)然,用XML也有它的不足之處,就是當(dāng)數(shù)據(jù)庫很大時(shí),解析過程會(huì)花費(fèi)相當(dāng)長的時(shí)間,因此還是要采用大型的數(shù)據(jù)庫系統(tǒng)的。所以,我只想通過此文起到拋磚引玉的作用。
程序運(yùn)行后的圖示如下: