(4) 刪除虛擬應用程序
單擊“Remove”按鈕不會真正地刪除Internet Services Manager中的該條目。而是把現有的虛擬應用程序轉換為一個虛擬目錄。這個目錄有一個帶有藍色球的“文件夾”圖標,該圖標表示這並不是Web網站中一個真正的目錄,而是對磁盤上另一個文件夾的一個重定向。對它進行的訪問方式與創建它的虛擬應用程序相同(即使用相同的URL),但是不作為一個應用程序。換句話說,它不支持自己的application對象,而是繼承缺省Web網站的Application對象,或者是在該目錄的父目錄中的另一個應用程序的Application對象。
為了刪除一個虛擬應用程序,可簡單地在Internet Services Manager中的對象上單擊右鍵,在彈出的菜單中選擇Delete。
(5) 應用程序存儲的內容
ASP Application對象提供的全局存儲空間可以用來存儲下列內容:
· 簡單變量,例如字符串和數字(存儲為Variant,類似於ASP腳本變量)。
· Variant類型數組,一維或多維。
· 對一個COM對象實例的變量引用(類型於Variant)。
(6) Variant的定義
Variant是在VBScript腳本引擎中為ASP(和Internet Explorer)提供的唯一變量類型,與在VB和VBA中定義的數據類型 Variant相類似。與大多數常用的基本數據類型(例如字符串或整數)相比,盡管它不能使存儲單元最高效地存儲變量,需要進行額外的處理,但Variant提供許多用處。
從內部來Variant數據類型存儲數值作為獨立的子類型。它能自動地處理隱含的類型轉換,允許使用如下的代碼:
strString = ”30”
intInteger = 12
Response.Write strString & intInteger ‘Writes 3012 in the resulting page
Response.Write strString + intInteger ‘Writes 42 in the resulting page
隱含的數據類型轉換允許忽略Html廣西的值和列表控件是字符串的情況,並且如果需要的話可以把它們當成數字(假設字符串確實包含一個有效的數字)。也可以隨意地做一些其他的事情,諸如使用VBScript的Len方法檢查Request.Form集合中並不存在的一個值的長度。Len函數試圖把從Request.Form的調用的值轉換成一個字符串。如果該值丟失,返回空(Empty),轉換為帶有””的一個字符串,因此長度是零。
(7) VBScript數據類型及轉換
也可以進行顯式的數據類型轉換。在VBScript中,VarType方法返回一個整數,表明Variant當前保存的子類型:
Select Case VarType(varMyValue)
Case 0: Response.Write “Empty (uninitialized)”
Case 1: Response.Write “Null (no valid data)”
Case 2: Response.Write “Integer”
Case 3: Response.Write “Long integer”
Case 4: Response.Write “Single-PRecision floating-point number”
Case 5: Response.Write “Double-precision floating-point number”
Case 6: Response.Write “Currency”
Case 7: Response.Write “Date”
Case 8: Response.Write “String”
Case 9: Response.Write “Automation Object reference”
Case 10: Response.Write “Error”
Case 11: Response.Write “Boolean”
Case 12: Response.Write “Variant (used only with items in arrays of Variants)”
Case 13: Response.Write “Data-Access Object”
Case 17: Response.Write “Bytes”
Case 8192: Response.Write “Variant Array”
End Select
還有一些函數,如IsArray、IsDate、IsEmpty、IsNull、IsNumeric和IsObject,對於特定的子類型返回一個Boolean結果。一旦知道了數據的子類型,如果包含的數據合適的話,就可以將之轉換成不同的Variant子類型。這對代碼的透明性和檢查變量是否包含合法值都是有用的,非法的轉換將導致運行期錯誤,轉換如下所示:
blnBoolean = Cbool(varVariant) ‘Converts to a Variant of subtype Boolean
bytByte = Cbyte(varVariant) ‘Converts to a Variant of subtype Byte
curCurrency = CCur(varVariant) ‘Converts to a Variant of subtype Currency
dtmDate = CDate(varVariant) ‘Converts to a Variant of subtype Date
dblDouble = CDbl(varVariant) ‘Converts to a Variant of subtype Double
intInteger = CInt(varVariant) ‘Converts to a Variant of subtype Integer
ingLong = CLng(varVariant) ‘Converts to a Variant of subtype Long
sngSingle = CSng(varVariant) ‘Converts to a Variant of subtype Single
strString = CStr(varVariant) ‘Converts to a Variant of subtype String
(8) JScript數據類型及轉換
在JScript中,其他一些變量類型類似於VBScript,但是沒有代表對象的Variant。所有值都是對象,類型是下列六種數據類型之一:
· undefined:只有單個值,用於表明請求中的變量沒有聲明和創建,或者若是隱含創建但還未分配任何值。類似於 VBScript的Empty。
· Null:變量不包含一個有效的值。類似於VBScript的Nothing。
· Boolean。
· String。
· Number。
· Object。
JScript提供了一個typeof函數,返回表示數據的類型的字符串,例如:
StrString = ‘30’;
IntInteger = 12;
Response.Write(typeof(strString)); //Write ‘string’ in the resulting page
Response.Write(typeof(intInteger)); //Write ‘number’ in the resulting page
每種數據類型都有toString方法和valueOf方法,toString方法將變量的值轉為一個字符串返回,valueOf方法把變量的值作為它的原有數據類型返回。
(9) JScript的級聯和加法問題
JScript在許多方面不同於VBScript,在一定程度上是因為沒有“&”級聯運算符可用。當使用加法運算符時,它先檢查變量的數據類型以決定要做什麼。如果兩個變量都是數值,結果是數值的和。如果一個或兩個是字符串,結果是字符串的級聯:
strString = ‘30’;
intInteger = 12;
Response.Write(intInteger + intInteger); //Writes 24 in the resulting page
Response.Write(strString + intInteger); //Writes 3012 in the resulting page
Response.Write(intInteger + strString); //Writes 1230 in the resulting page
如果進行加法的值超過兩個,要看執行的順序。下面的代碼進行相應的示范:
intInteger = 12;
Response.Write(intInteger + intInteger + “<P>”); //Result is ‘24<P>’
Response.Write(“<P>” + intInteger + intInteger + “</P>”);
; &nbs p; //Result is ‘<P>1212</P>’
在第一種情況下,兩個數相加,結果被轉換為一個字符串並與“<P>”字符串進行級聯。在第二種情況下,第一個運算符是一個字符串和一個數的級聯,所以數被轉換為一個字符串。而後,所有的運算符都是級聯運算符。為了避免這個問題,可以使用括號強制第一個運算符是兩個數值的加法:
Response.Write(“<P>” + (intInteger + intInteger) + “</P>”);
; &nbs p; //Result is ‘<P>24</P>’
1. Web應用程序中的組件管理
在ASP中使用虛擬應用程序的第二個主要方面是:具有較好的對在腳本代碼內實例化和執行的組件進行管理的能力。先不討論有關它怎樣進行工作以及為什麼會如此有用的詳細情況,在學習ASP組件的部分時再討論相關內容。
這裡非常簡要地介紹在ASP網頁(此ASP網頁在該應用程序中)中使用組件時,如何對一個虛擬應用程序在PropertIEs對話框(在Internet Services Manager中)進行設置。
在一個虛擬應用程序的PropertIEs對話框的Home Directory頁的底部,有兩個組合框,為Execute Permissions和 Application Protection,如圖3-9所示:
圖3-9 Execute Permissions和Application Protection組合框
應用的保護和執行設置
因為在本章中,不討論在一個Web網頁內如何創建組件的實例,因此這裡先列出這些選項,在創建應用程序時可能要對此進行設置。Execute Permissions 選項如表3-1所示:
表3-1 Execute Permissions的選項及說明
選 項
說 明
None
在這個虛擬應用程序中不能運行腳本或可執行文件。實際上,提供了禁止一個應用程序的快速和簡單的方法
ScriptsOnly
只允許腳本文件(例如ASP、IDC或其他的)在這個虛擬應用程序中運行,不能運行可執行文件
Scriptsand Executables
允許任何的腳本和可執行文件在這個虛擬應用程序內運行
Execute Permissions選項控制可在該虛擬應用程序中執行的類型,而Application Protection選項影響可執行文件和組件運行的方式。在第1章中已經討論過可用的選項,但是在這裡再重復一次,Application Protection選項如表3-2所示:
表3-2 Application Protection的選項及說明
選 項
說 明
Low(IIS Process)
帶有這種設置的ASP虛擬應用程序的所有可執行文件和組件運行在Web服務器的可執行文件(Inetinfo.exe)的進程(即內存空間)中。因此,如果可執行文件或組件之一失敗的話,Web服務器處於危險狀態。這提供了最快和以最少的資源執行的選項
Medium(Pooled)
(缺省)帶有這種設置的ASP虛擬應用程序的所有應用程序的可執行文件和組件是運行在DLLHost.exe的單個共享實例的進程(即內存空間)中。這就防止了Web服務器可執行文件(Inetinfo.exe)受可執行文件或組件失敗的影響。然而,一個失敗的可執行文件或組件可能引起DLLHost.exe進程失敗,以及所有其他駐留其中的可執行文件和組件失敗
High(Isolated)
帶有這種設置的ASP虛擬應用程序的所有應用程序的可執行部分和組件是運行在DLLHost.exe的單個共享實例的進程(即內存空間)中,但是每個ASP應用程序都有自己的DLLHost.exe實例,該實例對該應用程序是獨占的。這就防止了Web服務器可執行文件(Inetinfo.exe)受可執行文件或組件失敗的影響,並防止虛擬應用的單個共享實例受另一個虛擬應用程序的一個可執行文件或組件失敗的影響。Microsoft建議最多有十個這樣的虛擬應用程序駐留在一個Web服務器上
3.2.2 ASP會話的定義
ASP會話引入了一個Web應用程序中粒度的下一層。ASP的Application對象可用來存儲對於“正在運行此應用程序”的所有用戶都是全局的和可訪問的狀態(即簡單變量、對象、數組等)。換句話說,用於響應這個應用程序內所有訪問者的請求的全部ASP代碼能夠對這些值進行訪問(假設已經建立了一個有效的會話,稍後將看到)。
但是在多數情況下這還不夠。需要具備存儲指定給每個用戶的值的能力,而不必通過給這些值分配名字指明其隸屬於哪個用戶。例如,下列值很可能弄亂應用程序的全局存儲空間:
MikeJones003PrefFGColor = “darkblue”
MikeJones003PrefBGColor = “white”
MikeJones003PrefLinkClolr = “green”
PriscillaDelores001PrefFGColor = “red”
PriscillaDelores001PrefBGColor = “darkgrey”
...
etc.
從載入系統資源和要求一些代碼訪問每個用戶的相應會話的角度來看,還有另外的不足之處。只要有訪問者,該應用程序就一直存在,這意味著應用程序的全局存儲空間需要不斷增大,除非在用戶離開該網站時采取步驟刪除這些值。
在Web應用程序中提供用戶層作用域
除了使用全局變量的存儲以外,應該為每個訪問者分配他們自己的私有變量存儲空間,使其對指定訪問者載入的所有頁面都可用的。這種情況下,可以對每個變量使用相同的名字,使ASP代碼非常簡單地得以實現。這些相同的代碼對每個用戶將透明地進行工作,因為訪問的只是訪問者擁有的私有存儲區域:
PrefFGColor = “darkblue”
PrefBGColor = “white”
PrefLinkColor = “green”
這就是session對象產生的地方。
(1) 會話存儲的內容
會話存儲的內容對指定的訪問者是全局的,而對其他訪問者來講是私有的,這使得ASP的會話非常有用。可以用來存儲在 ASP Application對象中存儲的相同類型的數據,即:
· 簡單變量,例如字符串和數值(像所有的ASP腳本變量一樣存儲為Variant)。
· Variant數組,一維或多維。
· 對一個COM對象的實例的變量引用(如同Variant)。
(2) 會話帶來的問題
會話提供了一個存儲每個用戶特定的值的方法。然而有幾個意想不到的問題要注意:
· 記住一些浏覽器和Web服務器對URL、路徑和文件名的大小寫形式是敏感的(例如Navigator和基於UNIX/Linux的服務器)。如果把一個超級鏈接放置在網頁的一個URL上,並且它們不是同樣的書寫形式,則在浏覽器中被認為是不相同的。同樣,如果路徑和文件名的書寫形式不是相同的,則浏覽器認為是不同的路徑或文件。對於在服務器上的定位資源來講,這並不重要,因為IIS對書寫形式不敏感,可以接受大寫形式和小寫形式的任何組合,並返回書寫形式不同的具有相同字符的文件。然而,如果一個cookIE已經指定了一個路徑,而且與在超級鏈接中所指定的路徑在書寫形式上不同,浏覽器可能不會把它以及相應目錄的頁面一起返回給服務器。這有可能找不到依賴於這個cookIE的一個用戶會話,並且Session對象將不會在作用域中(即其中的任何變量都是不可用的)。因此,在所有的目錄和網頁名字中,堅持都采用小寫形式或者是比較明顯的混合字母形式,是一個好辦法。
· 在IIS和ASP的早期版本中,對於嵌套的應用程序還有一些小的“Bug”,有時,當用戶離開嵌套的ASP虛擬應用程序並返回到缺省的ASP應用程序層時,與嵌套應用程序內部已經定義的局部變量相同的名字的任何全局變量不能重新顯現。還有,當會話使用Session.Abandon方法(稍後將會看到)終止時,global.asp文件中的代碼將執行失敗。在ASP 3.0中已經解決了這些問題。
· 記住會話依賴於cookie。如果訪問者已經禁止使用cookIE或者浏覽器不支持cookIE,將不能啟動一個會話,並且不能訪問Session對象。
(3) 禁止會話
雖然狀態提供了有益環境,但讓用戶門戶大開。如果不需要保留狀態,可以禁止會話以節約計算機的處理時間。例如,在一個不需要跟蹤訪問者或不需要為訪問者保留全局值的Web網站上,可以防止會話啟動,通過在Internet Services Manager中設置屬性,或為不需要狀態的獨立網頁增加代碼(稍後將看到)。
為了禁止整個Web網站的所有會話,可編輯缺省Web網站應用程序的屬性。為了禁止一個指定應用程序的會話,可編輯相應虛擬應用程序的屬性。打開相應的應用程序的PropertIEs對話框,在Home Directory頁上單擊Configuration按鈕,如圖3- 10所示:
圖3-10 Home Directory頁
在出現的Configuration對話框中,打開App Option。這裡可以允許或禁止整個應用程序的會話(在本例中是整個缺省Web 站點),也可以修改缺省的會話Timeout值。在圖3-11中可以看到Timeout設置為20min。在ASP的早期的版本中這是缺省值,可根據要求設置相應的值(在ASP 3.0中,缺省值是10min)。
圖3-11 App Options頁
如果要禁止一個指定網頁的會話,同時允許它們在同一個應用程序的其他網頁中創建和使用,可為該頁面增加一條ASP處理指令。它跟在指定缺省語言的語句後(如果沒指定一個缺省語言,可單獨使用該指令):
<%@LANGUAGE=”VBScript” ENABLESESSIONSTATE=”False”%>到此為止,大致介紹了ASP應用程序和Session對象的一些情況,下面詳細地進行討論。