Web應用程式的定義

來源:互聯網
上載者:User
web|程式


     前面的章節中已經多次使用過Web應用程式(Web Application)術語,所指的既不是一個真正意義上的Web網站,又不是一個傳統的應用程式。換句話說,而是認為它是一些Web網頁和用來完成某些任務的其他資源的一個集合。它隱含這樣一層意思:有一個預定義的路線貫穿於網頁之中,使用者可做出選擇或提供資訊使任務能夠完成。
     例如,一個線上商店,你為了購買貨物,進行反覆的觀察和選擇,瀏覽一系列網頁,收集所需要的資訊,支付相應的費用,最後發出定單。也可能是一個“軟體升級嚮導”,指導使用者完成下載和安裝新軟體的過程,或者可能是一個基於Intranet的報價單或銷售報告的產生工具。
     所有這些不同於“標準”的Web網站,一般的Web網站使用一系列菜單或導覽列以預先未定義的路徑漫遊該網站。但是一個Web應用程式遠不只是受控制的導航器。自由地漫遊於一個Web網站時,可以進行無狀態的和匿名的訪問,但Web應用程式一般不接受。

     3.2.1 ASP應用程式的定義
     上述內容可以認為是術語“Web應用程式”的一個合理的一般定義,但遺憾的是,在談論有關“ASP應用”時,僅這些還不夠。回答什麼是“Web應用”可以是主觀的,而回答什麼是“ASP應用”則需要從技術上的解釋。在ASP中術語“應用程式”有自己特定的含義,在討論如何?之前,弄懂這個概念至關重要。
     ASP應用程式與兩個主要的內容有關:
     · 全域範圍的規定,具有一個全域可訪問的變數儲存地區。
     · 通過COM+與IIS的整合,可更好地管理組件。
     下面討論這些內容。第二個內容涉及到其他ASP對象,其覆蓋範圍相應廣泛。在下一章研究ASP Server對象時,將對這部分內容進行詳細地討論。
     1. 提供Web應用程式的全域範圍
     ASP提供一個Application對象,基本上與前面討論的Session對象相當。但是,這是在應用程式層而不是在使用者層。換句話說,該對象是全域的,不是對單獨使用者的,而是對應用程式的所有使用者,其範圍不限制為單獨使用者的訪問。這與在一個正常的可執行應用程式中的全域(或Public)變數相同。Application對象可用於在全域環境中儲存變數和資訊(即狀態),該應用程式內的任何ASP網頁中啟動並執行指令碼都可訪問這些值,而不管是哪個訪問者發出的請求。
     但是,這沒有回答主要問題:什麼是一個ASP應用程式?為此,需要研究ASP內部的一些情況。
     當使用者請求一個ASP網頁時,IIS通過執行個體化asp.dll(用來實現ASP)建立一個環境(如第1章所述)。將該頁面解釋為伺服器端指令碼,相應的指令碼引擎的執行個體用來執行該指令碼。
     執行個體化的asp.dll初如事件啟動一個ASP應用程式,建立一個Application對象。然後,為這個使用者啟動一個會話,並建立單獨的Session對象。當更多的會話啟動時,這個Application對象保留在範圍中(即已經執行個體化和可用)。一旦最後保持活動的會話結束,該應用程式就結束,並取消相應的Application對象。
     (1) 預設的ASP應用
     Windows 2000在安裝IIS和ASP時,建立一個預設的Web網站。它被配置成一個ASP應用程式,涉及到在Properties對話方塊中針對網站根目錄檔案夾(預設為C:InetpubWWWRoot)的一些設定。圖3-2所示是預設Web網站的Properties對話方塊的螢幕。

     涉及到ASP應用程式的檔案之一是global.asa。這個檔案用於定製應用程式行為的方式。放置在應用程式的根目錄下,可用於該目錄下的所有子目錄。因此,如果它放置在整個Web網站的根目錄下,則定義整個網站作為預設的ASP應用程式的一部分。
     在本章後面有關應用程式和會話事件的部分中,將看到這個檔案及其使用方法。
     (2) ASP虛擬應用程式
     如同在設定過程中建立預設的應用程式一樣,可以在該Web網站的任何子目錄中建立屬於自己的ASP虛擬應用程式。這個應用程式套件組合含作為“應用程式目錄”而定義的目錄中所有的子目錄。並且,這個目錄和子檔案夾也都是預設應用程式的一部分,共用由預設的Application對象建立的全域空間。
     事實上,在預設的應用程式中儲存的所有變數在子目錄中的應用程式中也都是可用的。然而,如果該子目錄應用程式中的一個ASP網頁把一個值寫入Application對象,而Application對象與預設(根)應用程式中已存在的一個值有相同的名字,那麼,原先的值在子目錄應用程式中就不能再用。但是在其他的應用程式或ASP網頁中,將保留原有的值,因為根目錄的應用程式不能訪問子目錄應用中的值。
     從一個子程式或函數的變數的角度考慮這個問題。如果定義一個變數intMyValue為Public或全域的變數,可以從任何的子程式或函數內部訪問該變數。但是,如果又聲明一個具有相同名字的局部變數,並在該子程式或函數內對該變數進行引用,則得到此變數的局部值。不能再訪問原先的值。當子程式或函數結束,局部值被撤消,全域變數原有的值仍然保留著:
Public intMyValue = 42
Function DoSomething()
Response.Write intMyValue ‘Gives 42 from global variable
Dim intMyValue
IntMyValue = 17
Response.Write intMyValue ‘Gives 17 from new local variable,but
‘the global value of MyValue is still 42
End Function
     (3) 建立自己的ASP虛擬應用程式
     為了建立一個新的虛擬應用程式,使用Internet Services Manager應用程式或具有相同功能的HTML Web Manager網頁。在Internet Services Manager中,在要建立的虛擬應用程式的目錄上單擊右鍵,並選擇New,接著選擇Virtual Directory,螢幕如圖3-3所示:

     這個操作啟動New Virtual Directory Wizard,該嚮導的開始畫面提供有關嚮導的操作資訊。單擊Next,在第二頁中鍵入新的虛擬應用程式的名字(或別名)。這個名字與Internet Services Manager中選擇的目錄的路徑聯合起來,將成為該應用程式的URL。螢幕如圖3-4所示:

     為了把一個現有的目錄轉換為與該目錄具有相同名字的一個應用程式,選擇包含想要轉換的目錄,並在嚮導的Virtual Directory Alias頁中使用該目錄名。例如把已有的test目錄轉換為一個虛擬應用程式,應該在Internet Services Manager中選擇Default Web Site條目,並提供一個別名“test”。
     再單擊Next,指定包含該應用程式的內容(頁面)的路徑。單擊Browser選擇一個已有目錄。這個目錄是新的虛擬應用指向的目錄。螢幕如圖3-5所示:

     單擊Next開啟Access Permissions頁,選擇給予這個應用程式的所有使用者的許可權。預設值是Read和Run Scripts,對大多數使用者而言是適合的。螢幕如圖3-6所示:

     如果想編寫使用者可直接執行的、定製的編譯的CGI應用程式,只選擇“Execute”:例如,使用者通過在請求的URL中指定相應名字的方法執行的一個.exe檔案,像“http://mysite.com/.../Test Application/create_user.exe?user=Jjones”。
     單擊Next,嚮導建立虛擬應用程式。在圖3-7所示的螢幕中,可在左邊的列表欄中看到帶有一個包含一些填充物的開啟的小盒子表徵圖。

     如果現在用按右鍵新的應用程式並選擇Properties,可以看到嚮導已經選擇的設定。在這裡可根據需要修改存取權限、“Local Path”和“Application Settings”。同時會看到一個Remove按鈕,可以用來刪除該虛擬應用程式,如圖3-8所示:

     (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相類似。與大多數常用的基礎資料型別 (Elementary Data Type)(例如字串或整數)相比,儘管它不能使儲存單元最高效地儲存變數,需要進行額外的處理,但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 + “
”); //Result is ‘24
'
Response.Write(“
” + intInteger + intInteger + “
”);
//Result is ‘
1212
'
     在第一種情況下,兩個數相加,結果被轉換為一個字串並與“ ”字串進行級聯。在第二種情況下,第一個運算子是一個字串和一個數的級聯,所以數被轉換為一個字串。而後,所有的運算子都是級聯運算子。為了避免這個問題,可以使用括弧強制第一個運算子是兩個數值的加法:
Response.Write(“
” + (intInteger + intInteger) + “
”);
//Result is ‘
24
'
    1. Web應用程式中的組件管理
    在ASP中使用虛擬應用程式的第二個主要方面是:具有較好的對在指令碼代碼內執行個體化和執行的組件進行管理的能力。先不討論有關它怎樣進行工作以及為什麼會如此有用的詳細情況,在學習ASP組件的部分時再討論相關內容。
    這裡非常簡要地介紹在ASP網頁(此ASP網頁在該應用程式中)中使用組件時,如何對一個虛擬應用程式在Properties對話方塊(在Internet Services Manager中)進行設定。
    在一個虛擬應用程式的Properties對話方塊的Home Directory頁的底部,有兩個組合框,為Execute Permissions和Application Protection,如圖3-9所示:

    應用的保護和執行設定
    因為在本章中,不討論在一個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所示:

在出現的Configuration對話方塊中,開啟App Option。這裡可以允許或禁止整個應用程式的會話(在本例中是整個預設Web網站),也可以修改預設的會話Timeout值。在圖3-11中可以看到Timeout設定為20min。在ASP的早期的版本中這是預設值,可根據要求設定相應的值(在ASP 3.0中,預設值是10min)。

如果要禁止一個指定網頁的會話,同時允許它們在同一個應用程式的其他網頁中建立和使用,可為該頁面增加一條ASP處理指示。它跟在指定預設語言的語句後(如果沒指定一個預設語言,可單獨使用該指令):
<%@LANGUAGE=”VBScript” ENABLESESSIONSTATE=”False”%>到此為止,大致介紹了ASP應用程式和Session對象的一些情況,下面詳細地進行討論。




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。