当前位置:首页 » 网站技术 » ASP

使用集合 [ 二 ]

...

  遍历对象集合

  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文档不可用。)

继续阅读
Active Server Page 内建对象
向浏览器发送内容
向浏览器发送内容[2]
包含文件
访问数据库 [1]
访问数据库 [2]
访问数据库 [3]
调试 ASP 脚本 [1]
调试 ASP 脚本 [2]
发表评论

昵称:
最新评论
暂时没有评论!