• Application对象


    11.1  Application对象

    Application对象生存期和Web应用程序生存期一样长,生存期从Web应用程序网页被访问开始,HttpApplication类对象Application被自动创建,直到没有一个网页被访问时结束,Application对象被自动撤销。因此Application对象中的变量也有相同生存期,并且变量可以被Web应用程序中的所有网页访问。因此,可以在Application对象中建立一些全局的公用变量,由于存储在Application对象中的数值可以被应用程序的所有网页读取,所以Application对象的属性也适合在应用程序的网页之间传递信息。Application对象主要有以下用途:
    l    存储记录在线人数或访问网站总人数的变量。
    l    存储网站共用最新消息,供所有网页更新。
    l    记录网站中个网页同一条广告被点击的次数或时间。
    l    存储供所有网页使用的数据库数据。
    l    不同用之间通讯,例如多用户聊天室,多用户游戏等
    本节首先介绍Application对象的用法,然后介绍记录访问网站总人数的实现方法。

    11.4.1      Application对象属性

    虽然Application对象没有内置的属性,但我们可以使用以下句法设置用户定义的属性也可称为集合:Application("属性/集合名称")=值,例如,Application("MyVar")="Hello"。用以下语句取出数据:string s= Application("MyVar")。

    11.4.1      方法

    Application 对象有两个方法,它们都是用于处理多个用户对存储在Application中的数据进行写入的的同步问题。由于存储在Application对象中的数值可以被应用程序的所有网页读取,因此一个用户在修改这个变量时,不允许其它用户修改,这两个方法就是解决这个问题的。
    l L ock 方 法
    Lock 方法阻止其他客户修改存储在 Application 对象中的变量,以确保在同一时刻仅有一个客户可修改和存取 Application 变量。如果用户没有明确调用 Unlock 方法,则服务器将在 .asp 文件结束或超时后即解除对 Application 对象的锁定。
    l Unlock 方法
    和Lock方法相反,Unlock方法允许其他客户修改Application对象的属性。下例介绍一个计数器变量的使用方法。
    Application.Lock;
    Application["counter"]=(Int32)Application["counter"]+1;
    Application.UnLock;

    11.4.1      事件

    l Application_OnStart事件
    第一个浏览器访问Web应用程序网页时,产生的事件。
    l Application_OnEnd事件
    没有浏览器访问时Web应用程序网页时,产生的事件。
    Application_OnStart和Application_OnEnd事件的处理过程必须写在global.asax文件之中。

    11.4.2      例子:显示访问网站总人数

    (1)  建立一个主页文件Default.aspx如下:
    <html>
    <script language="c#" runat=server>
    void Page_Load(Object src,EventArgs e)
    {
    if(!Page.IsPostBack)//如果用户单击刷新按钮,计数器不加1
    {
    int num;
    Application.Lock;
    Application["counter"]=(Int32)Application["counter"]+1;
    num=(Int)Application["counter"];
    Application.UnLock;
    label1.Text=Convert.ToString(num);
    }
    }
    </script>
    <body>
    <form runat=server>
    <asp:Label id="label1" Text="" runat=server></asp:Label>
    <br>
    <asp:HyperLink id="hLink1" NavigaterUrl="other.aspx" Target="_blank" runat=server>
    单击此处转到e1.aspx,计数器不加1。
    </asp:HyperLink >
    </form>
    </body>
    </html>
    (2)  建立other.aspx网页文件如下:
    <html>
    <script language="c#" runat=server>
    void Page_Load(Object src,EventArgs e)
    {
    Int num=(Int)Application["counter"];
    label1.Text=Convert.ToString(num);
    }
    }
    </script>
    <body>
    <form runat=server>
    <asp:Label id="label1" Text="" runat=server></asp:Label>
    <br>
    <asp:HyperLink id="hLink1" NavigaterUrl="default.aspx" runat=server>
    单击此处转到dault.aspx,计数器不加1。
    </asp:HyperLink >
    </form>
    </body>
    </html>
    (3)  建立global.asax文件如下:
    <script language="c#" runat=server>
    void Application_OnStart(Object src,EventArgs e)
    {
    Application.Add("counter",0);
    }
    </script>
    (4)  三个文件都存到宿主目录中,在浏览器重输入URL地址:http://Localhost/,查看显示的计数器数值,单击刷新按钮,查看显示的计数器数值是否改变,转到Other.aspx网页,在转回dault.aspx网页,查看显示的计数器数值是否改变。关闭所有网页,在打开default.aspx网页,显示的计数器值从0开始,这是因为没有网页访问网站时,Application对象被自动撤销。在打开新网页,产生Application_OnStart事件,将counter值为0。为了解决此问题,可以建立一个文件,记录访问网站总人数,初值为0,Application_OnStart事件函数中,从文件取出已访问网站总人数,赋值给counter,Application_OnEnd事件函数中,将counter存到文件中。 
    (5)  用记事本创建文件counter_File.txt,其中内容为字符0。存文件到宿主目录中。
    (6)  修改global.asax文件如下:
    <script language="c#" runat=server>
    void Application_OnStart(Object src,EventArgs e)
    {//用Server对象对象得到counter_File文件绝对路径
    string s=Serve.MapPath(counter_File.txt);
    Application.Add("counterFile",s);//保存供Application_OnEnd事件函数使用
    System.IO.FileStream fs=new System.IO.FileStream("s",FileMode.OpenOrCreate);
    System.IO.StreamReader r=new System.IO.StreamReader(fs);
    s=r.ReadLine();
    r.Close();
    Application.Add("counter",Convert.ToInt(s));
    }
    void Application_OnEnd(Object src,EventArgs e)
    {//此时Server对象已不存在,无法用Server对象得到counter_File文件绝对路径
    string s= (string)Application("counterFile");//取出保存的计数文件的全路径地址
    System.IO.FileStream fs=new System.IO.FileStream("s",FileMode.OpenOrCreate);
    System.IO.StreamWrite w=new System.IO.StreamWrite(fs);
    int num=(int)Application("counterFile");
    w.Write(num.ToString());
    w.Close();
    }
    </script>
    (7)  再一次访问dault.aspx网页,看是否已解决以上提出的问题。这里还有一个问题,如果用用如下URL访问网页:http://Localhost/Other.aspx,这样计数器就不能计数,解决的方法见Session 对象一节。

  • 相关阅读:
    HDU2141 Can you find it?(搜索,二分)
    HDU1253 胜利大逃亡(搜索)
    辗转相除法证明
    POJ2230 Watchcow(欧拉回路)
    POJ2524Ubiquitous Religions, 1611The Suspects(并查集)
    POJ3259 Wormholes(最短路)
    HDU3018Ant Trip(欧拉回路)
    SDUT1500Message Flood(字典树)
    HDU1010 Tempter of the Bone(搜索,dfs)
    HDU1305Immediate Decodability(字典树)
  • 原文地址:https://www.cnblogs.com/vaevvaev/p/6815343.html
Copyright © 2020-2023  润新知