程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> ASP編程 >> ASP入門教程 >> ASP系列講座(九)設置對象作用域

ASP系列講座(九)設置對象作用域

編輯:ASP入門教程
對象的作用域決定哪些腳本可以使用該對象。默認情況下,當您創建對象實例時,該對象具有頁作用域。同一 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 文檔,您將會獲得有關線程模型及其隱含的組件性能的詳細信息。(在 Windows 95 及其後續版本中 SDK 文檔不可用。)
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved