您的位置:首页精文荟萃软件资讯 → ASP系列讲座(九)设置对象作用域

ASP系列讲座(九)设置对象作用域

时间:2004/10/7 19:17:00来源:本站整理作者:蓝点我要评论(0)

对象的作用域决定哪些脚本可以使用该对象。默认情况下,当您创建对象实例时,该对象具有页作用域。同一 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 文件中使用 标记,也可以在 ASP 页上使用 Server.CreateObject 方法创建具有会话作用域的对象实例。



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







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



<%= 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") %>

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



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

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



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



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



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

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



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



用户自定义的 JScript 对象

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



高级信息:性能问题

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



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



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

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

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

如果您已安装了 SDK 文档,您将会获得有关线程模型及其隐含的组件性能的详细信息。(在 Windows 95 及其后续版本中 SDK 文档不可用。)




相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3

最新文章 微信3.6.0测试版更新了微信支付漏洞会造成哪 360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗

人气排行 xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本