通过名称和索引访问项
通过使用项目名称可以
<%
Session.Co
Session.Co
Session.Co
%>
可以使用在集合中存储
<%= Session.Co
通过使用与项目关联的
<%= Session.Co
ASP 集合从 1 开始编号。当在集合中
通过使用速记的名称可
<%= Session("F
访问存储在 Applicatio
遍历集合
在集合的所有项目中遍
<%
'Declare a counter variable.
Dim Item
'For each item in the collection
For Each Item in Session.Co
Response.W
Next
%>
可以使用 VBScript 中的 For...Next
<%
'Declare a counter variable.
Dim Item
'Repeat the loop until the value of counter is equal to 3.
For Item = 1 to 3
Response.W
Next
%>
因为一般不知道存储在
<%
'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.Co
Response.W
Next
%>
可以在脚本中使用 for 语句在集合中循环。在
<%
var item, numitems;
numitems = Session.Co
for (item = 1; item <= numitems; item++) {
Response.W
}
%>
Microsoft JScript 3.0 引入了 Enumerator
<%
// Create an Enumerator
var mycoll = new Enumerator
//Iterate through the collection
while (!mycoll.a
var x = mycoll.ite
Response.W
mycoll.mov
}
%>
遍历带子关键字 (Subkeys) 的集合
脚本在单一 cookie 中嵌入相关值以减少在
可以列举 Request.Co
<%
'Declare counter variables
Dim Cookie, Subkey
'Display the entire cookie collection
For Each Cookie in Request.Co
Response.W
If Request.Co
'Display the subkeys
For Each Subkey in Request.Co
Response.W
Next
Else
Response.W
End If
Next
%>
遍历对象集合
Session 和 Applicatio
在遍历包含对象的集合
<%
For Each Object in Session.St
Session.St
Next
%>
ASP 集合有何不同之处?
尽管在本主题中讨论的
设置对象作用域
对象的作用域决定哪些
使用页作用域对象
在 ASP 页上用 Server.Cre
在用 Visual Basic 或 VBScript 编程时,要注意在 ASP 处理完该页之前不要释
Set myObj = Nothing
如果您在 ASP 页中包含了该语句,那
由于对象有页作用域,
<%
For I = 0 to 1000
Set Conn = Server.Cre
Conn.Open "connectio
Next
%>
总的来说,应该尽量避
<%
Set Conn = Server.Cre
For I = 0 to 1000
Conn.Open "connectio
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 文档不可用。)