解析ASP的Application和Session对象
在已经发表的系列文章中我们已经讨论了两个ASP对象:Application对象和Session对象,因此能够访问Application对象和Session对象提供的集合、方法、属性和事件。本节将从程序设计的角度对这两个对象进行研究。
・ 当载入ASP DLL并响应对一个ASP网页的第一个请求时,创建Application对象。该对象提供一个存储场所,用来存储对于所有访问者打开的所有网页都可用的变量和对象。 ・ 当访问者首次从站点请求一个ASP页面时,为他创建一个Session对象,并保持有效直到缺省的超时周期(或由脚本确定的超时周期)。该对象提供一个存储场所,用来存储仅仅对该访问者在会话的活动期间打开的网页可用的变量和对象。
关系
1、ASP的Application对象成员概述
本节说明Application对象的集合、方法和事件(Application对象没有属性)。在下一节对Session对象(具有属性)进行同样的说明。然后将继续探讨使用这些对象所完成的任务,更详细地说明每个对象的各成员如何进行工作。
1. Application对象的集合
Application对象提供了两个集合,可以用来访问存储于全局应用程序空间中的变量和对象。集合及说明如下所示:
表Application对象的集合及说明
集 合 | 说 明 | Contents | 没有使用<OBJECT>元素定义的存储于Application对象中的所有变量(及它们的值)的一个集合。包括Variant数组和Variant类型对象实例的引用 | StaticObjects | 使用<OBJECT>元素定义的存储于Application对象中的所有变量(及它们的值)的一个集合 | | |
2. Application对象的方法
Application对象的方法允许删除全局应用程序空间中的值,控制在该空间内对变量的并发访问。方法及说明如下表所示:
表Application对象的方法及说明
方 法 | 说 明 | Contents.Remove(“variable_name”) | 从Application.Content集合中删除一个名为variable_name的变量 | Contents.RemoveAll() | 从Application.Content集合中删除所有变量 | Lock() | 锁定Application对象,使得只有当前的ASP页面对内容能够进行访问。用于确保通过允许两个用户同时地读取和修改该值的方法而进行的并发操作不会破坏内容 | Unlock() | 解除对在Application对象上的ASP网页的锁定 |
注意,在运行期间不能从Application.StaticObjects集合中删除变量。
3. Application对象的事件
Application对象提供了在它启动和结束时触发的两个事件,如下表所示:
表Application对象的事件及说明
事 件 | 说 明 | OnStart | 当ASP启动时触发,在用户请求的网页执行之前和任何用户创建Session对象之前。用于初始化变量、创建对象或运行其他代码 | OnEnd | 当ASP应用程序结束时触发。在最后一个用户会话已经结束并且该会话的OnEnd事件中的所有代码已经执行之后发生。其结束时,应用程序中存在的所有变量被取消 |
ASP的Session对象成员概述
本节概述Session对象的所有成员。
1. Session对象的集合
Session对象提供了两个集合,可以用来访问存储于用户的局部会话空间中的变量和对象。这些集合及说明如下表所示:
表 Session对象的集合及说明
集 合 | 说 明 | Contents | 存储于这个特定Session对象中的所有变量和其值的一个集合,并且这些变量和值没有使用<OBJECT>元素进行定义。包括Variant数组和Variant类型对象实例的引用 | StaticObjects | 通过使用<OBJECT>元素定义的、存储于这个Session对象中的所有变量的一个集合 |
2. Session对象的特性
Session对象提供了四个属性。这些属性及说明如下表所示:
表3-7 Session对象的属性及说明
属 性 | 说 明 | CodePage | 读/写。整型。定义用于在浏览器中显示页内容的代码页(Code Page)。代码页是字符集的数字值,不同的语言和场所可能使用不同的代码页。例如,ANSI代码页1252用于美国英语和大多数欧洲语言。代码页932用于日文字 | LCID | 读/写。整型。定义发送给浏览器的页面地区标识(LCID)。LCID是唯一地标识地区的一个国际标准缩写,例如,2057定义当前地区的货币符号是’£’。LCID也可用于FormatCurrency等语句中,只要其中有一个可选的LCID参数。LCID也可在ASP处理指令<%…%>中设置,并优先于会话的LCID属性中的设置。本章后面提供一个ASP处理指令的列表 | SessionID | 只读。长整型。返回这个会话的会话标识符,创建会话时,该标识符由服务器产生。只在父Application对象的生存期内是唯一的,因此当一个新的应用程序启动时可重新使用 | Timeout | 读/写。整型。为这个会话定义以分钟为单位的超时周期。如果用户在超时周期内没有进行刷新或请求一个网页,该会话结束。在各网页中根据需要可以修改。缺省值是10min。在使用率高的站点上该时间应更短 |
3. Session对象的方法
Session对象允许从用户级的会话空间删除指定值,并根据需要终止会话。Seesion对象的方法及说明如下表所示:
表Session对象的方法及说明
方 法 | 说 明 | Contents.Remove(“variable_name”) | 从Session.Content集合中删除一个名为variable_name的变量 | Contents.RemoveAll() | 从Session.Content集合中删除所有变量 | Abandon() | 当网页的执行完成时,结束当前用户会话并撤消当前Session对象。但即使在调用该方法以后,仍可访问该页中的当前会话的变量。当用户请求下一个页面时将启动一个新的会话,并建立一个新的Session对象(如果存在的话) 注意,在运行期间不能从Session.StaticObjects集合中删除变量。 |
4. Session对象的事件
Session对象提供了在启动和结束时触发的两个事件,如表3-9所示:
表3-9 Session对象的事件及说明
事 件 | 说 明 | OnStart | 当ASP用户会话启动时触发,在用户请求的网页执行之前。用于初始化变量、创建对象或运行其他代码。 | OnEnd | 当ASP用户会话结束时触发。从用户对应用程序的最后一个页面请求开始,如果已经超出预定的会话超时周期则触发该事件。当会话结束时,取消该会话中的所有变量。在代码中使用Abandon方法结束ASP用户会话时,也触发该事件 |
使用Application和Session的事件
ASP的Application和Session对象体现了其他ASP内置对象所没有的特征――事件。然而,正像在前面的对象成员表中看到的那样,这些都是ASP会话和应用程序的工作相联系的事件。
1. Application和Session的事件处理器 每当一个应用程序或会话启动或结束时,ASP触发一个事件。可以通过在一个特殊的文件中编写普通的脚本代码来检测和应答这些事件,这个文件名为global.asa,位于一个应用程序的根目录中(对于缺省的Web网站是/InetPub/WWWRoot目录,或是作为一个实际应用程序定义的一个文件夹)。这个文件可以包含一个或多个HTML的<OBJECT>元素,用于创建将在该应用程序或用户会话内使用的组件实例。
下面的代码是global.asa文件的一个例子。我们只关注<OBJECT>元素以及以Set关键字开始的那些代码行:
<!-- Declare instance of the ASPCounter component with application-level scope //--> <OBJECT ID=”ASPCounter” RUNAT=”Server” SCOPE=”Application” PROGID=”MSWC.Counters”> </OBJECT>
<!-- Declare instance of the ASPContentLimk component with session-level scope //--> <OBJECT ID=”ASPContentLink” RUNAT=”Server” SCOPE=”Session” PROGID=”MSWC.NextLink”> </OBJECT>
<SCRIPT LANGUAGE=”VBScript” RUNAT=”Server”>
Sub Application_onStart() ‘Create an instance of an ADO Recordset with application-level scope Set Application(“ADOConnection”)= Server.CreateObject(“ADODB.Connection”) Dim varArray(3) ‘Create a Variant array and fill it VarArray(0) = “This is a” VarArray(1) = “Variant array” VarArray(2) = “stored in the” VarArray(3) = “Application object” Application(“Variant_Array”) = varArray‘Store it in the Application Application(“Start_Time”) = CStr(Now) ‘Store the date/time as a string Application(“Visit_Count”) = 0 ‘Set Counter variable to zero End Sub
Sub Application_onEnd() Set Application(“ADOConnection”) = Nothing End Sub
Sub Sesson_onStart() ‘Create an instance of the AdRotator component with session-level scope Set Session(“ASPAdRotator”) = Server.CreateObject(“MSWC.AdRotator”) Dim varArray(3) ‘Create a Variant arry and fill it VarArray(0) = “This is a” VarArray(1) = “Variant array” VarArray(2) = “stored in the” VarArray(3) = “Session object” Session(“Variant_Array”) = varArray ‘Store it in the Session Session(“Start_Time”) = CStr(Now) ‘Store the date/time as a string ‘We can access the contents of the Request and Response in a Session_onStart ‘event handler for the page that initiated the session. This is the *only* ‘place that the ASP page context is available like this. ‘as an example, we can get the IP address of the user: Session(“Your_IP_Address”) = Request.ServerVariables(“REMOTE_ADDR”) Application.Lock intVisits = Application(“Visit_Count”) +1 Application(“Visit_Count”) = intVisits Application.Unlock End Sub
Sub Session_onEnd() Set Session(“ASPAdRotator”) = Nothing End Sub </SCRIPT> |
因为这个global.asa文件用于本章中的示例页面,所以将需要将该文件放到Web网站的根目录中,或者放到已配置为一个虚拟应用程序的目录中,并且在该目录中包含有其他示例文件。
读取和存储值
注意上面的例子怎样读取Application和Session的变量,与在Request和Response对象的集合中所采取的方式相同。设置这些变量的值:
Application(“variable_name”) = variable_value Application(“variable_name”) = variant_array_variable_name Set Application(“variable_name”) = object_reference |
获取这些变量的值:
variable_value = Application(“variable_name”) variant_array_variable = Application(“variable_name”) Set object_reference = Application(“variable_name”) |
当然,对于Session对象可采取同样的方法。
可以看到,当从一个Session事件处理器访问时,怎样“锁定”(Lock)和“解锁”(unlock)该Application对象;当从一个ASP网页访问时,需要进行相同的处理。用Application事件内的代码访问Application对象中的值时,不要求这么做。这是因为在任何应用程序中只有一个Application对象的实例,并且其事件处理器的代码只在没有活动的用户会话时进行。
也可以看到一个基本的用户会话计数器是如何实现的。这里使用一个应用程序级的变量Visit_count,当新的会话启动时它就自动增加。 一般也不限制简单地把值保存到Application或Session对象中。例如,Web开发者的Web站点在http://webdev.wrox.co.uk上,有相应的一个global.asa文件,当一个新的会话启动时该文件就在服务器上的数据库中写入相应的条目,数据细节从Request.ServerVariables集合中获取。这提供了一个基本的方法统计访问者的数量,并收集访问者的一些基本信息。 |