明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

ASP 3.0高級編程(13)

[摘要]1.3 ASP Server對象正像在前面看到的那樣,通過服務器端包含的經(jīng)ISAPI訪問Web服務器的頁面,用傳統(tǒng)動態(tài)頁面指令和命令可以做相當多的事情。但同時也有一些明顯的限制。例如,可以從Request.ServerVariables集合檢索到所有隨同客戶端的請求發(fā)送過來的HTTP報頭的值。...
1.3   ASP Server對象
正像在前面看到的那樣,通過服務器端包含的經(jīng)ISAPI訪問Web服務器的頁面,用傳統(tǒng)動態(tài)頁面指令和命令可以做相當多的事情。但同時也有一些明顯的限制。
例如,可以從Request.ServerVariables集合檢索到所有隨同客戶端的請求發(fā)送過來的HTTP報頭的值。它幾乎可以與使用SSI #echo匹敵,同時具備的主要優(yōu)點是把這些值作為字符串返回到代碼中(而#echo指令簡單地把這些值插入到頁面中),因此可以根據(jù)自己的愿望來檢索和維護這些字符串。許多相同的參數(shù)應用于#fsize和#flastmod指令,使用帶有VBScript和JScript腳本引擎中的對象的腳本,同樣也可以容易地獲取這個信息。在后續(xù)章節(jié)你將看到相關(guān)的細節(jié)。
#exec指令既非常有用,又受到一定的限制。實際上該指令僅運行系統(tǒng)命令或定制的CGI應用程序,并不能給腳本提供真正的對進程的控制。ASP Server對象提供了一種全新的方法,與#exec指令相比,能夠更安全和更容易地運行其他的應用程序或組件。當然,對于一些情況,尤其是在確實需要執(zhí)行一個操作系統(tǒng)命令或一個原有的CGI應用程序的地方,#exec是無法替代的。
為了研究Server對象,先概要介紹其所有可用的方法和屬性,然后再進一步詳細地進行討論。

4.3.1 ASP Server對象成員概述
       Server對象是專為處理服務器上的特定任務而設(shè)計的,特別是與服務器的環(huán)境和處理活動有關(guān)的任務。因此提供信息的屬性只有一個,卻有七種方法用來以服務器特定的方法格式化數(shù)據(jù)、管理其他網(wǎng)頁的執(zhí)行、管理外部對象和組件的執(zhí)行以及處理錯誤。
1.  Server對象的屬性
Server對象的唯一一個屬性用于訪問一個正在執(zhí)行的ASP網(wǎng)頁的腳本超時值,如表4-2所示:
表4-2  Server對象的屬性及說明
特 性
說 明

ScriptTimeout
整型。缺省值為90。
設(shè)置或返回頁面的腳本在服務器退出執(zhí)行和報告一個錯誤之前可以執(zhí)行的時間(秒數(shù))。達到該值后將自動停止頁面的執(zhí)行,并從內(nèi)存中刪除包含可能進入死循環(huán)的錯誤的頁面或者是那些長時間等待其他資源的網(wǎng)頁。這會防止服務器因存在錯誤的頁面而過載。對于運行時間較長的頁面需要增大這個值

2.  Server對象的方法
Server對象的方法用于格式化數(shù)據(jù)、管理網(wǎng)頁執(zhí)行和創(chuàng)建其他對象實例,如表4-3所示。
表4-3  Server對象的方法及說明
方 法
說 明

CreateObject(“identifier”)
創(chuàng)建由identifier標識的對象(一個組件、應用程序或腳本對象)的一個實例,返回可以在代碼中使用的一個引用。可以用于一個虛擬應用程序(global.asa頁)創(chuàng)建會話層或應用程序?qū)臃秶鷥?nèi)的對象。該對象可以用其ClassID來標識,如“{clsid: BD96C556-65A3…37A9}”或一個ProgID串來標識,如“ADODB.Connection”

Execute(“url”)
停止當前頁面的執(zhí)行,把控制轉(zhuǎn)到在url中指定的網(wǎng)頁。用戶的當前環(huán)境(即會話狀態(tài)和當前事務狀態(tài))也傳遞到新的網(wǎng)頁。在該頁面執(zhí)行完成后,控制傳遞回原先的頁面,并繼續(xù)執(zhí)行Execute方法后面的語句

GetLastError()
返回ASP ASPError對象的一個引用,這個對象包含該頁面在ASP處理過程中發(fā)生的最近一次錯誤的詳細數(shù)據(jù)。這些由ASPError對象給出的信息包含文件名、行號、錯誤代碼等等

HTMLEncode(“string”)
返回一個字符串,該串是輸入值string的拷貝,但去掉了所有非法的HTML字符,如<、>、&和雙引號,并轉(zhuǎn)換為等價的HTML條目,即<、’>’、’&amp;’、’&quot;’等等

MapPath(“url”)
返回在url中指定的文件或資源的完整物理路徑和文件名

Transfer(“url”)
停止當前頁面的執(zhí)行,把控制轉(zhuǎn)到url中指定的頁面。用戶的當前環(huán)境(即會話狀態(tài)和當前事務狀態(tài))也傳遞到新的頁面。與Execute方法不同,當新頁面執(zhí)行完成時,不回到原來的頁面,而是結(jié)束執(zhí)行過程

URLEncode(“string”)
返回一個字符串,該串是輸入值string的拷貝,但是在URL中無效的所有字符,如?、&和空格,都轉(zhuǎn)換為等價的URL條目,即%3F、%26和+


4.3.2 創(chuàng)建其他對象的實例
       在前一章中,討論了ASP的虛擬應用程序概念,了解了虛擬應用程序通過Application Protection設(shè)置為ASP網(wǎng)頁中的組件和其他對象提供進程隔離。這延續(xù)了第1章的討論,即ASP的ObjectContext對象如何為ASP網(wǎng)頁提供運行環(huán)境,以及如何使用在相同的環(huán)境中運行的其他組件和對象。
       ASP Server對象提供創(chuàng)建這些組件和應用程序?qū)嵗墓δ埽虼丝捎脕頂U充ASP腳本的能力。通過實現(xiàn)CreateObject方法的一個特定版本來實現(xiàn)這個功能。
1.  在VBScript和JScript中創(chuàng)建對象實例
在VB或VBA中,可使用多種方法創(chuàng)建對象的實例?梢允褂肗ew關(guān)鍵字來創(chuàng)建指定類型的一個新對象:
Dim objNewObject As New MyComponent
然而,不能在ASP中用VBScript或JScript這么做,因為這些腳本引擎不能實現(xiàn)數(shù)據(jù)類型定義。不能聲明一個變量為任意指定的數(shù)據(jù)類型,其變量都是Variants類型,或一個等價的類型(根據(jù)使用的腳本語言而定)。
在VB和VBA中另一個方法是使用CreateObject或GetObject方法。CreateObject方法的參數(shù)是一個ClassID(通常情況)或一個ProgID字符串,它返回相應類型的一個新對象:
Set objNewObject = CreateObject(“ADODB.Connection”)
當擁有一個指定的文檔類型,并且想創(chuàng)建一個可以處理這種文檔的對象實例時,通常使用GetObject方法:
Set objExcel = GetObject(“C:\myfiles\sales.xlw”)
也可以指定所需要的對象類型和文件名,在幾種對象都能處理該文檔類型的情況下,這種做法是非常有用的:
Set objExcel = GetObject(“C:\myfiles\sales.xlw”,”Excel.Application”)
VBScript支持CreateObject和GetObject方法。JScript也有g(shù)etObject方法,與VBScript中的GetObject工作方式相同。JScript中的ActiveXObject實現(xiàn)了與VBScript的CreateObject方法相同的功能。但這個函數(shù)常與JScript的new運算符協(xié)同使用:
ObjNewObject = new ActiveXObject(“This.object”);
除了VB的NEW關(guān)鍵字在VBScript和JScript中不予支持以外,能夠使用所有這些技術(shù)在一個ASP網(wǎng)頁中創(chuàng)建對象的實例。然而,能夠并不意味著應該,而且大多數(shù)情況下不應該在一個ASP網(wǎng)頁中使用腳本引擎的對象創(chuàng)建函數(shù)。
2.  在ASP網(wǎng)頁中創(chuàng)建對象實例
為了理解一般的腳本引擎對象創(chuàng)建方法為什么在ASP網(wǎng)頁中使用效果不理想,需進一步對ASP中的環(huán)境和ObjectContext對象進行討論。
使用腳本引擎的一般方法在一個ASP網(wǎng)頁中創(chuàng)建一個對象實例時,該對象在當前執(zhí)行的頁面的環(huán)境中并未實例化。得不到ObjectContext對象的引用,所以不能使用該對象來訪問頁面的環(huán)境,即不能訪問該頁面環(huán)境中的值。
這意味著該對象不能使用內(nèi)置的ASP對象,即不能夠訪問在Request、Response、Application和Session對象的集合中的值,也不能使用內(nèi)置的ASP對象提供的方法和屬性。該對象也不能夠與此環(huán)境中任何現(xiàn)有的事務進行交互。如果發(fā)生錯誤,不能使用ObjectContext方法放棄一個事務。
當然,你可能不想與該網(wǎng)頁的環(huán)境進行交互。但是有其他的理由說明使用一般的對象創(chuàng)建方法通常是不明智的。IIS自動地在COM+運行期包裝程序hllhost.dll中實例化對象,使得該對象可以在當前的虛擬應用程序中完全地共享和重新使用(缺省的Web網(wǎng)站本身是一個虛擬的應用)。
你在上一章所看到的對一個虛擬應用程序的設(shè)置,既允許在Web服務器的內(nèi)存空間中創(chuàng)建對象,也可以在共享的或獨立的進程外DLLHost.dll實例中創(chuàng)建對象。如果使用一般的腳本引擎對象創(chuàng)建方法,將繞過所有的組件隔離和可擴展特性。而在使用ASP Server對象的CreateObject方法時會自動地提供這些特性。
3.  Server對象的CreateObject方法
為了試驗CreateObject方法,打開示例的Chapter04主菜單頁,單擊“Using the ASP Server Object”鏈接,如圖4-10所示:

圖4-10  示例程序的Chapter04主菜單頁
這個鏈接打開一個名為show_server.asp的網(wǎng)頁,該頁面可以用來試驗所有的Server對象的方法。它同時也顯示Server對象唯一的屬性ScriptTimeout的值、其缺省值是90秒,如圖4-11所示:

圖4-11  Server對象的屬性和方法
在該頁面的“Create an Instance of a Component”區(qū)域,有一個文本框,可以在其中鍵入想要在該網(wǎng)頁的環(huán)境中創(chuàng)建的對象的ProgID字符串,甚至可以鍵入一個ClassID數(shù)值。這里文本框的缺省值已經(jīng)設(shè)置為一個來自ActiveX數(shù)據(jù)對象庫的公用對象的ProgID:ADODB.Connection。
單擊“Server.CreateObject”選項旁的按鈕,把該頁面提交給其自身,因為所有的控件都在一個帶有ACTION屬性的<FORM>上,而這個ACTION屬性被設(shè)置為這個網(wǎng)頁的路徑和文件名:

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="&nbsp;&nbsp;&nbsp;">
&nbsp; Server.CreateObject ("
<INPUT TYPE="TEXT" NAME="txtProgID" SIZE="25" VALUE="ADODB.Connection">
")<P>

</FORM>

當該頁面重新載入時,該頁中的一段ASP代碼(位于<FORM>段的前面)將查看提交該窗體時,單擊了哪個按鈕。如果是名稱為“cmdCreateObject”的按鈕時,該代碼將讀取文本框中的ProgID字符串。為防止用戶輸入的ProgID無效而導致執(zhí)行中止,關(guān)閉缺省的腳本錯誤處理,再嘗試使用Server.CreateObject方法創(chuàng)建一個對象的實例。最后,再重新打開缺省的錯誤處理,通過使用IsObject函數(shù)檢查是否創(chuà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對象的結(jié)果?梢钥吹皆搶ο笠驯徽嵗,已可以在代碼中使用。

圖4-12  ADODB.Connection對象實例化的結(jié)果
本章不討論如何使用這些對象,你可能已經(jīng)對此很熟悉了。一旦創(chuàng)建了對象實例,就可以像在任何其他情況中一樣使用它。調(diào)用對象的方法,讀取或設(shè)置屬性,與使用VB時一樣;或者用瀏覽器中客戶端的VBScript、JScript使用它。
在接下來的章節(jié)中將對對象和組件的使用進行更加詳細的介紹。我們將研究由腳本引擎實現(xiàn)的一些對象,以及IIS 5.0/ASP 3.0中的可安裝組件,還有一些其他的免費或商用的組件,并討論在各種情況下如何選擇相應的組件。在本書的后面,甚至會說明創(chuàng)建自己的能夠在ASP中使用的組件是非常簡單的。




相關(guān)文章