第5章 指令碼運行期庫對象

來源:互聯網
上載者:User
第5章 指令碼運行期庫對象
       前面章節已經介紹了ASP如何使用在伺服器上定義的對象的執行個體,充分利用所提供的方法和屬性擴充ASP的效能。有一系列的對象可供使用,包括指令碼對象和標準IIS/ASP安裝的組件,以及自己建立的或者從其他供應商處購買的對象。也可以在互連網上各種網站免費下載對象,並在自己的頁面上使用。
       這一章將討論由ASP指令碼環境提供的一般稱為“指令碼運行期庫”(Scripting Runtime Library)的對象。這些對象通過正在使用的指令碼引擎提供給代碼,與ASP指令碼程式一起完成多種實用任務。
       還有一種組件是“活動伺服器組件”(Active Server Component),通過單獨的ActiveX DLL檔案或者其他檔案來實現。後面章節將討論相關內容。
       當然,需要研究如何在頁面上使用這些對象。在前一章中,我們已經瞭解了伺服器如何提供一個方法來執行個體化對象,本章將深入討論這個內容。
       本章將介紹以下內容:
       ? 指令碼引擎以指令碼對象方式提供了什麼。
       ? 如何建立指令碼對象及其他組件執行個體。
       ? 指令碼對象的成員和屬性概要。
       ? 如何在代碼中使用指令碼對象。
       下面開始研究指令碼對象的定義。

5.1 指令碼對象的定義
       前面章節研究了ASP物件模型。
       物件模型是用來理解系統的各個部分相互關係的一種基本手段。
       ASP物件模型提供了一種結構,用來作為一個整體操縱HTTP請求、響應及ASP環境中的不同元素。例如,我們已經看到,如何通過查看ASP請求對象的cookie集合,得到來自瀏覽器的任何cookie值。
       我們使用的指令碼語言也有物件模型。然而,指令碼語言提供的這一物件模型,不同於由ASP DLL直接提供的物件模型,指令碼對象是由Microsoft指令碼運行期庫(scrrun.dll)提供的,安裝預設的Active Scripting指令碼引擎時,也安裝了Microsoft指令碼運行期庫。

5.1.1 不同類型的對象和組件
       不要對“對象”和“組件”這兩個名詞感到困惑,在一定範圍內它們都可以作為ASP的一部分,同樣可以通過COM對其進行訪問。從概念上可以將它們分為四類:
       ? ASP內建對象,如ObjectContext、Request、Response、Application、Session、Server和ASPError。本書的第2章到第4章已經研究了這些內容。
       ? 指令碼對象。通過指令碼運行期庫使用,如Dictionary、FileSystem和TextStream。這是本章要討論的對象。
       ? 可安裝的組件。由Microsoft在IIS 5.0和ASP 3.0標準安裝時提供。這將在下一章討論。
       ? 其他組件。從其他獨立廠商購買的、在網站上發現的或者自己建立的組件。還有一些其他的由Windows服務或產品提供的組件,如Windows Scripting Host。在本書的附錄中提供了相應的列表,本書專門有一部分章節講述如何構建自己的組件。

5.1.2 VBScript和Jscript指令碼對象
       作為指令碼運行期庫的一部分,Microsoft提供三個主要的對象:
       ? Dictionary對象提供一個極為有用的儲存物件,它用來儲存值,通過對象的名字而不是其索引進行訪問和引用。例如,對於儲存從ASP Request對象中檢索到的成對的名稱和數值,這是非常合適的。
       ? FileSystemObject對象提供了對伺服器底層檔案系統的訪問(在用戶端上使用IE 5.0,與名為“Hypertext Application(HTA)”的特殊類型的頁面協同使用)。可用FileSystemObject對象遍曆電腦的本地及網路的磁碟機、檔案夾和檔案。
       ? TextStream對象提供對儲存在磁碟上檔案的訪問,用於同FileSystemObject對象協同使用。TextStream對象能夠讀出或寫入文本(順序的)檔案,並僅能通過FileSystemObject對象進行執行個體化,所以人們常常認為TextStream對象是FileSystemObject對象的子物件。
       FileSystemObject對象是其他一系列用來與檔案系統互動的對象和集合的“父代”。該對象提供了對象的三個集合:Drives、Folders和Files集合,每個集合分別是相應的Drive、Folder和File對象的集合。它們用來進行磁碟上的磁碟機、檔案夾(目錄)和檔案的遍曆和定位。對象間的關係5-1所示:
[img]http://dave_lu.myetang.com/asppic/asp79.jpg[/img]
圖5-1  指令碼運行期庫中對象間的關係
       下面,將依次介紹這些對象和集合,以及如何使用它們。然而,首先要理解對象執行個體與組件的建立或執行個體化方式之間的差異。這是下一節的主要內容。

5.2 建立對象生組件執行個體
       建立指令碼運行期庫對象的執行個體與建立任何其他對象和組件的執行個體化方式完全相同。可使用ASP Server對象提供的CreateObject方法(確保對象建立在當前頁面的環境內),或者使用一個<OBJECT>元素。我們將研究這兩種方法,究竟採用那種方法依賴於頁面的需要。

5.2.1 使用Server.CreateObject方法
       正如在研究Server對象的時候看到的,組件或其他對象執行個體可根據它們的ProgID來建立:
       <%
       Dim objThis
       Set objThis = Server.CreateObject(“ADODB.Connection”)
       %>
       ProgID字串“正式的”格式是“供應商.組件.版本”,供應商的名字和版本是可選的。通常ProgID只包含前兩部分(如上例)。少數供應商在ProgID中設定版本編號,這將避免向後相容的新版本使用同樣的ProgID,這要求改變ASP頁面才能使用新版本。

5.2.2 使用<OBJECT>元素
       可以使用標準的HTML<OBJECT>元素通過增加RUNAT參數並指定其值為“SERVER”來在伺服器上建立一個組件執行個體。另外,通常是提供對象的ProgID字串而不是數位ClassID:
       <OBJECT ID=”objThis” RUNAT=”SERVER” PROGID=”This.Object”>
              <PARAM NAME=”param1” VALUE=”value1”>
              <PARAM NAME=”param2” VALUE=”value2”>
       </OBJECT>
       如果上面指令碼的對象有相應的屬性可在指令碼中使用,在<OBJECT>元素內可通過<PARAM>元素進行設定,就像通常在HTML頁面中所做的一樣。在ASP中使用<OBJECT>元素時不要求CODEBASE屬性,當其不可用時,伺服器不會試圖下載以及安裝對象或組件。
1.  指定一個ClassID
另外,可以指定想要建立的對象或組件的ClassID。在不知道目標機安裝了什麼其他組件的情況下,這是非常有用的。例如在用戶端上的瀏覽器的頁面上執行個體化組件時。
在理論上,組件的ProgID(文本“供應商.組件”)不應該相互衝突,應該是唯一的。然而,這不是無懈可擊的。有可能美國北方的一個供應商與希臘小島上的一個供應商同名。但是,使用ClassID識別訪問時,因為ClassID是唯一的,同名情況就不會發生。
如果決定使用對象或組件的ClassID,應將其放入CLASSID屬性中,而不是PROGID屬性。如:
<OBJECT ID=”objThis” RUNAT=”SERVER”
              CLASSID=”clsid:892D6DA7-E0F9-11D2-B2E9-00105A42AF30”>
       <PARAM NAME=”param1” VALUE=”value1”>
       <PARAM NAME=”param2” VALUE=”value2”>
</OBJECT>
但在自己的伺服器上執行個體化對象時,應該知道對象和組件的安裝方式。這樣在ASP代碼中建立對象執行個體時,可以安全地使用ProgID。這就是ClassID很少在ASP頁面內使用的原因。然而,因為ProgID用於尋找ClassID,如果願意也可以用組件或對象的ClassID代替ProgID。
2.  設定對象執行個體的範圍
預設情況下,所有ASP頁面中建立的對象與組件執行個體(無論用Server.CreateObject方法或<OBJECT>元素)都有頁面內的範圍(page scope)。這意味著,對象與組件只有該頁在ASP上運行時才存在,當頁面完成並且把結果發送到用戶端以後就自動地取消了。
然而,如果在global.asa檔案(它存在於網站或虛擬應用程式的根目錄)中放置<OBJECT>聲明,可以將對象或組件的範圍指定為應用程式或會話範圍。
(1)    在應用程式層範圍建立對象
通過設定SCOPE屬性為“APPLICATION”,建立應用程式層範圍對象:
<OBJECT ID=”objThis” RUNAT=”SERVER” PROGID=”This.Object”
       SCOPE=”APPLICATION”>
</OBJECT>
應用程式開始時建立了對象執行個體,即一旦使用者從虛擬應用程式的目錄請求一個頁面,就建立對象執行個體。對於預設Web網站,這可以是網站上的任一目錄。直到應用程式結束(最後的使用者會話結束)前,對象執行個體一直存在,並且可以被虛擬應用程式或網站目錄內任一頁面內的任意使用者引用和使用。
(2)    在會話層範圍建立對象
如果想建立由單個使用者使用的對象執行個體,其範圍為他訪問的所有頁面,可建立會話層範圍對象。這通過將SCOPE屬性設定為“SESSION”來實現:
<OBJECT ID=”objThis” RUNAT=”SERVER” PROGID=”This.Object”
SCOPE=SESSION”>
</OBJECT>
對象一旦被引用就被建立,引用是由使用者從虛擬應用程式或網站載入的頁面內的程式碼完成的(在global.asa檔案中有<OBJECT>聲明)。當使用者會話生命週期結束並被取消時,它引用的對象執行個體也就取消了。
(3)    關於範圍和狀態
使對象執行個體的範圍為全域的或者為使用者會話全域環境看起來是一個好主意,但在實際使用時有些問題需要考慮,其中之一是在使用者的許多請求之間能夠有效地保護對象的狀態。換句話說,可以設定對象的一些屬性,它們對使用的所有頁面是共用的。因為不必每次都建立新的執行個體並設定其屬性,所以這看起來是個較好的辦法。
事實上,微軟建議一般情況下不要這樣做,這一思想是傳統程式設計思想的殘餘。在Web上,要面對的最大問題是伺服器以及Web應用程式及所提供的動態網頁如何應付數以百萬計的網站訪問者。將組件執行個體駐留在記憶體中等待一個特定使用者的頁面請求,對可能有幾百個使用者同時瀏覽的網站來說,這樣做不能有效地使用資源。
Windows 2000提供新的COM+運行期特性,它能夠處理組件的建立、緩衝和使用,採用一種輸送量最大化但所佔伺服器資源最小化的方式。對象執行個體儲存在哪裡和儲存多久的問題,最好由作業系統自己完成,而不是由程式員決定。
也就是說,在頁面內需要的地方建立對象執行個體,當頁面終止時讓其消失。COM+整理這些片段,自動處理背景一些複雜工作。如果要瞭解有關這方面的內容,第14章比較詳細地研究了組件的建立。
當然,在某種情況下,我們可能要求一個對象具有應用程式層和會話層的範圍,尤其是在頁面請求間儲存狀態時。在後面討論Dictionary對象時,將有一個這方面的執行個體。

5.2.3  Server.CreateObject與<OBJECT>的區別
       Server.CreateObject方法立即建立一個對象執行個體。在大多數情況下這也是我們所希望的。而<OBJECT>元素只有首次引用一個對象時才建立指定的對象執行個體。因此如果在代碼中停止使用該對象,則不建立該對象執行個體。
       如果代碼只在某種情況下使用這個對象(可能依賴於請求參數的值),這也許是有用的。因為如果不需要這個對象,則可以節省伺服器的資源。
       然而,如果肯定需要建立某一對象,可使用Server.CreateObject方法完成。用<OBJECT>元素建立對象有助於防止在代碼中取消對對象的調用時,忘記取消程式中的Server.CreateObject行,當然這是一個粗心的程式設計。
       最後需要記住的是,如果對象是使用Server.CreateObject方法建立的,就可以從會話或應用程式中去掉對象,但使用<OBJECT>元素建立的,則不行。

5.2.4  組件執行緒模式
       在頁面內使用對象或組件時,應該考慮的另一個問題是該對象涉及到的響應多個請求的行為方式。事實上在ASP裡,這是所需要理解的最複雜的題目之一。一個組件的執行緒模式,結合其範圍,影響該組件和應用程式的效能和效率,也影響將它執行個體化的ASP頁面。
       線程就是由處理器執行的系統對象,用於完成由組件代碼定義的任務。每一個線程都可以被認為是單個二進位指令集。在像Windows這樣的多線程環境中,多個線程可同時運行。
       實際上有五個執行緒模式(包括在Windows 2000裡引入的Neutral-threading模型):
       ? Single-threaded(單線程):某一時刻只能有一個進程使用某組件。
       ? Apartment-threaded(單元線程):若干進程都可以使用某組件,但只有一個在指定的線程上。
       ? Neutral-threaded(中立線程):若干進程都能使用某組件,並且可以使用指定的一組線程中的任何一個。
       ? Multiple-threaded或Free-threaded(多線程或自由線程):若干進程都能使用某組件,並且這些進程可以運行在不同的線程上。
       ? Both-threaded(雙線程):對象既可以是單元線程的又可以作為自由線程的。
       在這裡不解釋執行緒模式的技術細節,本書後面有相應的內容。
       單元線程的組件(例如使用Visual Basic建立的或作為XML指令碼的組件)可在頁面層範圍內很好地運行,在會話層範圍內也是可以接受的。事實上,在頁面層,由於較低的資料處理開銷,也能很好地運行雙線程的組件。
       Winodws 2000中的中立線程的模型甚至提供了更好的效能,儘管到目前為止只有很少的這樣的組件和與之相適應的開發工具。
       如果需要會話層組件,使用可用的雙線程的組件。並且如果需要應用程式層範圍,可一直使用雙線程的組件。
       然而,微軟建議避免使用會話層範圍的組件,甚至不使用應用程式層範圍的組件,除非這些組件是絕對需要的。使組件的啟用時間超過範圍為頁面級的組件所要求的時間,對於由COM+提供代理特性的對象是沒有益處的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.