在已經發表的系列文章中我們已經討論了兩個ASP對象:Application對象和Session對象,因此能夠訪問Application對象和Session對象提供的集合、方法、屬性和事件。本節將從程序設計的角度對這兩個對象進行研究。
· 當載入ASP DLL並響應對一個ASP網頁的第一個請求時,創建Application對象。該對象提供一個存儲場所,用來存儲對於所有訪問者打開的所有網頁都可用的變量和對象。
· 當訪問者首次從站點請求一個ASP頁面時,爲他創建一個Session對象,並保持有效直到缺省的超時週期(或由腳本確定的超時週期)。該對象提供一個存儲場所,用來存儲僅僅對該訪問者在會話的活動期間打開的網頁可用的變量和對象。
關係
1、ASP的Application對象成員概述
本節說明Application對象的集合、方法和事件(Application對象沒有屬性)。在下一節對Session對象(具有屬性)進行同樣的說明。然後將繼續探討使用這些對象所完成的任務,更詳細地說明每個對象的各成員如何進行工作。
1. Application對象的集合
Application對象提供了兩個集合,可以用來訪問存儲於全局應用程序空間中的變量和對象。集合及說明如下所示:
表Application對象的集合及說明
集 合 | 說 明 |
Contents | 沒有使用<OBJECT>元素定義的存儲於Application對象中的所有變量(及它們的值)的一個集合。包括Variant數組和Variant類型對象實例的引用 |
StaticObjects | 使用<OBJECT>元素定義的存儲於Application對象中的所有變量(及它們的值)的一個集合 |
2. Application對象的方法
Application對象的方法允許刪除全局應用程序空間中的值,控制在該空間內對變量的併發訪問。方法及說明如下表所示:
表Application對象的方法及說明
方 法 | 說 明 |
Contents.Remove(“variable_name”) | 從Application.Content集合中刪除一個名爲variable_name的變量 |
Contents.RemoveAll() | 從Application.Content集合中刪除所有變量 |
Lock() | 鎖定Application對象,使得只有當前的ASP頁面對內容能夠進行訪問。用於確保通過允許兩個用戶同時地讀取和修改該值的方法而進行的併發操作不會破壞內容 |
Unlock() | 解除對在Application對象上的ASP網頁的鎖定 |
注意,在運行期間不能從Application.StaticObjects集合中刪除變量。
3. Application對象的事件
Application對象提供了在它啓動和結束時觸發的兩個事件,如下表所示:
表Application對象的事件及說明
事 件 | 說 明 |
OnStart | 當ASP啓動時觸發,在用戶請求的網頁執行之前和任何用戶創建Session對象之前。用於初始化變量、創建對象或運行其他代碼 |
OnEnd | 當ASP應用程序結束時觸發。在最後一個用戶會話已經結束並且該會話的OnEnd事件中的所有代碼已經執行之後發生。其結束時,應用程序中存在的所有變量被取消 |
ASP的Session對象成員概述
本節概述Session對象的所有成員。
1. Session對象的集合
Session對象提供了兩個集合,可以用來訪問存儲於用戶的局部會話空間中的變量和對象。這些集合及說明如下表所示:
表 Session對象的集合及說明
集 合 | 說 明 |
Contents | 存儲於這個特定Session對象中的所有變量和其值的一個集合,並且這些變量和值沒有使用<OBJECT>元素進行定義。包括Variant數組和Variant類型對象實例的引用 |
StaticObjects | 通過使用<OBJECT>元素定義的、存儲於這個Session對象中的所有變量的一個集合 |
2. Session對象的特性
Session對象提供了四個屬性。這些屬性及說明如下表所示:
表3-7 Session對象的屬性及說明
屬 性 | 說 明 |
CodePage | 讀/寫。整型。定義用於在瀏覽器中顯示頁內容的代碼頁(Code Page)。代碼頁是字符集的數字值,不同的語言和場所可能使用不同的代碼頁。例如,ANSI代碼頁1252用於美國英語和大多數歐洲語言。代碼頁932用於日文字 |
LCID | 讀/寫。整型。定義發送給瀏覽器的頁面地區標識(LCID)。LCID是唯一地標識地區的一個國際標準縮寫,例如,2057定義當前地區的貨幣符號是’£’。LCID也可用於FormatCurrency等語句中,只要其中有一個可選的LCID參數。LCID也可在ASP處理指令<%…%>中設置,並優先於會話的LCID屬性中的設置。本章後面提供一個ASP處理指令的列表 |
SessionID | 只讀。長整型。返回這個會話的會話標識符,創建會話時,該標識符由服務器產生。只在父Application對象的生存期內是唯一的,因此當一個新的應用程序啓動時可重新使用 |
Timeout | 讀/寫。整型。爲這個會話定義以分鐘爲單位的超時週期。如果用戶在超時週期內沒有進行刷新或請求一個網頁,該會話結束。在各網頁中根據需要可以修改。缺省值是10min。在使用率高的站點上該時間應更短 |
3. Session對象的方法
Session對象允許從用戶級的會話空間刪除指定值,並根據需要終止會話。Seesion對象的方法及說明如下表所示:
表Session對象的方法及說明
方 法 | 說 明 |
Contents.Remove(“variable_name”) | 從Session.Content集合中刪除一個名爲variable_name的變量 |
Contents.RemoveAll() | 從Session.Content集合中刪除所有變量 |
Abandon() | 當網頁的執行完成時,結束當前用戶會話並撤消當前Session對象。但即使在調用該方法以後,仍可訪問該頁中的當前會話的變量。當用戶請求下一個頁面時將啓動一個新的會話,並建立一個新的Session對象(如果存在的話) 注意,在運行期間不能從Session.StaticObjects集合中刪除變量。 |
4. Session對象的事件
Session對象提供了在啓動和結束時觸發的兩個事件,如表3-9所示:
表3-9 Session對象的事件及說明
事 件 | 說 明 |
OnStart | 當ASP用戶會話啓動時觸發,在用戶請求的網頁執行之前。用於初始化變量、創建對象或運行其他代碼。 |
OnEnd | 當ASP用戶會話結束時觸發。從用戶對應用程序的最後一個頁面請求開始,如果已經超出預定的會話超時週期則觸發該事件。當會話結束時,取消該會話中的所有變量。在代碼中使用Abandon方法結束ASP用戶會話時,也觸發該事件 |
注意,在運行期間不能從Application.StaticObjects集合中刪除變量。
3. Application對象的事件
Application對象提供了在它啓動和結束時觸發的兩個事件,如下表所示:
表Application對象的事件及說明
事 件 | 說 明 |
OnStart | 當ASP啓動時觸發,在用戶請求的網頁執行之前和任何用戶創建Session對象之前。用於初始化變量、創建對象或運行其他代碼 |
OnEnd | 當ASP應用程序結束時觸發。在最後一個用戶會話已經結束並且該會話的OnEnd事件中的所有代碼已經執行之後發生。其結束時,應用程序中存在的所有變量被取消 |
ASP的Session對象成員概述
本節概述Session對象的所有成員。
1. Session對象的集合
Session對象提供了兩個集合,可以用來訪問存儲於用戶的局部會話空間中的變量和對象。這些集合及說明如下表所示:
表 Session對象的集合及說明
集 合 | 說 明 |
Contents | 存儲於這個特定Session對象中的所有變量和其值的一個集合,並且這些變量和值沒有使用<OBJECT>元素進行定義。包括Variant數組和Variant類型對象實例的引用 |
StaticObjects | 通過使用<OBJECT>元素定義的、存儲於這個Session對象中的所有變量的一個集合 |
2. Session對象的特性
Session對象提供了四個屬性。這些屬性及說明如下表所示:
表3-7 Session對象的屬性及說明
屬 性 | 說 明 |
CodePage | 讀/寫。整型。定義用於在瀏覽器中顯示頁內容的代碼頁(Code Page)。代碼頁是字符集的數字值,不同的語言和場所可能使用不同的代碼頁。例如,ANSI代碼頁1252用於美國英語和大多數歐洲語言。代碼頁932用於日文字 |
LCID | 讀/寫。整型。定義發送給瀏覽器的頁面地區標識(LCID)。LCID是唯一地標識地區的一個國際標準縮寫,例如,2057定義當前地區的貨幣符號是’£’。LCID也可用於FormatCurrency等語句中,只要其中有一個可選的LCID參數。LCID也可在ASP處理指令<%…%>中設置,並優先於會話的LCID屬性中的設置。本章後面提供一個ASP處理指令的列表 |
SessionID | 只讀。長整型。返回這個會話的會話標識符,創建會話時,該標識符由服務器產生。只在父Application對象的生存期內是唯一的,因此當一個新的應用程序啓動時可重新使用 |
Timeout | 讀/寫。整型。爲這個會話定義以分鐘爲單位的超時週期。如果用戶在超時週期內沒有進行刷新或請求一個網頁,該會話結束。在各網頁中根據需要可以修改。缺省值是10min。在使用率高的站點上該時間應更短 |
3. Session對象的方法
Session對象允許從用戶級的會話空間刪除指定值,並根據需要終止會話。Seesion對象的方法及說明如下表所示:
表Session對象的方法及說明
方 法 | 說 明 |
Contents.Remove(“variable_name”) | 從Session.Content集合中刪除一個名爲variable_name的變量 |
Contents.RemoveAll() | 從Session.Content集合中刪除所有變量 |
Abandon() | 當網頁的執行完成時,結束當前用戶會話並撤消當前Session對象。但即使在調用該方法以後,仍可訪問該頁中的當前會話的變量。當用戶請求下一個頁面時將啓動一個新的會話,並建立一個新的Session對象(如果存在的話) 注意,在運行期間不能從Session.StaticObjects集合中刪除變量。 |
4. Session對象的事件
Session對象提供了在啓動和結束時觸發的兩個事件,如表3-9所示:
表3-9 Session對象的事件及說明
事 件 | 說 明 |
OnStart | 當ASP用戶會話啓動時觸發,在用戶請求的網頁執行之前。用於初始化變量、創建對象或運行其他代碼。 |
OnEnd | 當ASP用戶會話結束時觸發。從用戶對應用程序的最後一個頁面請求開始,如果已經超出預定的會話超時週期則觸發該事件。當會話結束時,取消該會話中的所有變量。在代碼中使用Abandon方法結束ASP用戶會話時,也觸發該事件 |
使用Application和Session的事件
ASP的Application和Session對象體現了其他ASP內置對象所沒有的特徵——事件。然而,正像在前面的對象成員表中看到的那樣,這些都是ASP會話和應用程序的工作相聯繫的事件。
1. Application和Session的事件處理器
每當一個應用程序或會話啓動或結束時,ASP觸發一個事件。可以通過在一個特殊的文件中編寫普通的腳本代碼來檢測和應答這些事件,這個文件名爲global.asa,位於一個應用程序的根目錄中(對於缺省的Web網站是/InetPub/WWWRoot目錄,或是作爲一個實際應用程序定義的一個文件夾)。這個文件可以包含一個或多個HTML的<OBJECT>元素,用於創建將在該應用程序或用戶會話內使用的組件實例。
下面的代碼是global.asa文件的一個例子。我們只關注<OBJECT>元素以及以Set關鍵字開始的那些代碼行:
<!-- 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. ‘as 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> |
因爲這個global.asa文件用於本章中的示例頁面,所以將需要將該文件放到Web網站的根目錄中,或者放到已配置爲一個虛擬應用程序的目錄中,並且在該目錄中包含有其他示例文件。
讀取和存儲值
注意上面的例子怎樣讀取Application和Session的變量,與在Request和Response對象的集合中所採取的方式相同。設置這些變量的值:
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”) |
當然,對於Session對象可採取同樣的方法。
可以看到,當從一個Session事件處理器訪問時,怎樣“鎖定”(Lock)和“解鎖”(unlock)該Application對象;當從一個ASP網頁訪問時,需要進行相同的處理。用Application事件內的代碼訪問Application對象中的值時,不要求這麼做。這是因爲在任何應用程序中只有一個Application對象的實例,並且其事件處理器的代碼只在沒有活動的用戶會話時進行。
也可以看到一個基本的用戶會話計數器是如何實現的。這裏使用一個應用程序級的變量Visit_count,當新的會話啓動時它就自動增加。 一般也不限制簡單地把值保存到Application或Session對象中。例如,Web開發者的Web站點在http://webdev.wrox.co.uk上,有相應的一個global.asa文件,當一個新的會話啓動時該文件就在服務器上的數據庫中寫入相應的條目,數據細節從Request.ServerVariables集合中獲取。這提供了一個基本的方法統計訪問者的數量,並收集訪問者的一些基本信息。