服务器动态网站设计(二)
本文介绍“皖北牛肉当涂专卖店”网站设计过程,该网站为服务端动态网站,服务器端程序采用.NET技术编写,数据库管理系统采用Access。在数据库操作方面,主要介绍如何利用ADO.NET对数据库进行读写操作。此外,本文还介绍了ASP.NET对Access和SQL Server数据库中图像数据操作的方法,对其它文件如文本文件和XML文件读写的方法,对Cookie的读写操作。
1. 项目设计
本设计文档见附件:服务器网站设计任务书(二)。
2. 在Microsoft Visual Studio 中创建网站
1. 复制上一服务器网站并在Microsoft Visual Studio中打开; 2. 在WBData.mdb数据库中添加Product表;
3. 创建母板页Masterpage.master后,在母板页中添加公共的Html标签;
3. 在母板页中添加网站访问量计数器功能
利用Application对象存储网站访问量
1.Application对象
Application对象用于存放ASP.NET 应用程序中多个会话和请求之间的全局共享信息,所有用户都可以对Application对象进行修改。
例:
protected void Page_Load(object sender, EventArgs e) {
Application[\}
protected void Button1_Click(object sender, EventArgs e) {
Application[\ Label1.Text=Application[\}
对于上例,我们可在多个浏览器窗口中打开上例查看效果,可以看出,多个会话共享一个应用程序状态变量。
以下介绍Application对象主要成员。 ? AllKeys 属性
获取 HttpApplicationState 集合中的访问键。见MSDN示例。 ? Count 属性
获取 HttpApplicationState 集合中的状态变量数。 ? Add 方法
将新的状态变量添加到 HttpApplicationState 集合中。 例:
protected void Page_Load(object sender, EventArgs e) {
Application[\ //此方法只创建一次,第二次执行时是对其赋值 if(!Page.IsPostBack)
Application.Add(\}
上例中二种方式都能创建Application状态变量,但使用Add方法时,每执行一次就添加一个状态变量。
? Clear 方法
从 HttpApplicationState 集合中移除所有对象。 ? Remove 方法
从 HttpApplicationState 集合中移除命名对象。 ? RemoveAt 方法
按索引从集合中移除一个 HttpApplicationState 对象。 ? Set 方法
更新 HttpApplicationState 集合中的对象值。 例:
Application.Set(\? Lock 方法
锁定对 HttpApplicationState 变量的访问以促进访问同步。 ? UnLock 方法
取消锁定对 HttpApplicationState 变量的访问以促进访问同步 2.网站计数器
protected void Page_Load(object sender, EventArgs e) {
if (!Page.IsPostBack) {
if (Session[\] == null) {
Application.Lock();
Application[\] = Convert.ToInt32(Application[\]) + 1; Application.UnLock();
Session.Add(\, \); }
labAccessCount.Text =\本站访总问量:\+ Application[\].ToString(); }
}
利用文本文件存储网站访问量
1.读取文本文件数据
try {
//其中可用\可用\代替
using (StreamReader sr = new StreamReader(Server.MapPath(\)+ \))
{
String line=sr.ReadToEnd(); Label1.Text = line; } }
catch (Exception e1) {
Label1.Text = \∞\;
}
上述代码中
new StreamReader(Server.MapPath(\)+ \)
可用如下替换:
File.OpenText(Server.MapPath(\)+ \)
2.向文本文件写数据
using (StreamWriter sw = new StreamWriter(Server.MapPath(\)+\)) {
sw.Write(118); sw.Close();
}
其中,StreamWriter对象可通过File类创建:
StreamWriter sw = File.CreateText(FILE_NAME))
3.网站计数器
protected void Page_Load(object sender, EventArgs e) {
if (!Page.IsPostBack) {
int c;
using (StreamReader sr = new StreamReader(Server.MapPath(\) + \)) {
c = Convert.ToInt32((sr.ReadToEnd())); }
if (Session[\] == null) {
c++;
using (StreamWriter sw = new StreamWriter(Server.MapPath(\) + \)) {
sw.Write(c); sw.Flush(); sw.Close(); }
Session.Add(\, \); }
labAccessCount.Text = \本站访总问量:\ + c.ToString(); }
}
.NET对文件操作
通常.NET提供的对文件操作的类包含在System.IO名空间中,使用时需包含using System.IO;
1.用于文件 I/O 的主要类
Directory 提供创建、移动和枚举目录和子目录的静态方法。 例:
Directory.CreateDirectory(\);
DirectoryInfo 提供创建、移动和枚举目录和子目录的实例方法。 例:
DirectoryInfo di = new DirectoryInfo(\);
di.Delete(true); //true表示连同其中的文件和子目录一起删除
DriveInfo 提供访问有关驱动器的信息的实例方法。 DriveInfo d = new DriveInfo(\);
Label1.Text = d.AvailableFreeSpace.ToString();
File 提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream。 FileInfo 提供用于创建、复制、删除、移动和打开文件的实例方法,并协助创建 FileStream。
例:如果文件不存在,则创建文件并写入内容;否则追加内容到文件。然后输出文件内容。
string path = @\; FileInfo fi1 = new FileInfo(path); if (!fi1.Exists) {
//Create a file to write to.
using (StreamWriter sw = fi1.CreateText()) {
sw.WriteLine(\); sw.WriteLine(\);
sw.WriteLine(\); } } else {
//Append some text.
using (StreamWriter sr = new StreamWriter(path,true)) {
sr.WriteLine(\); } }
//Open the file to read from.
using (StreamReader sr = fi1.OpenText()) {
string s ,s1; s = s1 = \;
while ((s1 = sr.ReadLine()) != null) {
s=s+s1 + \; }
Label1.Text = s;
}
FileStream 支持通过其 Seek 方法随机访问文件,提供了读和写的操作。 注:如果打算多次重用某个对象,可考虑使用类的实例方法,而不是类的相应静态方法,因为并不总是需要安全检查。
2.用于从流读取和写入流的类
BinaryReader 和 BinaryWriter 在 Streams 中读取和写入编码的字符串和基元数据类型。
StreamReader 通过使用 Encoding 进行字符和字节的转换,从 Streams 中读取字符。 StreamWriter 通过使用 Encoding 将字符转换为字节,向 Streams 写入字符。 StringReader 从 Strings 中读取字符。
4. 在母板页中添加网上调查功能
1.在Page_Load()事件中调用显示网上调查结果函数ShowVote()
///
/// 显示网上调查结果。 ///
private void ShowVote() {
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath(@\));