`
阅读更多
 大多数 ASP 内建对象支持集合。集合是存储字符串、数字、对象和其他值的地方。除了在存储或取出项目时集合会自动扩展与搜索外,集合与数组非常相近。与数组不同的是,集合被修改后,项目的位置将会移动。可以通过集合中项目的名称、索引或者通过在集合的所有项目中遍历访问项目。

通过名称和索引访问项目

通过使用项目名称可以访问集合中的具体项目。例如,Contents 集合拥有在 Session 对象中保存的所有变量。同样也拥有由 Server.CreateObject 创建的所有对象。假设在 Session 对象中存储了下列用户信息:

<%

Session.Contents("FirstName") = "Sam"

Session.Contents("LastName") = "Woo"

Session.Contents("Age") = 29

%>

可以使用在集合中存储项目时关联的名称访问项目。例如,下面的表达式返回字符串“Sam”:

<%= Session.Contents("FirstName") %>

通过使用与项目关联的索引或号码也可以访问项目。例如,下面的表达式检索存储在 Session 对象的第二个存储槽中的信息并且返回“Woo”:

<%= Session.Contents(2) %>

ASP 集合从 1 开始编号。当在集合中增加或删除项目时,与项目关联的索引将会改变。所以不能认为项目的索引始终不变。正如将在下面的主题中说明的那样,利用索引的访问一般用来遍历集合,或访问只读集合中的项目。

通过使用速记的名称可以访问项目。ASP 以特定的顺序搜索与对象关联的集合。如果在对象的集合中特定名称的项目只出现一次的话,可以消除该集合的名称:

<%= Session("FirstName") %>

访问存储在 Application 或 Session 对象中的项目时,消除集合名称一般是安全的。但是,对于 Request 对象,最好指定集合名称,因为该集合很可能包含重复的名称。

遍历集合

在集合的所有项目中遍历可以了解集合中存储的项目或修改项目。遍历集合时,必须提供集合名称。例如,可以使用 VBScript 中的 For...Each 语句访问存储在 Session 对象中的项目:

<%

'Declare a counter variable.

Dim Item

'For each item in the collection, display its value.

For Each Item in Session.Contents

Response.Write Session.Contents(Item) & "<BR>"

Next

%>

可以使用 VBScript 中的 For...Next 语句遍历集合。例如,要列出上例中存储在 Session 中的三个项目,可以使用下列语句。

<%

'Declare a counter variable.

Dim Item

'Repeat the loop until the value of counter is equal to 3.

For Item = 1 to 3

Response.Write Session.Contents(Item) & "<BR>"

Next

%>

因为一般不知道存储在集合中的项目个数,ASP 支持集合的 Count 属性,这个属性返回集合中的项目数。可以使用 Count 属性指定计数器的终值。

<%

'Declare a counter variable.

Dim Item

'Repeat this loop until the counter equals the number of items

'in the collection.

For Item = 1 to Session.Contents.Count

Response.Write Session.Contents(Item) & "<BR>"

Next

%>

可以在脚本中使用 for 语句在集合中循环。在 JScript 的 for 语句中使用 Count 属性时,为了收到更大的效果,应该将 Count 值分配给本地变量并使用该变量设置计数器终值。这样,脚本引擎就不需要每次循环都查寻 Count 的值。下面的例子展示了这个技巧:

<%

var item, numitems;

numitems = Session.Contents.Count;

for (item = 1; item <= numitems; item++) {

Response.Write(Session.Contents(item) + "<BR>")

}

%>

Microsoft JScript 3.0 引入了 Enumerator 对象。可以使用该对象遍历 ASP 集合。atEnd 方法指出了集合中是否还存在项目。moveNext 方法移动到集合中的下一个项目。

<%

// Create an Enumerator object

var mycoll = new Enumerator(Session.Contents);

//Iterate through the collection and display each item

while (!mycoll.atEnd()) {

var x = mycoll.item();

Response.Write(Session.Contents(x) + "<BR>");

mycoll.moveNext();

}

%>

遍历带子关键字 (Subkeys) 的集合

脚本在单一 cookie 中嵌入相关值以减少在浏览器和 Web 服务器之间传送的 cookie 数目。因此 Request 和 Response 对象的 Cookies 集合能够在单一项目中拥有多个值。这些子项目或子关键字可以被单个访问。只有 Request.Cookies 和 Response.Cookies 集合支持子关键字 (Subkeys)。Request.Cookies 只支持读操作;Response.Cookies 只支持写操作。

可以列举 Request.Cookie 集合中所有的 cookie 以及 Cookie 中所有的子关键字 (Subkeys)。但是,如果在没有子关键字 (Subkeys) 的 Cookie 上遍历子关键字,将不会产生任何结果。通过使用 .HasKeys 语法首先检查 cookie 是否含有子关键字 (Subkeys),就可以避免这种情况。下面的这个例子展示了这个技巧。

<%

'Declare counter variables

Dim Cookie, Subkey

'Display the entire cookie collection.

For Each Cookie in Request.Cookies

Response.Write Cookie & "<BR>"

If Request.Cookies(Cookie).HasKeys Then

'Display the subkeys

For Each Subkey in Request.Cookies(Cookie)

Response.Write Subkey & "=" & Request.Cookies(Cookie)(Subkey) & "<BR>"

Next

Else

Response.Write "No subkeys in this cookie <BR>"

End If

Next

%>

遍历对象集合

Session 和 Application 集合可以保存数量变量或者对象实例。Contents 集合拥有数量变量和通过调用 Server.CreateObject 生成的对象实例。StaticObjects 集合拥有在 Global.asa 文件中使用 HTML <OBJECT> 元素创建的对象。

在遍历包含对象的集合时,可以访问对象的标识符或对象的方法和属性。例如,假设应用程序使用一些对象创建用户帐号,而且每个对象有初始化方法,可以遍历 StaticObjects 集合来调用每个初始化方法:

<%

For Each Object in Session.StaticObjects

Session.StaticObjects(Object).InitializeUser

Next

%>

ASP 集合有何不同之处?

尽管在本主题中讨论的 ASP 集合与 Visual Basic 的 Collection 对象非常相似,但还是有些不同。ASP 集合支持 Count 属性和 Item 方法,但不支持 Add 和 Remove 方法。

设置对象作用域

对象的作用域决定哪些脚本可以使用该对象。默认情况下,当您创建对象实例时,该对象具有页作用域。同一 ASP 页中的任何脚本命令都能使用该页作用域的对象;当 ASP 页送回客户端时,该对象即被释放。对大多数对象来说,推荐的作用域是页作用域。您可以改变一个对象的作用域,使其可被其他页的脚本使用。本主题将解释如何使用页作用域的对象以及如何改变对象的作用域。

使用页作用域对象

在 ASP 页上用 Server.CreateObject 创建的对象在该页的生存期内一直存在。该对象对该页的任何脚本命令都是可访问的,当 ASP 处理完该页时,该对象即被释放。因此,对象具有该页的作用域或生命周期。

在用 Visual Basic 或 VBScript 编程时,要注意在 ASP 处理完该页之前不要释放对象。例如,以下语句经常用于通过将对象变量赋以 Nothing 值来释放对象:

Set myObj = Nothing

如果您在 ASP 页中包含了该语句,那么任何使用 myObj 的企图都将会返回一个预期的错误代码。但在内部,即使在对象释放以后,ASP 仍保留对它的引用。当您在脚本中不能使用对象时,对象的资源直到 ASP 处理完页之后才释放。同样,如果您通过创建另一个对象实例并将其赋给已使用过的对象变量来释放该对象时,ASP 将保留对原对象实例的引用。对大多数脚本来说,创建多个对象可能不会产生问题,但如果对象使用共享资源,比如数据库连接,就有可能出现问题。

由于对象有页作用域,所以不要依靠手工释放的对象。例如,以下的循环创建 1001 个 Connection 对象,它将能打开大多数的连接甚至于一个大型的 SQL server:

<%

For I = 0 to 1000

Set Conn = Server.CreateObject("ADODB.Connection")

Conn.Open "connection string"

Next

%>

总的来说,应该尽量避免在一个循环内部创建对象。如果无法避免,您应该手工释放被对象使用过的资源。如果 Connection 对象仅被创建一次,且数据资源的物理连接在每个循环中被打开然后关闭,那么上例将会正常运行:

<%

Set Conn = Server.CreateObject("ADODB.Connection")

For I = 0 to 1000

Conn.Open "connection string"

Conn.Close

Next

%>

为对象赋予会话作用域

在应用程序中,对于每个新会话,都会创建 session-scope 对象,并且在会话结束后会将其释放。因此,每个活动的会话都有一个对象。会话作用域用于从多个脚本中调用的对象,但只影响一个用户会话。您可以只在需要时才为对象赋予会话作用域。如果确实需要使用会话作用域,那么就必须了解提供对象的组件的线程模型,因为它影响性能和对象的安全环境。详细信息,请参阅本主题的“高级信息:性能问题” 。

要为对象赋予会话作用域,请将对象存储在 ASP Session 内建对象中,您既可以在 Global.asa 文件中使用 <OBJECT> 标记,也可以在 ASP 页上使用 Server.CreateObject 方法创建具有会话作用域的对象实例。

在 Global.asa 文件中,您可用扩展了 RUNAT 属性(必须设置为 Sever)和 SCOPE 属性(必须设置为 Session)的 ;OBJECT> 标记。以下示例创建一个 Ad Rotator 对象的会话作用域实例:

<OBJECT RUNAT=Server SCOPE=Session ID=MyAd PROGID="MSWC.Adrotator">

</OBJECT>

一旦您在 Session 对象中存储了对象,您就可以从应用程序的任何页中访问该对象。下面的语句使用上例中由 <OBJECT> 标记创建的对象实例:

<%= MyAd.GetAdvertisement("addata.txt") %>

在 ASP 页上,您也可以使用 Server.CreateObject 方法将对象存储在 Session 内建对象中。以下示例在 Session 对象中存储 Ad Rotator 对象的一个实例。

<% Set Session("MyAd") = Server.CreateObject("MSWC.Adrotator") %>

要显示广告,您首先应该获取存储在 Session 对象中的 Ad Rotator 对象的实例,然后才能调用方法来显示对象:

<% Set MyAd = Session("MyAd") %>

<%= MyAd.GetAdvertisement("addata.txt") %>

在用 <OBJECT> 标记声明的对象被某个 .asp 文件中的脚本命令引用之前,ASP 并不创建其实例。Server.CreateObject 方法则立即创建该对象实例。因此,对会话作用域对象来说,使用 <OBJECT> 标记要比 Server.CreateObject 属性更好。

为对象赋予应用程序作用域

application-scope 对象是在应用程序启动时就创建的对象的单个实例。该对象由所有客户端请求共享。仅在极少数情况下,您才需要为对象赋予应用程序作用域。一些实用程序对象,例如计数器等,可能需要应用程序作用域。但一般来说,您可用在下一节中建议的替代方案。另外,线程模型会影响性能和对象安全环境(请参阅本主题的“高级信息:性能问题”)。

要为对象赋予应用程序作用域并将其存储在 ASP Application 内建对象中,既可以使用 Global.asa 文件中的 <OBJECT> 标记,也可以使用 ASP 页上的 Server.CreateObject 方法创建应用程序作用域的对象实例。

在 Global.asa 文件中,您可用扩展了 RUNAT 属性(必须设置为 Sever)和 SCOPE 属性(必须设置为 Session)的 ;OBJECT> 标记。在 ASP 页中,您可以使用 Server.CreateObject 将对象实例存储在 Application 内建对象中。关于使用 <OBJECT> 标记和 Server.CreateObject 的示例,请参阅上一节“为对象赋予会话作用域”。

会话和应用程序作用域的替代方案

仅当需要时,才能为对象赋予会话或应用程序作用域。因为在会话或应用程序结束运行之前,这些对象会一直保留。它们会占用内存或数据库连接等资源,这些资源可能会在其他方面更有用。另外,组件的线程模型会影响您从中所创建的对象的性能,尤其是那些具有会话或应用程序作用域的对象。

在很多情况下,比创建应用程序或会话作用域对象更好的方法就是利用会话或应用程序作用域变量,将信息传递给在网页一级创建的对象。例如,不要为 ADO Connection 对象赋予会话或应用程序作用域,因为它创建的连接会在相当长的一段时间一直保持打开而此时脚本已不再使用 ODBC 连接共享。但您可以将 ODBC 连接字符串存储在 Session 或 Application 内建对象中,并在网页上从创建的 Connection 对象实例中获取该字符串。通过这种方式,您可以存储在会话或应用程序名称空间中频繁使用的信息,但只有在需要时才创建用该信息的对象。关于作用域变量的详细信息,请参阅“使用变量和常量”。

用户自定义的 JScript 对象

您可以通过定义一个创建和初始化新对象的属性和方法的构造函数来创建自己的 JScript 对象。当脚本用 new 操作符来调用构造函数时,就会创建该对象的实例。ASP 脚本支持用户自定义的对象,当具有页作用域时,后者正常运行。但如果为用户自定义的 JScript 对象赋予应用程序或会话作用域,将可能影响该对象的功能。特别是,若一个对象具有会话或应用程序作用域,则其他页的脚本可以获取该对象的属性,但是却不能调用其方法。

高级信息:性能问题

组件的线程模型可能会影响 Web 站点的性能,一般来说,带有 Both 标记的对象是推荐在所有的 ASP 脚本中使用的对象,尤其是在 Session 和 Application 对象中。不推荐使用单线程对象。

因为您可能不会始终控制所用对象的线程模型,所以,以下的指导可帮助您获得最佳性能:

页作用域对象。带有 Both 或 Apartment 标记的对象将给予您最佳的性能。

应用程序作用域对象。一般来说,应避免在 Application 对象中放置对象。如果确需使用应用程序作用域对象,您会从结合了 FreeThreadedMarshaler 的带有 Both 标记的对象中获得最佳性能。您既可以用 <OBJECT> 标记也可以用 Server.CreateObject 方法在 Application 对象中存储带有 Single、Free 或 Both 标记的对象。您必须用单元线程对象来使用 <OBJECT> 标记。

会话作用域对象。带有 Both 标记的对象将为您提供最佳性能。用单线程或单元线程对象会导致 Web 服务器将会话锁定在一个线程上。自由线程对象不会锁定会话,但运行速度不高。在 Session 对象中,您可以用 <OBJECT> 标记或 Server.CreateObject 方法存储对象 。

如果您已安装了 SDK 文档,请参阅“创建 ASP 组件”,您将会获得有关线程模型及其隐含的组件性能的详细信息。( 在 Windows 95 及其后续版本中 SDK 文档不可用。)
分享到:
评论

相关推荐

    ASP.NET中的集合对象

    - 增加元素:可以使用Add方法向集合中添加元素,确保正确处理索引和键值。 - 访问元素:使用索引器(如ArrayList的this[int index])或键(如Dictionary的this[TKey key])访问元素。 - 删除元素:使用Remove方法...

    十分经典的ASP代码大集合

    这个"十分经典的ASP代码大集合"显然是一份包含了多种ASP编程实用代码的资源,对于学习和理解ASP编程有着重要的参考价值。下面我们将深入探讨一些ASP编程的核心知识点。 1. **脚本语言基础**:ASP主要支持VBScript和...

    asp常见漏洞集合 ASP漏洞分析和解决方法

    asp常见漏洞集合 ASP漏洞分析和解决方法ASP主件中的安全问题Carello Web 使 ASP 源码暴露 (APP,缺陷)MS IIS server的ASP安全缺陷 (MS,缺陷)MS IIS虚拟主机ASP源码泄露 (MS,缺陷)给你的FileSystemObject对象加把锁跨...

    asp网页使用datalist控件代码

    本教程将深入探讨如何在ASP网页中使用`DataList`控件,以及与之相关的编程概念。 首先,`DataList`控件是ASP.NET Web Forms中的一员,它主要用于显示数据集合,如数据库查询结果。与`Repeater`控件类似,`DataList`...

    深入挖掘ASP.NET 2.0系列课程(9):ASP.NET中的集合对象

    在本课程中,我们将深入探讨ASP.NET 2.0中的集合对象,这是一个极其重要的主题,因为集合对象在构建动态Web应用程序时起着核心作用。集合是.NET Framework中用于存储和管理一组相关对象的数据结构,ASP.NET 2.0也不...

    ASP 常用函数集合

    ASP 常用函数 集合! 汇总

    在asp中对象 属性 方法 集合这四者有什么关系.doc

    在 ASP (Active Server Pages) 中,对象、属性、方法和集合是构成动态网页开发的核心概念。它们之间的关系紧密,共同构建了ASP程序的基础框架。理解这些概念有助于更好地编写和调试ASP代码。 首先,我们来详细解释...

    ASP.NET MVC 项目集合.zip

    在这个"ASP.NET MVC 项目集合.zip"压缩包中,可能包含了多个ASP.NET MVC项目的源代码,这对于学习和理解ASP.NET MVC的开发实践非常有帮助。下面,我们将深入探讨ASP.NET MVC的关键概念和技术。 1. **模型(Model)*...

    ASP参考手册大全6本集合.chm

    6. **错误处理与调试**:学习如何处理ASP中的错误和异常,以及如何使用On Error语句进行错误处理,了解调试工具和技巧。 7. **ASP与HTML的结合**:了解如何在ASP页面中嵌入HTML代码,以创建动态的网页布局和交互...

    Asp.NET技术集合

    以上内容涵盖了Asp.NET技术集合中的主要知识点,这些技术不仅适用于初学者,也是经验丰富的开发者构建复杂Web应用的重要工具。通过深入理解和掌握这些概念,开发者能够构建出高效、安全且易于维护的Asp.NET应用程序...

    ASP属性集合详解版

    在“ASP属性集合详解版”中,很可能包含了以上各个对象的详细属性和方法解释,以及使用示例。`说明.htm`和`readme.txt`可能提供了进一步的指南或介绍,帮助理解这些概念。通过深入学习和实践,你可以掌握ASP编程的...

    asp.net源码集合

    这个源码集合涵盖了多个ASP.NET开发的关键领域,包括购物车、图书馆管理、在线问卷、投票系统以及万能打印模块,这些都是Web开发中的常见功能模块。 首先,我们来详细探讨ASP.NET购物车模块。购物车是电子商务网站...

    ASP开发中有用的function集合

    本文将详细解析一个ASP开发中的实用函数集合,涵盖防止外部提交、IP过滤、获取注册码、限制上传文件类型以及检测字符串是否仅包含英文和数字等功能。这些函数在实际项目中具有重要意义,能够提高网站的安全性、功能...

    asp.net网文大集合

    在ASP.NET中,使用ADO.NET连接SQL Server并检索数据的基本步骤如下: 1. **创建Connection对象**:使用正确的连接字符串初始化Connection对象。 2. **打开连接**:调用Connection对象的Open方法建立连接。 3. **...

    ASP.NET大型项目集合

    在ASP.NET中,可以使用 Membership 和 Role Provider 进行用户身份验证和角色管理,同时利用ASP.NET MVC的视图模型和控制器来实现交互逻辑。 5. 图书管理系统:图书管理系统可能包含书籍分类、借阅、归还、逾期提醒...

    ASP属性集合详解版(非常全)

    这篇“ASP属性集合详解版”资料,据称包含了1400余页的详细内容,涵盖了ASP中各种属性的全面解析,是学习和查阅ASP属性的宝贵资源。WDL华康格式可能是一种特定的文档格式,因此需要对应的阅读器才能打开。如果你没有...

    ASP漏洞集合111

    这个"ASP漏洞集合111"可能是对一系列已知ASP安全问题的收集,对于那些正在使用或学习ASP的人员来说,了解这些漏洞是非常重要的,可以帮助提升他们构建和维护的网站的安全性。 首先,我们要明白ASP漏洞主要分为两类...

    ASP.NET课程设计项目集合

    在这个"ASP.NET课程设计项目集合"中,你可以找到一系列使用ASP.NET技术实现的项目,这些项目可能涵盖了各种功能和应用场景,非常适合学生进行课程设计或编程练习。 首先,ASP.NET提供了多种开发模型,如Web Forms、...

    Asp.net CheckBoxList操作集合

    通过查看和学习这些文件,你可以更深入地理解ASP.NET中CheckBoxList控件的使用和操作。 以上就是关于ASP.NET中CheckBoxList控件的选中项操作、全选、取消选中以及反选的方法。在实际项目中,可以根据需求进行自定义...

    ASP.NET 2.0 AJAX 组件安装软件集合

    总的来说,ASP.NET 2.0 AJAX组件安装软件集合是一个不可或缺的开发资源,它简化了在ASP.NET环境中使用AJAX技术的过程。通过掌握这些组件和工具,开发者能够创建更加动态和高效的Web应用程序,提供更优秀的用户体验。...

Global site tag (gtag.js) - Google Analytics