名词解释:
ASP.NET应用程序:单个Web服务器上某一个虚拟目录及其子目录范围内所有文件,页,处理程序,模块,代码的总和
Application对象是一个用于存储全局变量的容器,其实它只是一个对象,但是为了说明的更加生动,我们可以把它比喻成一个容器,而ASP.NET应用程序里面变量,也就是容器里面的内容。ASP.NET应用程序是单个Web服务器上某一个虚拟目录及其子目录范围内所有文件,页,处理程序,模块,代码的总和。可以在整个应用程序范围之内存储一些信息,我们可以用变量来存储。但是有一个问题,那就是变量的整个生命周期受限于网页,也就是说每一次ASP.NET文件被执行完毕(Web服务器端发送代码到客户端后),变量的内容便被释放。很多时候,我们又需要保留这个内容,比如聊天室,每次刷新后,网页的内容仍然要存在,这就需要用Application来存储。Application对象是最佳的选择,利用Application对象存储的变量和对象在整个应用程序内执行所有ASP.NET页面都是可用的。Application对象中存储的是全局变量,这些变量占用了很大一部分内存资源,在这个变量没有被删除后被替代之前,资源是不会被释放的。
Session对象和Application完全不同。Application对象存储信息是整个应用程序所共享的全局信息,每一个客户都能够访问到相同的信息,它是针对整个应用程序的,并且整个程序里面的每一个用户.但是Session对象的作用是在服务器端存储特定的信息,它的信息是局部的,是针对于特定的一个用户,Session中的信息也称为会话状态。我们可以用一个例子来说明Session的使用。比如设计一个论坛,众所周知,我们进入论坛,需要提交用户名和密码,然后我们发帖子,留言等都不需要再用用户名和密码了,这是因为我们已经保留了这些信息。我们在登陆成功后,已经把用户名和密码等信息存放进了Session,然后将信息返回到服务器,当转到下一个页面的时候,再从服务器取出信息使用。我们留言,发帖子的时候,就直接从 Web服务器的Session中取出用户名和密码来判断我们是否有权利这么做。
Application和Session对象设计到了Global.asax文件的使用,下面我们来分析一下Global.asax文件。Application对象是由System.Web.HttpApplicationState类来实现的,Session是由System.Web.SessionState.HttpSessionState类实现的,对应于浏览器和服务器的一次会话。Global.asax是一种可选文件,你可以删除它。Global.asax 位于应用程序根目录下。虽然 Visual Studio .NET 会自动插入这个文件到所有的 ASP.NET 项目中,但是它实际上是一个可选文件。删除它不会出问题——当然是在你没有使用它的情况下。.asax 文件扩展名指出它是一个应用程序文件,而不是一个使用 aspx 的 ASP.NET 文件。
说到了Application和Session,我们就用聊天室和论坛的登陆作为两个具体的实例来简单说明一下。
首先是聊天室的制作:这是一个简易的聊天室,界面很简单,在页面的下半部分显示显示用户名和聊天内容,上半部分则显示大家一起聊天的内容和日期。用的是Application的全局变量来存储信息。
1.用VISUAL C#.NET 2005新建一个ASP.NET网站,命名为send.aspx,用来实现发送信息的功能。然后新建一个全局用用程序类,也就是Gloval.asax,然后输入一下代码:
<%@ Application Language="C#" %>
<script runat="server">
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
string chatcontent;
Application["chatcontent"] = "<h2>欢迎来到KINGSTONE聊天室!</h2>";
}
void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码
Application.RemoveAll();
}
void Application_Error(object sender, EventArgs e)
{
// 在出现未处理的错误时运行的代码
}
void Session_Start(object sender, EventArgs e)
{
// 在新会话启动时运行的代码
}
void Session_End(object sender, EventArgs e)
{
// 在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
// 或 SQLServer,则不会引发该事件。
}
</script>
2.设计send.aspx,就自己设计聊天页面了,不够我是按照以前老版本的QQ的聊天室的页面来设计的。在send.aspx中发送的Click事件处理程序中,添加一下代码:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
string message;
message = "<font color='blue'>" + this.sender.Text + "</font>说:";
message += this.content.Text;
message += "(<i>" + DateTime.Now.ToString()+"</i>)";
message += "<br>";
Application.Lock();
Application["chatcontent"] = (string)Application["chatcontent"] + message;
Application.UnLock();
this.content.Text = "";
}
}
3.添加一个Web窗体,命名为main.aspx,用来实现显示聊天内容,设计页面,这个页面最主要的是实现刷新,添加代码到<meta http-equiv="refresh" content="1"; />源中,然后在main.aspx.cs中添加
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class main : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.chatmessage.Text = (string)Application["chatcontent"];
}
}
4.添加一个HTML页,重命名为chat.htm.这个HTML页面主要用HTML语言来编写,需要实现framset框架,将一个页面分为上下两个部分的框架,上面连接main.aspx,下面连接send.aspx.代码主要为:
<!DOCTYPE html PUBLIC "-//W 3C //DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>KINGSTONE聊天室欢迎你</title>
<meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.1" />
</head>
<frameset rows="80%,20%">
<frame src="main.aspx">
</frame>
<frame src="send.aspx" noresize>
</frame>
</frameset>
<body>
</body>
</html>
这样一个聊天室页就做成了,大家就可以聊天了。它的主要原理在于Application存储信息,当用户发送消息后,它将数据从客户端传送到了服务端,然后储存在Application这个“容器”中,当刷新后,main.aspx里面的对象又调用容器里面的内容,于是又被调出来,然后送到客户端。
然后是Session的用运,上面页说过,这个例子就是论坛的登陆。这个主要是关于用户权限的检查。
大体介绍一下,因为这个比较简单,所以没有必要多说。
主要有三个界面,一个是登陆界面,一个是管理员登陆界面,还有一个是管理界面。
管理界面代码:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Session["username"] != null && Session["userpwd"] != null)
{
string username = Session["username"].ToString();
string userpwd = Session["userpwd"].ToString();
if (username != "kingstone" && userpwd != "123")
{
Response.Redirect("login.aspx", true);
}
}
else
{
Response.Redirect("login",true);
}
}
}
登陆界面是:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
string strno = "用户名或者密码不正确!";
if (username.Text == "kingstone" && userpwd.Text == "123")
{
Session["username"] = username.Text;
Session["userpwd"] = userpwd.Text;
Response.Redirect("admin.aspx");
}
else
{
Page.RegisterClientScriptBlock("loginno", strno);
}
}
}
这就是一个简易的登陆界面了。
最后想说说我对这两个的感想,以前看了很多书,做了一些设计,但是没有真正总结过Application 和Session对象,感觉知识是散的,到自己用的时候又去回忆。现在按照自己对看的书的总结,对两个对象有了更加深刻的理解,不过应该还是有很多地方没有理解到位,但是至少是比以前熟悉了,对ASP.NET几个的内置对象应该还是比较了解了,如Page,Application,Session,Response,Request,Cookies等