編程|進階 1.3 ASP Server對象
正像在前面看到的那樣,通過伺服器端包含的經ISAPI訪問Web伺服器的頁面,用傳統動態網頁面指令和命令可以做相當多的事情。但同時也有一些明顯的限制。
例如,可以從Request.ServerVariables集合檢索到所有隨同用戶端的請求發送過來的HTTP前序的值。它幾乎可以與使用SSI #echo匹敵,同時具備的主要優點是把這些值作為字串返回到代碼中(而#echo指令簡單地把這些值插入到頁面中),因此可以根據自己的願望來檢索和維護這些字串。許多相同的參數應用於#fsize和#flastmod指令,使用帶有VBScript和JScript指令碼引擎中的對象的指令碼,同樣也可以容易地擷取這個資訊。在後續章節你將看到相關的細節。
#exec指令既非常有用,又受到一定的限制。實際上該指令僅運行系統命令或定製的CGI應用程式,並不能給指令碼提供真正的對進程的控制。ASP Server對象提供了一種全新的方法,與#exec指令相比,能夠更安全和更容易地運行其他的應用程式或組件。當然,對於一些情況,尤其是在確實需要執行一個作業系統命令或一個原有的CGI應用程式的地方,#exec是無法替代的。
為了研究Server對象,先概要介紹其所有可用的方法和屬性,然後再進一步詳細地進行討論。
4.3.1 ASP Server對象成員概述
Server對象是專為處理伺服器上的特定任務而設計的,特別是與伺服器的環境和處理活動有關的任務。因此提供資訊的屬性只有一個,卻有七種方法用來以伺服器特定的方法格式化資料、管理其他網頁的執行、管理外部對象和組件的執行以及處理錯誤。
1. Server對象的屬性
Server對象的唯一一個屬性用於訪問一個正在執行的ASP網頁的指令碼逾時值,如表4-2所示:
表4-2 Server對象的屬性及說明
特 性
說 明
ScriptTimeout
整型。預設值為90。
設定或返回頁面的指令碼在伺服器退出執行和報告一個錯誤之前可以執行的時間(秒數)。達到該值後將自動停止頁面的執行,並從記憶體中刪除包含可能進入死迴圈的錯誤的頁面或者是那些長時間等待其他資源的網頁。這會防止伺服器因存在錯誤的頁面而過載。對於已耗用時間較長的頁面需要增大這個值
2. Server對象的方法
Server對象的方法用于格式化資料、管理網頁執行和建立其他對象執行個體,如表4-3所示。
表4-3 Server對象的方法及說明
方 法
說 明
CreateObject(“identifier”)
建立由identifier標識的對象(一個組件、應用程式或指令碼對象)的一個執行個體,返回可以在代碼中使用的一個引用。可以用於一個虛擬應用程式(global.asa頁)建立會話層或應用程式層範圍內的對象。該對象可以用其ClassID來標識,如“{clsid: BD96C556-65A3…37A9}”或一個ProgID串來標識,如“ADODB.Connection”
Execute(“url”)
停止當前頁面的執行,把控制轉到在url中指定的網頁。使用者的當前環境(即工作階段狀態和當前事務狀態)也傳遞到新的網頁。在該頁面執行完成後,控制傳遞迴原先的頁面,並繼續執行Execute方法後面的語句
GetLastError()
返回ASP ASPError對象的一個引用,這個對象包含該頁面在ASP處理過程中發生的最近一次錯誤的詳細資料。這些由ASPError對象給出的資訊包含檔案名稱、行號、錯誤碼等等
HTMLEncode(“string”)
返回一個字串,該串是輸入值string的拷貝,但去掉了所有非法的HTML字元,如<、>、&和雙引號,並轉換為等價的HTML條目,即<、’>’、’&’、’"’等等
MapPath(“url”)
返回在url中指定的檔案或資源的完整實體路徑和檔案名稱
Transfer(“url”)
停止當前頁面的執行,把控制轉到url中指定的頁面。使用者的當前環境(即工作階段狀態和當前事務狀態)也傳遞到新的頁面。與Execute方法不同,當新頁面執行完成時,不回到原來的頁面,而是結束執行過程
URLEncode(“string”)
返回一個字串,該串是輸入值string的拷貝,但是在URL中無效的所有字元,如?、&和空格,都轉換為等價的URL條目,即%3F、%26和+
4.3.2 建立其他對象的執行個體
在前一章中,討論了ASP的虛擬應用程式概念,瞭解了虛擬應用程式通過Application Protection設定為ASP網頁中的組件和其他對象提供進程隔離。這延續了第1章的討論,即ASP的ObjectContext對象如何為ASP網頁提供運行環境,以及如何使用在相同的環境中啟動並執行其他組件和對象。
ASP Server對象提供建立這些組件和應用程式執行個體的功能,因此可用來擴充ASP指令碼的能力。通過實現CreateObject方法的一個特定版本來實現這個功能。
1. 在VBScript和JScript中建立對象執行個體
在VB或VBA中,可使用多種方法建立對象的執行個體。可以使用New關鍵字來建立指定類型的一個新對象:
Dim objNewObject As New MyComponent
然而,不能在ASP中用VBScript或JScript這麼做,因為這些指令碼引擎不能實現資料類型定義。不能聲明一個變數為任意指定的資料類型,其變數都是Variants類型,或一個等價的類型(根據使用的指令碼語言而定)。
在VB和VBA中另一個方法是使用CreateObject或GetObject方法。CreateObject方法的參數是一個ClassID(通常情況)或一個ProgID字串,它返回相應類型的一個新對象:
Set objNewObject = CreateObject(“ADODB.Connection”)
當擁有一個指定的文件類型,並且想建立一個可以處理這種文檔的對象執行個體時,通常使用GetObject方法:
Set objExcel = GetObject(“C:\myfiles\sales.xlw”)
也可以指定所需要的物件類型和檔案名稱,在幾種對象都能處理該文件類型的情況下,這種做法是非常有用的:
Set objExcel = GetObject(“C:\myfiles\sales.xlw”,”Excel.Application”)
VBScript支援CreateObject和GetObject方法。JScript也有getObject方法,與VBScript中的GetObject工作方式相同。JScript中的ActiveXObject實現了與VBScript的CreateObject方法相同的功能。但這個函數常與JScript的new運算子協同使用:
ObjNewObject = new ActiveXObject(“This.object”);
除了VB的NEW關鍵字在VBScript和JScript中不予支援以外,能夠使用所有這些技術在一個ASP網頁中建立對象的執行個體。然而,能夠並不意味著應該,而且大多數情況下不應該在一個ASP網頁中使用指令碼引擎的對象建立函數。
2. 在ASP網頁中建立對象執行個體
為了理解一般的指令碼引擎對象建立方法為什麼在ASP網頁中使用效果不理想,需進一步對ASP中的環境和ObjectContext對象進行討論。
使用指令碼引擎的一般方法在一個ASP網頁中建立一個對象執行個體時,該對象在當前執行的頁面的環境中並未執行個體化。得不到ObjectContext對象的引用,所以不能使用該對象來訪問頁面的環境,即不能訪問該頁面環境中的值。
這意味著該對象不能使用內建的ASP對象,即不能夠訪問在Request、Response、Application和Session對象的集合中的值,也不能使用內建的ASP對象提供的方法和屬性。該對象也不能夠與此環境中任何現有的事務進行互動。如果發生錯誤,不能使用ObjectContext方法放棄一個事務。
當然,你可能不想與該網頁的環境進行互動。但是有其他的理由說明使用一般的對象建立方法通常是不明智的。IIS自動地在COM+運行期封裝程式hllhost.dll中執行個體化對象,使得該對象可以在當前的虛擬應用程式中完全地共用和重新使用(預設的Web網站本身是一個虛擬應用)。
你