ASP Application 对象详解

Application对象相对比较抽象,刚开始理解起来恐怕会不辨东西。切记:当你找不到北时,便不要过多考虑Application对象到底是什么东西?还是一句老话,先学会使用它。

一、了解Application对象。
为了提神,我们先看一个计数器的例程(你应该运行它以便于理解):
先编辑一个wuf16.htm文件:


记录某个页面的点击数示例:wuf17.asp


wuf17.asp的代码如下:
<% @ LANGUAGE = VBScript %>
<% 'wuf17.asp - 记录某一页面的访问数(计数器原理)
Option Explicit
Dim CountWeb
CountWeb = Request.ServerVariables("SCRIPT_NAME")
'这样保证每个页面都有一个唯一的变量, 避免混乱
%>

<%
Response.Write CountWeb & "

" & vbcrlf
Application.Lock   '请看讲解
Application(CountWeb) = Application(CountWeb) + 1   '累加器,点击数加1
Application.UnLock
Response.Write "WEB服务器关闭重启前该页的点击总数为: " & Application(CountWeb)
%>

运行这个程序时,对大部分的人来说,只有一台机器,既是Web服务器,又是客户端。那么你只能想象这样一种境况了:你的这两个主页文件放在很远的Web服务器上,而如潮水般的国内外用户正通过浏览器访问它们。每个用户点击一次,Application(CountWeb) 的值就加1,而且只要存放文件wuf17.asp的服务器没有关闭,Application(CountWeb)就将一直累加下去。但是注意,如果服务器关闭后重启,则Application(CountWeb)将重新从0开始计数(我晕,我说我的页面访问数怎么老是一位数)。为了避免这种永远从零开始的计数情况,你必须要在服务器关闭之前将Application(CountWeb)的值保存起来,下次需要时再取出来,就能够顺序累计下去了,具体如何做,且听N回后分解。
接下来的问题,就是Application.Lock、UnLock是什么意思?刚才我们做了一个假设,大量的用户正在访问该页面,而每一个用户的点击都会发生Application(CountWeb)加1,想想看,这样不就乱套了(什么!想不出,那肯定是你的主页终日只有你一个人赞助),所以得有个先来后到的规则。当某一用户访问该页面,需要修改Application(CountWeb)的值时,使用Lock方法加锁,避免其他用户修改,修改完后,再解锁。
从上例中您是否已看出,Application对象提供给所有用户共享信息(Application(CountWeb)),它所面向的是所有用户(每个用户的访问都会导致计数器加1)。Application对象还有两个事件,Application_OnStart事件和Application_OnEnd事件(您可千万别晕,这只是面向对象编程语言中起步的概念),使用时语法如下:

下面通过一个实例来说明如何使用事件,该程序的作用是统计站点所有页面的总点击数。
文件wuf18.asp的代码(站点内其他页面文件与这个文件类似):
<% @ LANGUAGE = VBScript %>
<% Option Explicit
'站内所有页面文件都应包括这句%>

在服务器关闭重启之前站点所有页面总点击数: <%= Application("CountAll") %>

文件wuf19.asp的代码:
<% ' wuf19.asp
Application.Lock
Application("CountAll") = Application("CountAll") + 1
Application.UnLock
%>

文件wuf18.asp与wuf19.asp放在同一目录下。文件global.asa的代码:
注意:事件处理程序必须以名为“global.asa”的文本文件存盘,而且必须放在虚拟路径的根目录下(一般就是与index.htm或default.htm文件放在同一目录下,例如:以我的机器为例,就绝对路径而言,global.asa放在c:\InetPub\home下,而wuf18.asp和wuf19.asp放在c:\InetPub\home\asp下),同一虚拟路径只允许有一个global.asa文件存在。

浏览wuf18.asp查看运行结果。看来,仅仅学会使用Application对象并不难。

二、认识Session对象。
有了前面的Application对象做铺垫,Session对象就容易多了。它与Application对象类似,只不过是仅仅用来记录单个用户的相关信息,它面向单个用户,因此我们可以使用Session对象存储某单个用户的信息。
与Application对象一样,Session对象也有两个事件:Session_OnStart事件和Session_OnEnd事件。使用语法与Application对象类似。
值得一提的是,使用Session对象前,必须确认浏览器的Cookie功能已启用(默认设置就可以了)。
下面举一个实例,文件global.asa的要求同上,因此上例中的global.asa将被本例中的global.asa覆盖。

文件wuf20.asp:
<%@ Language=VBScript %>


<% 'wuf20.asp
Response.Write "默认Timeout设置:" & Session.Timeout & "分钟
"
Session.Timeout = 1
Response.Write "您进入本站的时间:" & Session("In") & "
"
Response.Write "请在 1 分钟后刷新本页" & "

"

if Not IsEmpty(Application("Out")) then
Response.Write "您上次进入本站的时间:" & Application("In") & "
"
Response.Write "您上次离开本站的时间:" & Application("Out") & "
"
Response.Write "浏览时间(分钟):" &_
           Datediff("n",Application("In"),Application("Out")) & "

"
End If

if IsEmpty(Session("Out")) then
Response.Write "刷新前和刷新后Session(""Out"")的值都为空" & "
"
End If
%>


当用户第一次浏览网页时,发生Session_OnStart事件,程序记录用户本次进入网页的时间,而此时不会发生Session_OnEnd事件,故Application("Out")值为空,程序不会显示浏览时间。
我们知道,Application对象的生存期为第一个用户浏览网页直至服务器关闭。而Session对象的生存期为用户第一次浏览网页(会话开始)直至会话结束。那什么时候会话结束呢?具体到本例中,Session.Timeout = 1设置会话超时为1分钟,即如果长达1分钟没有向Web服务器提供请求,则会话超时,导致会话结束,发生Session_OnEnd事件,程序执行Session_OnEnd内的代码。在这里我们将进入和离开时间分别放入Application("In")和Application("Out"),因为会话结束后,Session对象将不复存在,这点我们在代码的最后做了验证。
从这个例程,可以看出:
1. Application对象和Session对象的生存期不同。
2. Session对象是针对单个用户的,它的值存放在客户端,其他用户的浏览对该单用户的Session对象没有任何影响。单个用户只能读写自己Session对象的值(如:Session("In"))。
3. 注意在Response.Write中显示双引号的表示方法:(""Out"")。
4. 特别提醒:该程序没有实用性,仅供调试用(仅适用于只有一个用户浏览的情况),请思考这是为什么?答案见本文末。
提示:请注意Application对象的特性。

三、一个经典的实例:如何在网页上显示在线人数
在下面的例子中,用Application("Online")来存放在线人数,用Application("CountAll")存放总访问人数。
原理:当一个新用户浏览网页时,发生Session_OnStart事件,在线人数加1,访问用户数也加1。当某用户离开时,会话超时后会发生Session_OnEnd事件,在线人数减1。
Global.asa代码如下:

Wuf21.asp代码如下:
<%@ Language=VBScript %>


<%Session.Timeout = 5%>

在线人数: <%= Application("Online")%>


访问总人数: <%= Application("CountAll")%>




    请注意将本例程与wuf17.asp对比,后者是计算点击数,而前者是计算访问人数。

答案:由于Applicaton对象适用于所有用户,所以在多用户的情况下,其他用户的浏览也会改变Application(“In”)和Application(“Out”)的值。

引用内容 引用内容
使用 ASP Application 对象可以让应用程序中的所有用户之间共享信息,并且在WEB服务器运行期间持久的保存数据。
下面我们来详细了解ASP Application的集合、方法、和事件。


ASP Application 对象集合
Contents  包含所有通过脚本命令添加到应用程序中的项目。
StaticObjects  包含所有使用 HTML 的 标签追加到应用程序中的对象。

1、Contents 集合
Contents 集合包含着所有通过脚本命令添加到 Application 对象的项目总和。
要删除 Contents 集合中的项目,请使用 Remove 和 RemoveAll 方法。

语法:
Application.Contents(Key)
参数:
Key,必需,指定要获取项目的名称。

示例:
<%  
Application("strVar") = "Abo BloG"  
Set Application("objRs") = Server.CreateObject("ADODB.RecordSet")  
  
'遍历 Contents 集合  
For Each Key In Application.Contents  
    Response.Write(Key) & "
"  
Next  
  
For intI = 1 To Application.Contents.Count  
    Response.Write(intI) & "
"  
Next  
%>  
<%
Application("strVar") = "Abo BloG"
Set Application("objRs") = Server.CreateObject("ADODB.RecordSet")

'遍历 Contents 集合
For Each Key In Application.Contents
    Response.Write(Key) & "
"
Next

For intI = 1 To Application.Contents.Count
    Response.Write(intI) & "
"
Next
%>


2、StaticObjects 集合
StaticObjects 集合包含所有的在 Application 对象范围中使用 标记创立的对象。可以使用该集合确定某对象的指定属性的值或遍历集合及检索所有表态对象的所有属性。

语法:
Application.StaticObjects(Key)
参数:
Key,必需,指定要获取项目的名称。

示例:
<%  
'Global.asa 文件:  
  
  
  
'ASP 文件:  
'遍历 StaticObjects 集合  
For Each obj In Application.StaticObjects  
    Response.Write("
  • " & obj & "
  • ")  
    Next  
    %>  
    <%
    'Global.asa 文件:



    'ASP 文件:
    '遍历 StaticObjects 集合
    For Each obj In Application.StaticObjects
        Response.Write("
  • " & obj & "
  • ")
    Next
    %>


    ASP Application 方法
    Contents.Remove  从 Contents 集合中删除一个项目。
    Contents.RemoveAll()  从 Contents 集合中删除所有的项目。
    Lock  防止其余的用户修改 Application 对象中的变量。
    Unlock  使其他的用户可以修改 Application 对象中的变量(在被 Lock 方法锁定之后)。

    1、Contents.Remove 方法
    Contents.Remove 方法从 Contents 集合中删除一个项目。

    语法:
    Application.Contents.Remove(name|index)
    参数:
    name|index,必需,指定要删除项目的名称或索引号。

    示例:
    <%  
    Application("strI") = "布落格"  
    Application("strII") = "Abo BloG"  
      
    For Each S In Application.Contents  
        Response.Write Application.Contents(S)  
    Next  
    %>  
    <%
    Application("strI") = "布落格"
    Application("strII") = "Abo BloG"

    For Each S In Application.Contents
        Response.Write Application.Contents(S)
    Next
    %>


    2、Contents.RemoveAll() 方法
    Contents.RemoveAll 方法可从 Contents 集合删除所有的项目。

    语法:
    Application.Contents.RemoveAll()

    示例:

    <%  
    Application("strI") = "布落格"  
    Application("strII") = "Abo BloG"  
      
    '删除所胡Application 项目  
    Application.Contents.RemoveAll()  
    %>  
    <%
    Application("strI") = "布落格"
    Application("strII") = "Abo BloG"

    '删除所胡Application 项目
    Application.Contents.RemoveAll()
    %>


    3、Lock 方法、Unlock 方法
    Lock 方法阻止其他用户修改 Application 对象中的变量以确保同一时间只有一位用户可修改 Application 变量。
    Unlock 方法使其他用户能够修改存储在 Application 对象中的变量在(它被使用 Lock 方法锁定之后),如果未显式调用该方法,Web 服务器将在 .asp 文件结束或超时后解锁 Application 对象。

    语法:
    Application.Lock
    Application.Unlock

    示例:
    <%  
    Application.Lock  
    Application("Count") = Application("Count") + 1  
    Application.Unlock  
      
    Response.Write Application("Count")  
    %>  
    <%
    Application.Lock
    Application("Count") = Application("Count") + 1
    Application.Unlock

    Response.Write Application("Count")
    %>


    ASP Application 事件
    Application_OnStart  在首个新的 session 被创建之前(这时 Application 对象被首次引用),此事件会发生。
    Application_OnEnd  当所有用户的 session 都结束,并且应用程序结束时,此事件发生。

    Application_OnStart 事件在首次创建新的会话(即 Session_OnStart 事件)之前发生。只有 Application 和 Session 内建对象是可用。
    注意:在 Application_OnStart 事件脚本中引用 Session、Request 或者 Response 对象会引发错误。

    Application_OnEnd 事件在应用程序退出时于 Session_OnEnd 事件之后发生,只有 Application 和 Server 内建对象可用。
    注意:MapPath 方法无法用于 Application_OnEnd 代码中。

    语法:


    示例:
    Global.asa
      


    ASP页面显示当前在线人数:
    <%  
    Response.Write "Online:" & Application("Visit")  
    %>  
    <%
    Response.Write "Online:" & Application("Visit")
    %>



    上一篇: 最近删除的域名列表[URL][TXT]
    下一篇: ASP 程序生成文件时指定文件类型和文件名
    文章来自: 网络
    引用通告: 查看所有引用 | 我要引用此文章
    Tags: ASP vbscript VBS
    相关日志:
    评论: 0 | 引用: 0 | 查看次数: 6557
    发表评论
    昵 称:
    密 码: 游客发言不需要密码.
    邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
    网 址: 输入网址便于回访.
    内 容:
    验证码:
    选 项:
    虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
    字数限制 500 字 | UBB代码 关闭 | [img]标签 关闭