直播中
3.3.1 ASP的Application對(duì)象成員概述
本節(jié)說明Application對(duì)象的集合、方法和事件(Application對(duì)象沒有屬性)。在下一節(jié)對(duì)Session對(duì)象(具有屬性)進(jìn)行同樣的說明。然后將繼續(xù)探討使用這些對(duì)象所完成的任務(wù),更詳細(xì)地說明每個(gè)對(duì)象的各成員如何進(jìn)行工作。
1. Application對(duì)象的集合
Application對(duì)象提供了兩個(gè)集合,可以用來訪問存儲(chǔ)于全局應(yīng)用程序空間中的變量和對(duì)象。集合及說明如表3-3所示:
表3-3 Application對(duì)象的集合及說明
集 合
說 明
Contents
沒有使用<OBJECT>元素定義的存儲(chǔ)于Application對(duì)象中的所有變量(及它們的值)的一個(gè)集合。包括Variant數(shù)組和Variant類型對(duì)象實(shí)例的引用
StaticObjects
使用<OBJECT>元素定義的存儲(chǔ)于Application對(duì)象中的所有變量(及它們的值)的一個(gè)集合
2. Application對(duì)象的方法
Application對(duì)象的方法允許刪除全局應(yīng)用程序空間中的值,控制在該空間內(nèi)對(duì)變量的并發(fā)訪問。方法及說明如表3-4所示:
表3-4 Application對(duì)象的方法及說明
方 法
說 明
Contents.Remove(“variable_name”)
從Application.Content集合中刪除一個(gè)名為variable_name的變量
Contents.RemoveAll()
從Application.Content集合中刪除所有變量
Lock()
鎖定Application對(duì)象,使得只有當(dāng)前的ASP頁面對(duì)內(nèi)容能夠進(jìn)行訪問。用于確保通過允許兩個(gè)用戶同時(shí)地讀取和修改該值的方法而進(jìn)行的并發(fā)操作不會(huì)破壞內(nèi)容
Unlock()
解除對(duì)在Application對(duì)象上的ASP網(wǎng)頁的鎖定
注意,在運(yùn)行期間不能從Application.StaticObjects集合中刪除變量。
3. Application對(duì)象的事件
Application對(duì)象提供了在它啟動(dòng)和結(jié)束時(shí)觸發(fā)的兩個(gè)事件,如表3-5所示:
表3-5 Application對(duì)象的事件及說明
事 件
說 明
OnStart
當(dāng)ASP啟動(dòng)時(shí)觸發(fā),在用戶請(qǐng)求的網(wǎng)頁執(zhí)行之前和任何用戶創(chuàng)建Session對(duì)象之前。用于初始化變量、創(chuàng)建對(duì)象或運(yùn)行其他代碼
OnEnd
當(dāng)ASP應(yīng)用程序結(jié)束時(shí)觸發(fā)。在最后一個(gè)用戶會(huì)話已經(jīng)結(jié)束并且該會(huì)話的OnEnd事件中的所有代碼已經(jīng)執(zhí)行之后發(fā)生。其結(jié)束時(shí),應(yīng)用程序中存在的所有變量被取消
3.3.2 ASP的Session對(duì)象成員概述
本節(jié)概述Session對(duì)象的所有成員。
1. Session對(duì)象的集合
Session對(duì)象提供了兩個(gè)集合,可以用來訪問存儲(chǔ)于用戶的局部會(huì)話空間中的變量和對(duì)象。這些集合及說明如表3-6所示:
表3-6 Session對(duì)象的集合及說明
集 合
說 明
Contents
存儲(chǔ)于這個(gè)特定Session對(duì)象中的所有變量和其值的一個(gè)集合,并且這些變量和值沒有使用<OBJECT>元素進(jìn)行定義。包括Variant數(shù)組和Variant類型對(duì)象實(shí)例的引用
StaticObjects
通過使用<OBJECT>元素定義的、存儲(chǔ)于這個(gè)Session對(duì)象中的所有變量的一個(gè)集合
2. Session對(duì)象的特性
Session對(duì)象提供了四個(gè)屬性。這些屬性及說明如表3-7所示:
表3-7 Session對(duì)象的屬性及說明
屬 性
說 明
CodePage
讀/寫。整型。定義用于在瀏覽器中顯示頁內(nèi)容的代碼頁(Code Page)。代碼頁是字符集的數(shù)字值,不同的語言和場所可能使用不同的代碼頁。例如,ANSI代碼頁1252用于美國英語和大多數(shù)歐洲語言。代碼頁932用于日文字
LCID
讀/寫。整型。定義發(fā)送給瀏覽器的頁面地區(qū)標(biāo)識(shí)(LCID)。LCID是唯一地標(biāo)識(shí)地區(qū)的一個(gè)國際標(biāo)準(zhǔn)縮寫,例如,2057定義當(dāng)前地區(qū)的貨幣符號(hào)是’£’。LCID也可用于FormatCurrency等語句中,只要其中有一個(gè)可選的LCID參數(shù)。LCID也可在ASP處理指令<%…%>中設(shè)置,并優(yōu)先于會(huì)話的LCID屬性中的設(shè)置。本章后面提供一個(gè)ASP處理指令的列表
SessionID
只讀。長整型。返回這個(gè)會(huì)話的會(huì)話標(biāo)識(shí)符,創(chuàng)建會(huì)話時(shí),該標(biāo)識(shí)符由服務(wù)器產(chǎn)生。只在父Application對(duì)象的生存期內(nèi)是唯一的,因此當(dāng)一個(gè)新的應(yīng)用程序啟動(dòng)時(shí)可重新使用
Timeout
讀/寫。整型。為這個(gè)會(huì)話定義以分鐘為單位的超時(shí)周期。如果用戶在超時(shí)周期內(nèi)沒有進(jìn)行刷新或請(qǐng)求一個(gè)網(wǎng)頁,該會(huì)話結(jié)束。在各網(wǎng)頁中根據(jù)需要可以修改。缺省值是10min。在使用率高的站點(diǎn)上該時(shí)間應(yīng)更短
3. Session對(duì)象的方法
Session對(duì)象允許從用戶級(jí)的會(huì)話空間刪除指定值,并根據(jù)需要終止會(huì)話。Seesion對(duì)象的方法及說明如表3-8所示:
表3-8 Session對(duì)象的方法及說明
方 法
說 明
Contents.Remove(“variable_name”)
從Session.Content集合中刪除一個(gè)名為variable_name的變量
Contents.RemoveAll()
從Session.Content集合中刪除所有變量
Abandon()
當(dāng)網(wǎng)頁的執(zhí)行完成時(shí),結(jié)束當(dāng)前用戶會(huì)話并撤消當(dāng)前Session對(duì)象。但即使在調(diào)用該方法以后,仍可訪問該頁中的當(dāng)前會(huì)話的變量。當(dāng)用戶請(qǐng)求下一個(gè)頁面時(shí)將啟動(dòng)一個(gè)新的會(huì)話,并建立一個(gè)新的Session對(duì)象(如果存在的話)
注意,在運(yùn)行期間不能從Session.StaticObjects集合中刪除變量。
4. Session對(duì)象的事件
Session對(duì)象提供了在啟動(dòng)和結(jié)束時(shí)觸發(fā)的兩個(gè)事件,如表3-9所示:
表3-9 Session對(duì)象的事件及說明
事 件
說 明
OnStart
當(dāng)ASP用戶會(huì)話啟動(dòng)時(shí)觸發(fā),在用戶請(qǐng)求的網(wǎng)頁執(zhí)行之前。用于初始化變量、創(chuàng)建對(duì)象或運(yùn)行其他代碼。
OnEnd
當(dāng)ASP用戶會(huì)話結(jié)束時(shí)觸發(fā)。從用戶對(duì)應(yīng)用程序的最后一個(gè)頁面請(qǐng)求開始,如果已經(jīng)超出預(yù)定的會(huì)話超時(shí)周期則觸發(fā)該事件。當(dāng)會(huì)話結(jié)束時(shí),取消該會(huì)話中的所有變量。在代碼中使用Abandon方法結(jié)束ASP用戶會(huì)話時(shí),也觸發(fā)該事件
3.3.3 使用Application和Session的事件
ASP的Application和Session對(duì)象體現(xiàn)了其他ASP內(nèi)置對(duì)象所沒有的特征——事件。然而,正像在前面的對(duì)象成員表中看到的那樣,這些都是ASP會(huì)話和應(yīng)用程序的工作相聯(lián)系的事件。
1. Application和Session的事件處理器
每當(dāng)一個(gè)應(yīng)用程序或會(huì)話啟動(dòng)或結(jié)束時(shí),ASP觸發(fā)一個(gè)事件。可以通過在一個(gè)特殊的文件中編寫普通的腳本代碼來檢測和應(yīng)答這些事件,這個(gè)文件名為global.asa,位于一個(gè)應(yīng)用程序的根目錄中(對(duì)于缺省的Web網(wǎng)站是\InetPub\WWWRoot目錄,或是作為一個(gè)實(shí)際應(yīng)用程序定義的一個(gè)文件夾)。這個(gè)文件可以包含一個(gè)或多個(gè)HTML的<OBJECT>元素,用于創(chuàng)建將在該應(yīng)用程序或用戶會(huì)話內(nèi)使用的組件實(shí)例。
在第4章中將詳細(xì)地介紹如何創(chuàng)建組件實(shí)例。下面的代碼是global.asa文件的一個(gè)例子。我們只關(guān)注<OBJECT>元素以及以Set關(guān)鍵字開始的那些代碼行:
<!-- Declare instance of the ASPCounter component
with application-level scope //-->
<OBJECT ID=”ASPCounter” RUNAT=”Server” SCOPE=”Application”
PROGID=”MSWC.Counters”>
</OBJECT>
<!-- Declare instance of the ASPContentLimk component
with session-level scope //-->
<OBJECT ID=”ASPContentLink” RUNAT=”Server” SCOPE=”Session”
PROGID=”MSWC.NextLink”>
</OBJECT>
<SCRIPT LANGUAGE=”VBScript” RUNAT=”Server”>
Sub Application_onStart()
‘Create an instance of an ADO Recordset with application-level scope
Set Application(“ADOConnection”) _
= Server.CreateObject(“ADODB.Connection”)
Dim varArray(3) ‘Create a Variant array and fill it
VarArray(0) = “This is a”
VarArray(1) = “Variant array”
VarArray(2) = “stored in the”
VarArray(3) = “Application object”
Application(“Variant_Array”) = varArray‘Store it in the Application
Application(“Start_Time”) = CStr(Now) ‘Store the date/time as a string
Application(“Visit_Count”) = 0 ‘Set Counter variable to zero
End Sub
Sub Application_onEnd()
Set Application(“ADOConnection”) = Nothing
End Sub
Sub Sesson_onStart()
‘Create an instance of the AdRotator component with session-level scope
Set Session(“ASPAdRotator”) = Server.CreateObject(“MSWC.AdRotator”)
Dim varArray(3) ‘Create a Variant arry and fill it
VarArray(0) = “This is a”
VarArray(1) = “Variant array”
VarArray(2) = “stored in the”
VarArray(3) = “Session object”
Session(“Variant_Array”) = varArray ‘Store it in the Session
Session(“Start_Time”) = CStr(Now) ‘Store the date/time as a string
‘We can access the contents of the Request and Response in a Session_onStart
‘event handler for the page that initiated the session. This is the *only*
‘place that the ASP page context is available like this.
‘a(chǎn)s an example, we can get the IP address of the user:
Session(“Your_IP_Address”) = Request.ServerVariables(“REMOTE_ADDR”)
Application.Lock
intVisits = Application(“Visit_Count”) +1
Application(“Visit_Count”) = intVisits
Application.Unlock
End Sub
Sub Session_onEnd()
Set Session(“ASPAdRotator”) = Nothing
End Sub
</SCRIPT>
因?yàn)檫@個(gè)global.asa文件用于本章中的示例頁面,所以將需要將該文件放到Web網(wǎng)站的根目錄中,或者放到已配置為一個(gè)虛擬應(yīng)用程序的目錄中,并且在該目錄中包含有其他示例文件。
讀取和存儲(chǔ)值
注意上面的例子怎樣讀取Application和Session的變量,與在Request和Response對(duì)象的集合中所采取的方式相同。設(shè)置這些變量的值:
Application(“variable_name”) = variable_value
Application(“variable_name”) = variant_array_variable_name
Set Application(“variable_name”) = object_reference
獲取這些變量的值:
variable_value = Application(“variable_name”)
variant_array_variable = Application(“variable_name”)
Set object_reference = Application(“variable_name”)
當(dāng)然,對(duì)于Session對(duì)象可采取同樣的方法。
可以看到,當(dāng)從一個(gè)Session事件處理器訪問時(shí),怎樣“鎖定”(Lock)和“解鎖”(unlock)該Application對(duì)象;當(dāng)從一個(gè)ASP網(wǎng)頁訪問時(shí),需要進(jìn)行相同的處理。用Application事件內(nèi)的代碼訪問Application對(duì)象中的值時(shí),不要求這么做。這是因?yàn)樵谌魏螒?yīng)用程序中只有一個(gè)Application對(duì)象的實(shí)例,并且其事件處理器的代碼只在沒有活動(dòng)的用戶會(huì)話時(shí)進(jìn)行。
也可以看到一個(gè)基本的用戶會(huì)話計(jì)數(shù)器是如何實(shí)現(xiàn)的。這里使用一個(gè)應(yīng)用程序級(jí)的變量Visit_count,當(dāng)新的會(huì)話啟動(dòng)時(shí)它就自動(dòng)增加。 一般也不限制簡單地把值保存到Application或Session對(duì)象中。例如,Web開發(fā)者的Web站點(diǎn)在http://webdev.wrox.co.uk上,有相應(yīng)的一個(gè)global.asa文件,當(dāng)一個(gè)新的會(huì)話啟動(dòng)時(shí)該文件就在服務(wù)器上的數(shù)據(jù)庫中寫入相應(yīng)的條目,數(shù)據(jù)細(xì)節(jié)從Request.ServerVariables集合中獲取。這提供了一個(gè)基本的方法統(tǒng)計(jì)訪問者的數(shù)量,并收集訪問者的一些基本信息。