2.3 Application对象
2.3.1 Application对象概述
Application对象用于共享应用程序级信息,即多个用户共享一个Application对象。
在第1个用户请求ASP.NET文件时,将启动应用程序并创建Application对象。一旦Application对象被创建,它就可以共享和管理整个应用程序的信息。在应用程序关闭之前,Application对象将一直存在。所以,Application对象是用于启动和管理ASP.NET应用程序的主要对象。
2.3.2 Application对象的常用集合、属性和方法
Application对象的常用集合及说明如表2.6所示。
表2.6 Application对象的常用集合及说明
Application对象的常用属性及说明如表2.7所示。
表2.7 Application对象的常用属性及说明
Application对象的常用方法及说明如表2.8所示。
表2.8 Application对象的常用方法及说明
2.3.3 使用Application对象存储和读取全局变量
Application对象用来存储和维护某些值,需要通过定义变量来完成。Application对象定义的变量为应用程序级变量,即全局变量。变量可以在Global.asax文件或aspx页面中进行声明。语法如下:
Application[varName] =值;
其中,varName是变量名。例如:
Application.Lock(); Application["Name"]="小亮"; Application.UnLock(); Response.Write("Application[\"Name\"]的值为;"+ Application["Name"].ToString());
注意
由于应用程序中的所有页面都可以访问应用程序变量,所以为了确保数据的一致性,必须对Application对象加锁。
2.3.4 设计一个访问计数器
访问计数器主要是用来记录应用程序曾经被访问次数的组件。用户可以通过Application对象和Session对象实现这一功能。下面通过一个示例进行介绍。
【例2.6】访问计数器。(示例位置:TM\sl\02\06)
本示例主要在Global.asax文件中对访问人数进行统计,并在Default.aspx文件中将统计结果显示出来。执行程序,示例运行结果如图2.7所示。
图2.7 访问计数器
程序实现的主要步骤如下。
(1)新建一个网站,添加一个全局应用程序类(即Global.asax文件),在该文件的Application_Start事件中将把访问数初始化为0,代码如下:
void Application_Start(object sender, EventArgs e) { //在应用程序启动时运行的代码 Application["count"] = 0; }
当有新的用户访问网站时,将建立一个新的Session对象,并在Session对象的Session_Start事件中对Application对象加锁,以防止因为多个用户同时访问页面造成并行,同时将访问人数加1;当用户退出该网站时,将关闭该用户的Session对象,同理对Application对象加锁,然后将访问人数减1。代码如下:
void Session_Start(object sender, EventArgs e) { //在会话启动时运行的代码 Application.Lock(); Application["count"] = (int)Application["count"] + 1; Application.UnLock(); } void Session_End(object sender, EventArgs e) { //在会话结束时运行的代码 //注意:只有在Web.config文件中的sessionstate模式设置为 //InProc时,才会引发Session_End事件。如果会话模式设置为StateServer //或SQLServer,则不会引发该事件 Application.Lock(); Application["count"] = (int)Application["count"] -1; Application.UnLock(); }
(2)对Global.asax文件进行设置后,需要将访问人数在网站的默认主页Default.aspx中显示出来。在Default.aspx页面上添加了1个Label控件,用于显示访问人数。代码如下:
protected void Page_Load(object sender, EventArgs e) { Label1.Text = "您是该网站的第" + Application["count"].ToString() + "个访问者"; }
2.3.5 制作聊天室
Application对象的一个典型的应用就是聊天室的制作。下面就通过一个示例进行介绍。
【例2.7】聊天室的制作。(示例位置:TM\sl\02\07)
本示例主要利用Application对象实现聊天室功能。执行程序,首先应该登录聊天室,在“用户名”文本框中输入登录用户的名称,再单击“登录”按钮进入聊天室。示例运行结果如图2.8所示。
图2.8 聊天室
程序实现的主要步骤为:
(1)新建一个网站,其主页默认为Default.aspx,将其重命名为Login.aspx。
(2)在该网站中添加Default.aspx、Content.aspx和List.aspx 3个Web页面,其中,Default.aspx页面为聊天室的主页面,Content.aspx页面用来显示用户的聊天信息,List.aspx页面用来显示在线用户的列表。
(3)在该网站中添加一个Global.asax全局程序集文件,用来初始化Application对象值。
该聊天室是使用Application对象实现的,在应用程序启动时,应在Application对象的Application_Start事件中将所有数据初始化。代码如下:
void Application_Start(object sender, EventArgs e) { //在应用程序启动时运行的代码 //建立用户列表 string user=""; //用户列表 Application["user"] = user; Application["userNum"] = 0; string chats=""; //聊天记录 Application["chats"] = chats; //当前的聊天记录数 Application["current"] = 0; }
在聊天室主页面中单击“发送”按钮时,首先调用Application对象的Lock方法对所有Application对象进行锁定,然后判断当前聊天信息的记录数是否大于20。如果大于,则清空聊天记录,并重新加载用户的聊天记录;否则,将把聊天内容、用户名和发信息时间保存在Application对象中。代码如下:
protected void btnSend_Click(object sender, EventArgs e) { int P_int_current = Convert.ToInt32(Application["current"]); Application.Lock(); if (P_int_current == 0 || P_int_current > 20) { P_int_current = 0; Application["chats"] = Session["userName"].ToString() + "说:" + txtMessage.Text.Trim() + "(" + DateTime.Now.ToString() + ")"; } else { Application["chats"] = Application["chats"].ToString() + ", " + Session["userName"].ToString() + "说:" + txtMessage.Text.Trim() + "(" + DateTime.Now.ToString() + ")"; } P_int_current += 1; Application["current"] = P_int_current; Application.UnLock(); }
显示聊天信息页面Content.aspx加载时,从Application对象中读取保存的聊天信息,并将其显示在TextBox文本框中。Content.aspx页面的Page_Load事件代码如下:
protected void Page_Load(object sender, EventArgs e) { int P_int_current = Convert.ToInt32(Application["current"]); Application.Lock(); string P_str_chats = Application["chats"].ToString(); string[] P_str_chat = P_str_chats.Split(', '); for (int i = P_str_chat.Length -1; i >= 0; i--) { if (P_int_current == 0) { txtContent.Text = P_str_chat[i].ToString(); } else { txtContent.Text = txtContent.Text + "\n" + P_str_chat[i].ToString(); } } Application.UnLock(); }