(4) 刪除虛擬應(yīng)用程序
單擊“Remove”按鈕不會真正地刪除Internet Services Manager中的該條目。而是把現(xiàn)有的虛擬應(yīng)用程序轉(zhuǎn)換為一個虛擬目錄。這個目錄有一個帶有藍(lán)色球的“文件夾”圖標(biāo),該圖標(biāo)表示這并不是Web網(wǎng)站中一個真正的目錄,而是對磁盤上另一個文件夾的一個重定向。對它進(jìn)行的訪問方式與創(chuàng)建它的虛擬應(yīng)用程序相同(即使用相同的URL),但是不作為一個應(yīng)用程序。換句話說,它不支持自己的Application對象,而是繼承缺省Web網(wǎng)站的Application對象,或者是在該目錄的父目錄中的另一個應(yīng)用程序的Application對象。
為了刪除一個虛擬應(yīng)用程序,可簡單地在Internet Services Manager中的對象上單擊右鍵,在彈出的菜單中選擇Delete。
(5) 應(yīng)用程序存儲的內(nèi)容
ASP Application對象提供的全局存儲空間可以用來存儲下列內(nèi)容:
· 簡單變量,例如字符串和數(shù)字(存儲為Variant,類似于ASP腳本變量)。
· Variant類型數(shù)組,一維或多維。
· 對一個COM對象實(shí)例的變量引用(類型于Variant)。
(6) Variant的定義
Variant是在VBScript腳本引擎中為ASP(和Internet Explorer)提供的唯一變量類型,與在VB和VBA中定義的數(shù)據(jù)類型Variant相類似。與大多數(shù)常用的基本數(shù)據(jù)類型(例如字符串或整數(shù))相比,盡管它不能使存儲單元最高效地存儲變量,需要進(jìn)行額外的處理,但Variant提供許多用處。
從內(nèi)部來Variant數(shù)據(jù)類型存儲數(shù)值作為獨(dú)立的子類型。它能自動地處理隱含的類型轉(zhuǎn)換,允許使用如下的代碼:
strString = ”30”
intInteger = 12
Response.Write strString & intInteger ‘Writes 3012 in the resulting page
Response.Write strString + intInteger ‘Writes 42 in the resulting page
隱含的數(shù)據(jù)類型轉(zhuǎn)換允許忽略HTML廣西的值和列表控件是字符串的情況,并且如果需要的話可以把它們當(dāng)成數(shù)字(假設(shè)字符串確實(shí)包含一個有效的數(shù)字)。也可以隨意地做一些其他的事情,諸如使用VBScript的Len方法檢查Request.Form集合中并不存在的一個值的長度。Len函數(shù)試圖把從Request.Form的調(diào)用的值轉(zhuǎn)換成一個字符串。如果該值丟失,返回空(Empty),轉(zhuǎn)換為帶有””的一個字符串,因此長度是零。
(7) VBScript數(shù)據(jù)類型及轉(zhuǎn)換
也可以進(jìn)行顯式的數(shù)據(jù)類型轉(zhuǎn)換。在VBScript中,VarType方法返回一個整數(shù),表明Variant當(dāng)前保存的子類型:
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
還有一些函數(shù),如IsArray、IsDate、IsEmpty、IsNull、IsNumeric和IsObject,對于特定的子類型返回一個Boolean結(jié)果。一旦知道了數(shù)據(jù)的子類型,如果包含的數(shù)據(jù)合適的話,就可以將之轉(zhuǎn)換成不同的Variant子類型。這對代碼的透明性和檢查變量是否包含合法值都是有用的,非法的轉(zhuǎn)換將導(dǎo)致運(yùn)行期錯誤,轉(zhuǎn)換如下所示:
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數(shù)據(jù)類型及轉(zhuǎn)換
在JScript中,其他一些變量類型類似于VBScript,但是沒有代表對象的Variant。所有值都是對象,類型是下列六種數(shù)據(jù)類型之一:
· undefined:只有單個值,用于表明請求中的變量沒有聲明和創(chuàng)建,或者若是隱含創(chuàng)建但還未分配任何值。類似于VBScript的Empty。
· Null:變量不包含一個有效的值。類似于VBScript的Nothing。
· Boolean。
· String。
· Number。
· Object。
JScript提供了一個typeof函數(shù),返回表示數(shù)據(jù)的類型的字符串,例如:
StrString = ‘30’;
IntInteger = 12;
Response.Write(typeof(strString)); //Write ‘string’ in the resulting page
Response.Write(typeof(intInteger)); //Write ‘number’ in the resulting page
每種數(shù)據(jù)類型都有toString方法和valueOf方法,toString方法將變量的值轉(zhuǎn)為一個字符串返回,valueOf方法把變量的值作為它的原有數(shù)據(jù)類型返回。
(9) JScript的級聯(lián)和加法問題
JScript在許多方面不同于VBScript,在一定程度上是因?yàn)闆]有“&”級聯(lián)運(yùn)算符可用。當(dāng)使用加法運(yùn)算符時,它先檢查變量的數(shù)據(jù)類型以決定要做什么。如果兩個變量都是數(shù)值,結(jié)果是數(shù)值的和。如果一個或兩個是字符串,結(jié)果是字符串的級聯(lián):
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
如果進(jìn)行加法的值超過兩個,要看執(zhí)行的順序。下面的代碼進(jìn)行相應(yīng)的示范:
intInteger = 12;
Response.Write(intInteger + intInteger + “
”); //Result is ‘24
’
Response.Write(“
” + intInteger + intInteger + “
”);
//Result is ‘
1212
’
在第一種情況下,兩個數(shù)相加,結(jié)果被轉(zhuǎn)換為一個字符串并與“
”字符串進(jìn)行級聯(lián)。在第二種情況下,第一個運(yùn)算符是一個字符串和一個數(shù)的級聯(lián),所以數(shù)被轉(zhuǎn)換為一個字符串。而后,所有的運(yùn)算符都是級聯(lián)運(yùn)算符。為了避免這個問題,可以使用括號強(qiáng)制第一個運(yùn)算符是兩個數(shù)值的加法:
Response.Write(“
” + (intInteger + intInteger) + “
”);
//Result is ‘
24
’
1. Web應(yīng)用程序中的組件管理
在ASP中使用虛擬應(yīng)用程序的第二個主要方面是:具有較好的對在腳本代碼內(nèi)實(shí)例化和執(zhí)行的組件進(jìn)行管理的能力。先不討論有關(guān)它怎樣進(jìn)行工作以及為什么會如此有用的詳細(xì)情況,在學(xué)習(xí)ASP組件的部分時再討論相關(guān)內(nèi)容。
這里非常簡要地介紹在ASP網(wǎng)頁(此ASP網(wǎng)頁在該應(yīng)用程序中)中使用組件時,如何對一個虛擬應(yīng)用程序在Properties對話框(在Internet Services Manager中)進(jìn)行設(shè)置。
在一個虛擬應(yīng)用程序的Properties對話框的Home Directory頁的底部,有兩個組合框,為Execute Permissions和Application Protection,如圖3-9所示:
<img src=http://go2.163.com/~davelu/asp35.jpg>
圖3-9 Execute Permissions和Application Protection組合框
應(yīng)用的保護(hù)和執(zhí)行設(shè)置
因?yàn)樵诒菊轮?,不討論在一個Web網(wǎng)頁內(nèi)如何創(chuàng)建組件的實(shí)例,因此這里先列出這些選項,在創(chuàng)建應(yīng)用程序時可能要對此進(jìn)行設(shè)置。Execute Permissions 選項如表3-1所示:
表3-1 Execute Permissions的選項及說明
選 項
說 明
None
在這個虛擬應(yīng)用程序中不能運(yùn)行腳本或可執(zhí)行文件。實(shí)際上,提供了禁止一個應(yīng)用程序的快速和簡單的方法
ScriptsOnly
只允許腳本文件(例如ASP、IDC或其他的)在這個虛擬應(yīng)用程序中運(yùn)行,不能運(yùn)行可執(zhí)行文件
Scriptsand Executables
允許任何的腳本和可執(zhí)行文件在這個虛擬應(yīng)用程序內(nèi)運(yùn)行
Execute Permissions選項控制可在該虛擬應(yīng)用程序中執(zhí)行的類型,而Application Protection選項影響可執(zhí)行文件和組件運(yùn)行的方式。在第1章中已經(jīng)討論過可用的選項,但是在這里再重復(fù)一次,Application Protection選項如表3-2所示:
表3-2 Application Protection的選項及說明
選 項
說 明
Low(IIS Process)
帶有這種設(shè)置的ASP虛擬應(yīng)用程序的所有可執(zhí)行文件和組件運(yùn)行在Web服務(wù)器的可執(zhí)行文件(Inetinfo.exe)的進(jìn)程(即內(nèi)存空間)中。因此,如果可執(zhí)行文件或組件之一失敗的話,Web服務(wù)器處于危險狀態(tài)。這提供了最快和以最少的資源執(zhí)行的選項
Medium(Pooled)
(缺省)帶有這種設(shè)置的ASP虛擬應(yīng)用程序的所有應(yīng)用程序的可執(zhí)行文件和組件是運(yùn)行在DLLHost.exe的單個共享實(shí)例的進(jìn)程(即內(nèi)存空間)中。這就防止了Web服務(wù)器可執(zhí)行文件(Inetinfo.exe)受可執(zhí)行文件或組件失敗的影響。然而,一個失敗的可執(zhí)行文件或組件可能引起DLLHost.exe進(jìn)程失敗,以及所有其他駐留其中的可執(zhí)行文件和組件失敗
High(Isolated)
帶有這種設(shè)置的ASP虛擬應(yīng)用程序的所有應(yīng)用程序的可執(zhí)行部分和組件是運(yùn)行在DLLHost.exe的單個共享實(shí)例的進(jìn)程(即內(nèi)存空間)中,但是每個ASP應(yīng)用程序都有自己的DLLHost.exe實(shí)例,該實(shí)例對該應(yīng)用程序是獨(dú)占的。這就防止了Web服務(wù)器可執(zhí)行文件(Inetinfo.exe)受可執(zhí)行文件或組件失敗的影響,并防止虛擬應(yīng)用的單個共享實(shí)例受另一個虛擬應(yīng)用程序的一個可執(zhí)行文件或組件失敗的影響。Microsoft建議最多有十個這樣的虛擬應(yīng)用程序駐留在一個Web服務(wù)器上
3.2.2 ASP會話的定義
ASP會話引入了一個Web應(yīng)用程序中粒度的下一層。ASP的Application對象可用來存儲對于“正在運(yùn)行此應(yīng)用程序”的所有用戶都是全局的和可訪問的狀態(tài)(即簡單變量、對象、數(shù)組等)。換句話說,用于響應(yīng)這個應(yīng)用程序內(nèi)所有訪問者的請求的全部ASP代碼能夠?qū)@些值進(jìn)行訪問(假設(shè)已經(jīng)建立了一個有效的會話,稍后將看到)。
但是在多數(shù)情況下這還不夠。需要具備存儲指定給每個用戶的值的能力,而不必通過給這些值分配名字指明其隸屬于哪個用戶。例如,下列值很可能弄亂應(yīng)用程序的全局存儲空間:
MikeJones003PrefFGColor = “darkblue”
MikeJones003PrefBGColor = “white”
MikeJones003PrefLinkClolr = “green”
PriscillaDelores001PrefFGColor = “red”
PriscillaDelores001PrefBGColor = “darkgrey”
...
etc.
從載入系統(tǒng)資源和要求一些代碼訪問每個用戶的相應(yīng)會話的角度來看,還有另外的不足之處。只要有訪問者,該應(yīng)用程序就一直存在,這意味著應(yīng)用程序的全局存儲空間需要不斷增大,除非在用戶離開該網(wǎng)站時采取步驟刪除這些值。
在Web應(yīng)用程序中提供用戶層作用域
除了使用全局變量的存儲以外,應(yīng)該為每個訪問者分配他們自己的私有變量存儲空間,使其對指定訪問者載入的所有頁面都可用的。這種情況下,可以對每個變量使用相同的名字,使ASP代碼非常簡單地得以實(shí)現(xiàn)。這些相同的代碼對每個用戶將透明地進(jìn)行工作,因?yàn)樵L問的只是訪問者擁有的私有存儲區(qū)域:
PrefFGColor = “darkblue”
PrefBGColor = “white”
PrefLinkColor = “green”
這就是Session對象產(chǎn)生的地方。
(1) 會話存儲的內(nèi)容
會話存儲的內(nèi)容對指定的訪問者是全局的,而對其他訪問者來講是私有的,這使得ASP的會話非常有用??梢杂脕泶鎯υ贏SP Application對象中存儲的相同類型的數(shù)據(jù),即:
· 簡單變量,例如字符串和數(shù)值(像所有的ASP腳本變量一樣存儲為Variant)。
· Variant數(shù)組,一維或多維。
· 對一個COM對象的實(shí)例的變量引用(如同Variant)。
(2) 會話帶來的問題
會話提供了一個存儲每個用戶特定的值的方法。然而有幾個意想不到的問題要注意:
· 記住一些瀏覽器和Web服務(wù)器對URL、路徑和文件名的大小寫形式是敏感的(例如Navigator和基于UNIX/Linux的服務(wù)器)。如果把一個超級鏈接放置在網(wǎng)頁的一個URL上,并且它們不是同樣的書寫形式,則在瀏覽器中被認(rèn)為是不相同的。同樣,如果路徑和文件名的書寫形式不是相同的,則瀏覽器認(rèn)為是不同的路徑或文件。對于在服務(wù)器上的定位資源來講,這并不重要,因?yàn)镮IS對書寫形式不敏感,可以接受大寫形式和小寫形式的任何組合,并返回書寫形式不同的具有相同字符的文件。然而,如果一個cookie已經(jīng)指定了一個路徑,而且與在超級鏈接中所指定的路徑在書寫形式上不同,瀏覽器可能不會把它以及相應(yīng)目錄的頁面一起返回給服務(wù)器。這有可能找不到依賴于這個cookie的一個用戶會話,并且Session對象將不會在作用域中(即其中的任何變量都是不可用的)。因此,在所有的目錄和網(wǎng)頁名字中,堅持都采用小寫形式或者是比較明顯的混合字母形式,是一個好辦法。
· 在IIS和ASP的早期版本中,對于嵌套的應(yīng)用程序還有一些小的“Bug”,有時,當(dāng)用戶離開嵌套的ASP虛擬應(yīng)用程序并返回到缺省的ASP應(yīng)用程序?qū)訒r,與嵌套應(yīng)用程序內(nèi)部已經(jīng)定義的局部變量相同的名字的任何全局變量不能重新顯現(xiàn)。還有,當(dāng)會話使用Session.Abandon方法(稍后將會看到)終止時,global.asp文件中的代碼將執(zhí)行失敗。在ASP 3.0中已經(jīng)解決了這些問題。
· 記住會話依賴于cookie。如果訪問者已經(jīng)禁止使用cookie或者瀏覽器不支持cookie,將不能啟動一個會話,并且不能訪問Session對象。
(3) 禁止會話
雖然狀態(tài)提供了有益環(huán)境,但讓用戶門戶大開。如果不需要保留狀態(tài),可以禁止會話以節(jié)約計算機(jī)的處理時間。例如,在一個不需要跟蹤訪問者或不需要為訪問者保留全局值的Web網(wǎng)站上,可以防止會話啟動,通過在Internet Services Manager中設(shè)置屬性,或?yàn)椴恍枰獱顟B(tài)的獨(dú)立網(wǎng)頁增加代碼(稍后將看到)。
為了禁止整個Web網(wǎng)站的所有會話,可編輯缺省Web網(wǎng)站應(yīng)用程序的屬性。為了禁止一個指定應(yīng)用程序的會話,可編輯相應(yīng)虛擬應(yīng)用程序的屬性。打開相應(yīng)的應(yīng)用程序的Properties對話框,在Home Directory頁上單擊Configuration按鈕,如圖3-10所示:
<img src=http://go2.163.com/~davelu/asp36.jpg>
圖3-10 Home Directory頁
在出現(xiàn)的Configuration對話框中,打開App Option。這里可以允許或禁止整個應(yīng)用程序的會話(在本例中是整個缺省Web站點(diǎn)),也可以修改缺省的會話Timeout值。在圖3-11中可以看到Timeout設(shè)置為20min。在ASP的早期的版本中這是缺省值,可根據(jù)要求設(shè)置相應(yīng)的值(在ASP 3.0中,缺省值是10min)。
<img src=http://go2.163.com/~davelu/asp37.jpg>
圖3-11 App Options頁
如果要禁止一個指定網(wǎng)頁的會話,同時允許它們在同一個應(yīng)用程序的其他網(wǎng)頁中創(chuàng)建和使用,可為該頁面增加一條ASP處理指令。它跟在指定缺省語言的語句后(如果沒指定一個缺省語言,可單獨(dú)使用該指令):
<%@LANGUAGE=”VBScript” ENABLESESSIONSTATE=”False”%>到此為止,大致介紹了ASP應(yīng)用程序和Session對象的一些情況,下面詳細(xì)地進(jìn)行討論。