ASP 3.0進階編程(十七)

來源:互聯網
上載者: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所示:

圖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)。這意味著,對象與組件只有該頁在A



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.