开发 ASP 应用系统

  一个ASP应用系统,通常由一组相互协作的ASP页面、HTML页面和相关数据文件组成,它们位于 某个目录下或其目录中,用来完成某项特定任务.当ASP应用系统较为复杂且包含了大量相关页面时, 页面之间的协调性和逻辑性就显得很重要了.一个局部应用系统的运行可能要依赖其它局部应 用系统的运行状况或运行结果.ASP提供了一些相关的内建对象用于帮助实现ASP应用系统中各页面之间的相互交互和协调.当然,开发 ASP 应用系统时,你肯定已经熟悉 ASP 的基本应用知识了.


(一) Global.asa
  Global.asa是一个记录一个ASP应用系统共享信息的文件.在ASP应用系统启动时由ASP负责调用, 应用系统的状态初始化和结束处理工作通常放在该文件中,一些全局性的对象也可放在该文件中进 行声明.
该文件通常位于对应ASP应用系统所有文件所在目录的最高层目录下(不能位于其子目录中,即 ASP将在ASP页面文件的上层目录中查找该文件),一个ASP应用系统只能有一个Global.ASA文件.在Global.ASA文件发生更新后,服务器不再对用户新的请求进行处理,并且在处理完 现有用户的所有请求后,删除各个用户的Session,关闭ASP应用系统,对Global.ASA 进行重新编译.编译结束后,等待用户访问时再启动ASP应用系统.
对Global.ASA所包含的文件的更新不会引起重新编译.
  Global.ASA中的函数和过程只能由Application_OnStart、Application_OnEnd、
Session_OnStart和Session_OnEnd来调用,在ASP页面不能调用.
Global.ASA中用<Object SCOPE>声明的对象可由可用范围内的ASP页面调用,且只有
引用时才会实例化.


(二) 用 Application 管理整个ASP应用
  Application对象是一个全局对象,用于整个ASP应用系统.在一个ASP应用系统中,所有用户 使用同一个Application,对Application的设置与修改对所有用户都有效.所以可以利用该对象设 置一些适用于所有访问用户的全局性变量和共享信息,如系统开始运行的时间、本单位名称等.

  1.Application_OnStart 事件
  在ASP应用系统开始运行时,会激发一个事件进行系统运行的准备工作,如数据初始化、关键 数据准备、检查系统工作环境等.该事件对应的过程函数名称为 Application_OnStart,并且在文 件 Global.asa 中定义.具体的定义方式为:
<Script Language = VBScript RunAt = Server>
Sub Application_OnStart
...
这里进行系统运行准备工作
...
End Sub
</Script>
  ASP应用系统在服务器正常运行后,第一个用户访问该ASP应用的某个页面时启动,应用开始事件 处理函数Application_OnStart同时被调用.

  2.Application_OnEnd 事件
  在ASP应用系统结束运行时,会激发一个事件进行系统运行结束的处理工作,如关键数据存储、 释放系统资源等.该事件对应的过程函数名称为 Application_OnEnd,并且在文件 Global.asa 中 定义.具体的定义方式为:
<Script Language = VBScript RunAt = Server>
Sub Application_OnEnd
...
这里进行系统运行结束的处理工作
...
End Sub
</Script>
  除非ASP应用系统异常中止或被人为关闭,ASP应用系统一般在服务器关闭时结束运行,对应事件pplication_OnEnd也在此时被调用.
  在Application_OnStart、Application_OnEnd两个事件处理函数中,可用的ASP内置 对象只有Application和Server.

  3.利用 Application 设置或取得一些全局性其享信息
可以利用 Application 设置或取得全局性共享信息,其方法同存取一个集合属性的方法相 同.设置方法为:
<% Application("SysInfoVar") = SysInfoValue %>
如可记录进入ASP应用系统的用户个数,此时应在 Application_OnStart 事件中增加语句:
<% Application("UserCounter") = 0 %>
在每个用户进入时增加:
<% Application("UserCounter") = Application("UserCounter") + 1 %>
取得系统信息的方法为:
<% SysInfoVar1 = Application("SysInfoVar") %>
如要显示用户是第几个用户,可用以下语句:
<H2>你是第<% = Application("UserCounter") %>个进入本系统的客人<H2>

  4.Lock 与 Unlock
在设置全局性共享信息时,需要防止另外用户存取该信息,Application 提供了两个实现方 法.在修改全局性变量之前,应使用 Lock 方法防止另外用户存取该信息;修改结束后应使用UnLock 方法允许另外用户存取该信息.如下进行用户计数时,应使用以下语句:
<%
Application.Lock
Application("UserCounter") = Application("UserCounter") + 1
Application.UnLock
%>


(三) 用 Session 管理单个用户的信息
  Session对象用于管理ASP应用系统中单个访问用户的信息.在一个ASP应用系统中,系统为每 个用户访问的用户都分配一个Session,各个用户都有自己的Session,对Session的设置与修改仅 对当前用户都有效.所以可以利用该对象设置一些仅适用于当前访问用户的变量和专有信息,如
用户开始进入系统的时间、用户所处的服务器环境等.

  1.Session_OnStart 事件
  在用户进入ASP应用系统时,会激发一个事件进行有关处理的准备工作,如用户数据初始化、 用户数据准备、检查用户工作环境等.该事件对应的过程函数名称为 Session_OnStart,并且在文 件 Global.asa 中定义.具体的定义方式为:
<Script Language = VBScript RunAt = Server>
Sub Session_OnStart
...
这里进行接受用户访问的准备工作
...
End Sub
</Script>
  当系统开始运行后第一个用户访问时,Application_OnStart和Session_OnStart将同时发生, 并且Application_OnStart总是先于Session_OnStart发生.

  2.Session_OnEnd 事件
  在用户离开ASP应用系统时,会激发一个事件进行用户访问结束的处理工作,如用户数据存储 释放系统资源等.该事件对应的过程函数名称为 Session_OnEnd,并且在文件 Global.asa 中 定义.具体的定义方式为: <Script Language = VBScript RunAt = Server>
Sub Session_OnEnd
...
这里进行用户访问结束的处理工作
...
End Sub
</Script>   当系统结束运行时若有用户自愿或被迫退出,则Application_OnEnd和Session_OnEnd可能同时 发生,此时Application_OnEnd总是后于Session_OnEnd发生.
  在Session_OnStart函数中则所有ASP内置对象均可用;在Session_OnStart函数中可用的ASP内
置对象只有Application、Server和Session.

  3.结束用户访问
如果 Session 当前用户的信息不满足某种条件时,可能要中止其访问进程.此时可以用
Session 的方法来执行此操作.具体方法为:
<% Session.Abandon %>

  4.限制用户访问时间
也许你需要限制一个用户在ASP应用系统中停留的时间,或要取消这种限制.此时需要设 置 Session 的一个属性 TimeOut.具体设置方法为: <% Session.TimeOut = ServeralMinutes %>
其中,ServeralMinutes 为整数,单位为分钟.缺省值为 20 分钟,要修改此设置时,所 设值不能小于缺省值,即所设值必须大于等于 20.

  5.利用 Session 设置或取得用户专有信息
可以利用Session设置或取得用户专有信息,其方法同存取一个集合属性的方法相同. 设置方法为:
<% Session("UserInfoVar") = UserInfoValue %>
如可记录用户进入ASP应用系统的时间,此时应在 Session_OnStart 事件中增加语句:
<% Session("UserEnterTime") = now %>
取得用户信息的方法为:
<% UserInfoVar1 = Session("UserInfoVar") %>
如要显示用户进入ASP应用系统的时间,应用以下语句:
<H2>你进入系统的时间是 : <% = Session("UserEnterTime") %><H2>


(四) 设置变量和对象实例的应用范围
  与其它程序语言一样,变量和对象实例也其应用范围.在ASP应用程序中,应用范围可以分为 页面范围(Page)、用户范围(Session)和全局范围(Application).页面范围指变量或对象实例只在 本页面范围内有效,本页面脚本被执行后其占用资源即被释放;用户范围指变量或对象实例只在本 用户所涉及范围内有效,本用户退出后其占用资源即被释放;全局范围指变量或对象实例在本应用 系统内有效,只有在应用运行结束后其占用资源才被释放.

  1.设置全局范围的变量和对象实例
可以在本应用系统中任何页面的脚本中以 Application("GlobalVar") = GlobalVarValue
或 Set Application("MyObject") = Server.CreateObject("ObjectType") 的形式声明全局型的变 量和对象;也可以在Global.asa中以
<Object RunAt = Server Scope = Application ID = xxxx ProgID = yyyy>
</Object>
的形式声明全局型的对象.

  2.设置用户范围的变量和对象实例
可以在本应用系统的任何页面的脚本中以 Session("SessionVar") = SessionVarValue
或 Set Session("MyObject") = Server.CreateObject("ObjectType") 的形式声明用户型的变 量和对象;也可以在Global.asa中以
<Object RunAt = Server Scope = Session ID = xxxx ProgID = yyyy>
</Object>
的形式声明用户型的对象.

  3.设置页面范围的变量和对象实例
可以在本应用系统的某个页面的脚本中以 PageVar= VarValue 或
Set MyObject = Server.CreateObject("ObjectType") 的形式声明页面型的变量和对象;也可以在 页面中以
<Object RunAt = Server ID = xxxx ProgID = yyyy>
</Object>
的形式声明页面型的对象.

---------global.asa---------------------------------
<Script Language = VBScript RunAt = Server>
Sub Application_OnStart
Application.Lock
Application("UserCounter") = 0
Application("SystemBeginTime") = now
Application.UnLock
End Sub
</Script>
<Script Language = VBScript RunAt = Server>
Sub Session_OnStart
Application.Lock
Application("UserCounter") = Application("UserCounter") + 1
Application.UnLock
Session("UserEnterTime") = now
End Sub
</Script>
---------------aspapp.asp---------------------
<html>
<head><title>开发 ASP 应用系统</title>
</head>
<body>
<h3>系统开始运行时间为:<% = Application("SystemBeginTime") %></h3>
<hr>
<h3>用户进入系统时间为:<% = Session("UserEnterTime") %></h3>
<h3>你是第<% = Application("UserCounter") %>位访问系统的用户</h3>
</body>
</html>

(作者:王发军 wangfajun@163.net)