ASP 3.0高級(jí)編程(13)
發(fā)表時(shí)間:2024-01-20 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]1.3 ASP Server對(duì)象正像在前面看到的那樣,通過(guò)服務(wù)器端包含的經(jīng)ISAPI訪問(wèn)Web服務(wù)器的頁(yè)面,用傳統(tǒng)動(dòng)態(tài)頁(yè)面指令和命令可以做相當(dāng)多的事情。但同時(shí)也有一些明顯的限制。例如,可以從Request.ServerVariables集合檢索到所有隨同客戶(hù)端的請(qǐng)求發(fā)送過(guò)來(lái)的HTTP報(bào)頭的值。...
1.3 ASP Server對(duì)象
正像在前面看到的那樣,通過(guò)服務(wù)器端包含的經(jīng)ISAPI訪問(wèn)Web服務(wù)器的頁(yè)面,用傳統(tǒng)動(dòng)態(tài)頁(yè)面指令和命令可以做相當(dāng)多的事情。但同時(shí)也有一些明顯的限制。
例如,可以從Request.ServerVariables集合檢索到所有隨同客戶(hù)端的請(qǐng)求發(fā)送過(guò)來(lái)的HTTP報(bào)頭的值。它幾乎可以與使用SSI #echo匹敵,同時(shí)具備的主要優(yōu)點(diǎn)是把這些值作為字符串返回到代碼中(而#echo指令簡(jiǎn)單地把這些值插入到頁(yè)面中),因此可以根據(jù)自己的愿望來(lái)檢索和維護(hù)這些字符串。許多相同的參數(shù)應(yīng)用于#fsize和#flastmod指令,使用帶有VBScript和JScript腳本引擎中的對(duì)象的腳本,同樣也可以容易地獲取這個(gè)信息。在后續(xù)章節(jié)你將看到相關(guān)的細(xì)節(jié)。
#exec指令既非常有用,又受到一定的限制。實(shí)際上該指令僅運(yùn)行系統(tǒng)命令或定制的CGI應(yīng)用程序,并不能給腳本提供真正的對(duì)進(jìn)程的控制。ASP Server對(duì)象提供了一種全新的方法,與#exec指令相比,能夠更安全和更容易地運(yùn)行其他的應(yīng)用程序或組件。當(dāng)然,對(duì)于一些情況,尤其是在確實(shí)需要執(zhí)行一個(gè)操作系統(tǒng)命令或一個(gè)原有的CGI應(yīng)用程序的地方,#exec是無(wú)法替代的。
為了研究Server對(duì)象,先概要介紹其所有可用的方法和屬性,然后再進(jìn)一步詳細(xì)地進(jìn)行討論。
4.3.1 ASP Server對(duì)象成員概述
Server對(duì)象是專(zhuān)為處理服務(wù)器上的特定任務(wù)而設(shè)計(jì)的,特別是與服務(wù)器的環(huán)境和處理活動(dòng)有關(guān)的任務(wù)。因此提供信息的屬性只有一個(gè),卻有七種方法用來(lái)以服務(wù)器特定的方法格式化數(shù)據(jù)、管理其他網(wǎng)頁(yè)的執(zhí)行、管理外部對(duì)象和組件的執(zhí)行以及處理錯(cuò)誤。
1. Server對(duì)象的屬性
Server對(duì)象的唯一一個(gè)屬性用于訪問(wèn)一個(gè)正在執(zhí)行的ASP網(wǎng)頁(yè)的腳本超時(shí)值,如表4-2所示:
表4-2 Server對(duì)象的屬性及說(shuō)明
特 性
說(shuō) 明
ScriptTimeout
整型。缺省值為90。
設(shè)置或返回頁(yè)面的腳本在服務(wù)器退出執(zhí)行和報(bào)告一個(gè)錯(cuò)誤之前可以執(zhí)行的時(shí)間(秒數(shù))。達(dá)到該值后將自動(dòng)停止頁(yè)面的執(zhí)行,并從內(nèi)存中刪除包含可能進(jìn)入死循環(huán)的錯(cuò)誤的頁(yè)面或者是那些長(zhǎng)時(shí)間等待其他資源的網(wǎng)頁(yè)。這會(huì)防止服務(wù)器因存在錯(cuò)誤的頁(yè)面而過(guò)載。對(duì)于運(yùn)行時(shí)間較長(zhǎng)的頁(yè)面需要增大這個(gè)值
2. Server對(duì)象的方法
Server對(duì)象的方法用于格式化數(shù)據(jù)、管理網(wǎng)頁(yè)執(zhí)行和創(chuàng)建其他對(duì)象實(shí)例,如表4-3所示。
表4-3 Server對(duì)象的方法及說(shuō)明
方 法
說(shuō) 明
CreateObject(“identifier”)
創(chuàng)建由identifier標(biāo)識(shí)的對(duì)象(一個(gè)組件、應(yīng)用程序或腳本對(duì)象)的一個(gè)實(shí)例,返回可以在代碼中使用的一個(gè)引用。可以用于一個(gè)虛擬應(yīng)用程序(global.asa頁(yè))創(chuàng)建會(huì)話層或應(yīng)用程序?qū)臃秶鷥?nèi)的對(duì)象。該對(duì)象可以用其ClassID來(lái)標(biāo)識(shí),如“{clsid: BD96C556-65A3…37A9}”或一個(gè)ProgID串來(lái)標(biāo)識(shí),如“ADODB.Connection”
Execute(“url”)
停止當(dāng)前頁(yè)面的執(zhí)行,把控制轉(zhuǎn)到在url中指定的網(wǎng)頁(yè)。用戶(hù)的當(dāng)前環(huán)境(即會(huì)話狀態(tài)和當(dāng)前事務(wù)狀態(tài))也傳遞到新的網(wǎng)頁(yè)。在該頁(yè)面執(zhí)行完成后,控制傳遞回原先的頁(yè)面,并繼續(xù)執(zhí)行Execute方法后面的語(yǔ)句
GetLastError()
返回ASP ASPError對(duì)象的一個(gè)引用,這個(gè)對(duì)象包含該頁(yè)面在ASP處理過(guò)程中發(fā)生的最近一次錯(cuò)誤的詳細(xì)數(shù)據(jù)。這些由ASPError對(duì)象給出的信息包含文件名、行號(hào)、錯(cuò)誤代碼等等
HTMLEncode(“string”)
返回一個(gè)字符串,該串是輸入值string的拷貝,但去掉了所有非法的HTML字符,如<、>、&和雙引號(hào),并轉(zhuǎn)換為等價(jià)的HTML條目,即<、’>’、’&’、’"’等等
MapPath(“url”)
返回在url中指定的文件或資源的完整物理路徑和文件名
Transfer(“url”)
停止當(dāng)前頁(yè)面的執(zhí)行,把控制轉(zhuǎn)到url中指定的頁(yè)面。用戶(hù)的當(dāng)前環(huán)境(即會(huì)話狀態(tài)和當(dāng)前事務(wù)狀態(tài))也傳遞到新的頁(yè)面。與Execute方法不同,當(dāng)新頁(yè)面執(zhí)行完成時(shí),不回到原來(lái)的頁(yè)面,而是結(jié)束執(zhí)行過(guò)程
URLEncode(“string”)
返回一個(gè)字符串,該串是輸入值string的拷貝,但是在URL中無(wú)效的所有字符,如?、&和空格,都轉(zhuǎn)換為等價(jià)的URL條目,即%3F、%26和+
4.3.2 創(chuàng)建其他對(duì)象的實(shí)例
在前一章中,討論了ASP的虛擬應(yīng)用程序概念,了解了虛擬應(yīng)用程序通過(guò)Application Protection設(shè)置為ASP網(wǎng)頁(yè)中的組件和其他對(duì)象提供進(jìn)程隔離。這延續(xù)了第1章的討論,即ASP的ObjectContext對(duì)象如何為ASP網(wǎng)頁(yè)提供運(yùn)行環(huán)境,以及如何使用在相同的環(huán)境中運(yùn)行的其他組件和對(duì)象。
ASP Server對(duì)象提供創(chuàng)建這些組件和應(yīng)用程序?qū)嵗墓δ埽虼丝捎脕?lái)擴(kuò)充ASP腳本的能力。通過(guò)實(shí)現(xiàn)CreateObject方法的一個(gè)特定版本來(lái)實(shí)現(xiàn)這個(gè)功能。
1. 在VBScript和JScript中創(chuàng)建對(duì)象實(shí)例
在VB或VBA中,可使用多種方法創(chuàng)建對(duì)象的實(shí)例。可以使用New關(guān)鍵字來(lái)創(chuàng)建指定類(lèi)型的一個(gè)新對(duì)象:
Dim objNewObject As New MyComponent
然而,不能在ASP中用VBScript或JScript這么做,因?yàn)檫@些腳本引擎不能實(shí)現(xiàn)數(shù)據(jù)類(lèi)型定義。不能聲明一個(gè)變量為任意指定的數(shù)據(jù)類(lèi)型,其變量都是Variants類(lèi)型,或一個(gè)等價(jià)的類(lèi)型(根據(jù)使用的腳本語(yǔ)言而定)。
在VB和VBA中另一個(gè)方法是使用CreateObject或GetObject方法。CreateObject方法的參數(shù)是一個(gè)ClassID(通常情況)或一個(gè)ProgID字符串,它返回相應(yīng)類(lèi)型的一個(gè)新對(duì)象:
Set objNewObject = CreateObject(“ADODB.Connection”)
當(dāng)擁有一個(gè)指定的文檔類(lèi)型,并且想創(chuàng)建一個(gè)可以處理這種文檔的對(duì)象實(shí)例時(shí),通常使用GetObject方法:
Set objExcel = GetObject(“C:\myfiles\sales.xlw”)
也可以指定所需要的對(duì)象類(lèi)型和文件名,在幾種對(duì)象都能處理該文檔類(lèi)型的情況下,這種做法是非常有用的:
Set objExcel = GetObject(“C:\myfiles\sales.xlw”,”Excel.Application”)
VBScript支持CreateObject和GetObject方法。JScript也有g(shù)etObject方法,與VBScript中的GetObject工作方式相同。JScript中的ActiveXObject實(shí)現(xiàn)了與VBScript的CreateObject方法相同的功能。但這個(gè)函數(shù)常與JScript的new運(yùn)算符協(xié)同使用:
ObjNewObject = new ActiveXObject(“This.object”);
除了VB的NEW關(guān)鍵字在VBScript和JScript中不予支持以外,能夠使用所有這些技術(shù)在一個(gè)ASP網(wǎng)頁(yè)中創(chuàng)建對(duì)象的實(shí)例。然而,能夠并不意味著應(yīng)該,而且大多數(shù)情況下不應(yīng)該在一個(gè)ASP網(wǎng)頁(yè)中使用腳本引擎的對(duì)象創(chuàng)建函數(shù)。
2. 在ASP網(wǎng)頁(yè)中創(chuàng)建對(duì)象實(shí)例
為了理解一般的腳本引擎對(duì)象創(chuàng)建方法為什么在ASP網(wǎng)頁(yè)中使用效果不理想,需進(jìn)一步對(duì)ASP中的環(huán)境和ObjectContext對(duì)象進(jìn)行討論。
使用腳本引擎的一般方法在一個(gè)ASP網(wǎng)頁(yè)中創(chuàng)建一個(gè)對(duì)象實(shí)例時(shí),該對(duì)象在當(dāng)前執(zhí)行的頁(yè)面的環(huán)境中并未實(shí)例化。得不到ObjectContext對(duì)象的引用,所以不能使用該對(duì)象來(lái)訪問(wèn)頁(yè)面的環(huán)境,即不能訪問(wèn)該頁(yè)面環(huán)境中的值。
這意味著該對(duì)象不能使用內(nèi)置的ASP對(duì)象,即不能夠訪問(wèn)在Request、Response、Application和Session對(duì)象的集合中的值,也不能使用內(nèi)置的ASP對(duì)象提供的方法和屬性。該對(duì)象也不能夠與此環(huán)境中任何現(xiàn)有的事務(wù)進(jìn)行交互。如果發(fā)生錯(cuò)誤,不能使用ObjectContext方法放棄一個(gè)事務(wù)。
當(dāng)然,你可能不想與該網(wǎng)頁(yè)的環(huán)境進(jìn)行交互。但是有其他的理由說(shuō)明使用一般的對(duì)象創(chuàng)建方法通常是不明智的。IIS自動(dòng)地在COM+運(yùn)行期包裝程序hllhost.dll中實(shí)例化對(duì)象,使得該對(duì)象可以在當(dāng)前的虛擬應(yīng)用程序中完全地共享和重新使用(缺省的Web網(wǎng)站本身是一個(gè)虛擬的應(yīng)用)。
你在上一章所看到的對(duì)一個(gè)虛擬應(yīng)用程序的設(shè)置,既允許在Web服務(wù)器的內(nèi)存空間中創(chuàng)建對(duì)象,也可以在共享的或獨(dú)立的進(jìn)程外DLLHost.dll實(shí)例中創(chuàng)建對(duì)象。如果使用一般的腳本引擎對(duì)象創(chuàng)建方法,將繞過(guò)所有的組件隔離和可擴(kuò)展特性。而在使用ASP Server對(duì)象的CreateObject方法時(shí)會(huì)自動(dòng)地提供這些特性。
3. Server對(duì)象的CreateObject方法
為了試驗(yàn)CreateObject方法,打開(kāi)示例的Chapter04主菜單頁(yè),單擊“Using the ASP Server Object”鏈接,如圖4-10所示:
圖4-10 示例程序的Chapter04主菜單頁(yè)
這個(gè)鏈接打開(kāi)一個(gè)名為show_server.asp的網(wǎng)頁(yè),該頁(yè)面可以用來(lái)試驗(yàn)所有的Server對(duì)象的方法。它同時(shí)也顯示Server對(duì)象唯一的屬性ScriptTimeout的值、其缺省值是90秒,如圖4-11所示:
圖4-11 Server對(duì)象的屬性和方法
在該頁(yè)面的“Create an Instance of a Component”區(qū)域,有一個(gè)文本框,可以在其中鍵入想要在該網(wǎng)頁(yè)的環(huán)境中創(chuàng)建的對(duì)象的ProgID字符串,甚至可以鍵入一個(gè)ClassID數(shù)值。這里文本框的缺省值已經(jīng)設(shè)置為一個(gè)來(lái)自ActiveX數(shù)據(jù)對(duì)象庫(kù)的公用對(duì)象的ProgID:ADODB.Connection。
單擊“Server.CreateObject”選項(xiàng)旁的按鈕,把該頁(yè)面提交給其自身,因?yàn)樗械目丶荚谝粋(gè)帶有ACTION屬性的<FORM>上,而這個(gè)ACTION屬性被設(shè)置為這個(gè)網(wǎng)頁(yè)的路徑和文件名:
…
FORM ACTION="<% = Request.ServerVariables("SCRIPT_NAME") %>" METHOD="POST">
<P><DIV CLASS="subhead">Create an Instance of a Component</DIV>
<INPUT TYPE="SUBMIT" NAME="cmdCreateObject" VALUE=" ">
Server.CreateObject ("
<INPUT TYPE="TEXT" NAME="txtProgID" SIZE="25" VALUE="ADODB.Connection">
")<P>
…
</FORM>
…
當(dāng)該頁(yè)面重新載入時(shí),該頁(yè)中的一段ASP代碼(位于<FORM>段的前面)將查看提交該窗體時(shí),單擊了哪個(gè)按鈕。如果是名稱(chēng)為“cmdCreateObject”的按鈕時(shí),該代碼將讀取文本框中的ProgID字符串。為防止用戶(hù)輸入的ProgID無(wú)效而導(dǎo)致執(zhí)行中止,關(guān)閉缺省的腳本錯(cuò)誤處理,再?lài)L試使用Server.CreateObject方法創(chuàng)建一個(gè)對(duì)象的實(shí)例。最后,再重新打開(kāi)缺省的錯(cuò)誤處理,通過(guò)使用IsObject函數(shù)檢查是否創(chuàng)建了一個(gè)對(duì)象實(shí)例,并顯示一個(gè)相應(yīng)的信息:
QUOT = Chr(34) 'double-quote character
…
'look for a command sent from the FORM section buttons
If Len(Request.Form("cmdCreateObject")) Then
strProgID = Request.Form("txtProgID")
On Error Resume Next
Set objObject = Server.CreateObject(strProgID)
On Error Goto 0
If IsObject(objObject) Then
Response.Write "<B>Results:</B><BR>Sucessfully created object with ProgID of <B>" _
& QUOT & strProgID & QUOT & "</B><HR>"
Else
Response.Write "<B>Results:</B><BR>Failed to create object with ProgID of <B>" _
& QUOT & strProgID & QUOT & "</B><HR>"
End If
End If
…
圖4-12所示的是創(chuàng)建ADODB.Connection對(duì)象的結(jié)果。可以看到該對(duì)象已被正常實(shí)例化,已可以在代碼中使用。
圖4-12 ADODB.Connection對(duì)象實(shí)例化的結(jié)果
本章不討論如何使用這些對(duì)象,你可能已經(jīng)對(duì)此很熟悉了。一旦創(chuàng)建了對(duì)象實(shí)例,就可以像在任何其他情況中一樣使用它。調(diào)用對(duì)象的方法,讀取或設(shè)置屬性,與使用VB時(shí)一樣;或者用瀏覽器中客戶(hù)端的VBScript、JScript使用它。
在接下來(lái)的章節(jié)中將對(duì)對(duì)象和組件的使用進(jìn)行更加詳細(xì)的介紹。我們將研究由腳本引擎實(shí)現(xiàn)的一些對(duì)象,以及IIS 5.0/ASP 3.0中的可安裝組件,還有一些其他的免費(fèi)或商用的組件,并討論在各種情況下如何選擇相應(yīng)的組件。在本書(shū)的后面,甚至?xí)f(shuō)明創(chuàng)建自己的能夠在ASP中使用的組件是非常簡(jiǎn)單的。