灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:4285回复:0

[系统教程]ASP教程新手培训(9)

楼主#
更多 发布于:2012-09-10 21:24



      在应用程序中,对于每个新会话,都会创建 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 文档不可用。)

喜欢0 评分0
游客

返回顶部