软件开发视频大讲堂:ASP.NET从入门到精通(第4版)
上QQ阅读APP看书,第一时间看更新

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();
        }