程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> ASP編程 >> ASP基礎知識 >> 深入研究Application和Session對象

深入研究Application和Session對象

編輯:ASP基礎知識

用ASP編寫虛擬社區、網上購物等程序時,Application和Session對象具有舉足輕重的作用,能夠靈活合理地運用這兩個對
象是提高程序質量的關鍵。下面讓筆者根據自己在這方面的經驗,向大家深入介紹一下ASP的這兩個內建對象。

一、Application對象的成員概述

Application對象成員包括Application對象的集合、方法和事件。

⒈Application對象的集合

Contents集合:沒有使用<OBJECT>元素定義的存儲於Applicaiton對象中的所有變量的集合

StaticObjects:使用<OBJECT>元素定義的存儲於Application對象中的所有變量 的集合

例:在default.asp中有如下賦值

application("a")="a"

application("b")=128

application("c")=false

則有contents集合

application.contents(1)="a" '也可寫為application.contents("a")="a"

application.contents(2)=128 '也可寫為application.contents("b")=128

application.contents(3)=false '也可寫為application.contents("c")=false

在此筆者推薦你在調用時使用類如application.contents("a")的方法,因為這樣更為直觀,如果用序號來表示的話則要考慮賦值的先後順序。

⒉Application對象的方法

Contents.Remove("變量名"):從Application.Contents集合中刪除指定的變量

Contents.RemoveAll() :把Application.Contents集合中的所有變量刪除

Lock() :鎖定Application對象,使得只有當前的ASP頁對內容能進行訪問

Unlock() :解除對Application對象的鎖定

例:在default.asp中:

application("a")="a"

application("b")=128

application("c")=false

response.write application.contents(1)&"<br>"

response.write application.contents(2)&"<br>"

response.write application.contents(3)&"<br>"

response.write "After Remove b:"

application.contents.remove("b")

response.write application.contents(1)&"<br>"

response.write application.contents(2)&"<br>"

執行結果:

a

128

False

After Remove b:

a

False

如果要刪除集合中所有變量用application.contents.removeall即可,至於Lock和Unlock方法在實際中經常用到,讀者也比較熟悉,在此就不在累贅。

 

 

⒊Application對象事件

OnStart:第一個訪問服務器的用戶第一次訪問某一頁面時發生

OnEnd :當最後一個用戶的會話已經結束並且該會話的OnEnd事件所有代碼已經執行完畢後發生,或最後一個用戶訪問服務器一段時間(一般為20分鐘)後仍然沒有人訪問該服務器產生。
想要定義application對象的OnStart和OnEnd事件裡做什麼需要將代碼寫在Global.asa這個文件裡(下文有舉例),並且將該文件放在站點的根目錄下(一般是Inetpub\wwwroot\)

二、Session對象的成員概述

Session對象的成員比Application對象多一項屬性,即:集合、屬性、方法、事件

⒈Session對象的集合

Contents :沒有使用<OBJECT>元素定義的存儲於特定Session對象的所有變量的集合。

StaticObject:使用<OBJECT>元素定義的、存儲於Session對象中的所有變量的集合。

例:在default.asp中有如下賦值

session("a")="a"

session("b")=128

session("c")=false

則有contents集合

session.contents(1)="a" '也可寫為session.contents("a")="a"

session.contents(2)=128 '也可寫為session.contents("b")=128

session.contents(3)=false '也可寫為session.contents("c")=false

⒉Session對象的屬性

CodePage: 可讀/可寫。整型。定義用於在浏覽器中顯示頁內容的代碼頁。代碼頁是字符集的數字值,不同的語言使用不同的代碼頁。例如,ANSI代碼頁為1252,日文代碼頁為932,簡體中文代碼頁為936。

LCID : 可讀/可寫。整型。定義發送給浏覽器的頁面地區標識。LCID是唯一地標識地區的一個國際標准縮寫,例如,2057定義當前地區的貨幣符號是"£"。

SessionID: 只讀。長整型。返回本會話的會話標識符。每創建一個會話,由服務器自動分配一個標識符。可以根據它的值判斷兩個用戶是誰先訪問服務器。

Timeout : 可讀/可寫。整型。為會話定義以分鐘為單位的超時限定。如果用戶在這個時間內沒有刷新或請求任何一個網頁,則該用戶產生的會話自動結束。缺省值是20。

以上屬性在實際應用中作用不大,而且基本上不需要怎麼修改,這幾個屬性也沒什麼特殊的地方。

⒊Session對象的方法

Contents.Remove("變量名"): 從Session.contents集合中刪除指定的變量

Contents.Removeall() : 刪除Session.contents集合中的所有變量

Abandon() : 結束當前用戶會話並且撤消當前Session對象。

Session對象的Contents.Remove("變量名")和Contents.Removeall()方法與Application對象的基本上沒什麼區別,為幫助理解,大家可以參照上面的例子將Application改為Session。這裡要說明一下的是Contents.Removeall()和Abandon()的區別,執行這兩個方法都會釋放當前

用戶會話的所有Session變量,不同的是Contents.Removeall()單純地釋放Session變量的值而不終止當前的會話,而Abandon()除了釋放Session變量外還會終止會話引發Session_OnEnd事件,希望大家注意兩者的區別。

⒋Session對象的事件

OnStart: 當ASP用戶會話產生時觸發,一旦有任一用戶對本服務器請求任一頁面即產生該事件。

OnEnd : 當ASP用戶會話結束時觸發,當使用Abandon()方法或超時也會觸發該事件。

這兩個事件和Application的OnStart、OnEnd事件一樣,也是必須放在Global.asa文件裡,下面就重點和大家研究一下這四個事件的使用。


三、Global.asa

ASP的Application和Session對象體現了其他ASP內置對象所沒有的特征--事件。每一個訪客訪問服務器時都會觸發一個OnStart事件(第一個訪客會同時觸發Application和Session的OnStart事件,但Application先於Session),每個訪客的會話結束時都會觸發一個OnEnd事件(最後一個訪客會話結束時會同時觸發Application和Session的OnEnd事件,但Session先於Application)。

OnStart和OnEnd這兩個事件一般應用在虛擬社區中統計在線人數、修改用戶的在線離線狀態等。要具體定義這兩個事件,需要將代碼寫在Global.asa文件,並將該文件放在站點的根目錄下(缺省是\Inetpub\wwwroot\)。另外,Application和Session對象規定了在OnEnd事件裡除了Application對象外其他ASP內置對象(Response、Request、Server、Session...)一概不能使用。以下舉一個虛擬社區統計在線人數的例子來說明如何使用這兩個事件。

文件說明:

global.asa 位於d:\Inetpub\wwwroot\目錄下

default.asp 位於d:\Inetpub\wwwroot\目錄下,虛擬社區登錄頁面

login.asp 位於d:\Inetpub\wwwroot\目錄下,用於檢測用戶輸入的用戶名及密碼

index.asp 位於d:\Inetpub\wwwroot\目錄下,虛擬社區首頁

bbs.mdb 位於d:\Inetpub\wwwroot\目錄下,存儲用戶信息的數據庫

數據庫(ACCESS)結構:

===bbs表===

id 用戶ID,長整型

name 用戶名,文本型

code 密碼,文本型

online 在線狀態,是/否

 

 


===global.asa===

<script LANGUAGE="VBScript" RUNAT="Server">

Sub Application_OnStart

application("online")=0

End Sub

sub Application_OnEnd

nd Sub

Sub Session_OnStart

End Sub

Sub Session_OnEnd

if session.contents("pass") then '判斷是否為登錄用戶的Session_OnEnd

application.lock

application("online")=application("online")-1

application.unlock

end if

End Sub

</script>

==============

===login.asp===

......'密碼驗證,連接數據庫,檢測用戶輸入的用戶名及密碼是否正確

if 密碼驗證通過 then

session("name")=rs("name")

session("id")=rs("id")

session("pass")=true

else

rs.close

conn.close

response.write "密碼錯誤!"

response.end

end if

application.lock

application("online")=application("online")+1

conn.Execute ("update bbs set online=1 where id="&session("id"))'將用戶的狀態設為在線

application.unlock

rs.close

conn.close

response.redirect "index.asp" '初始化數據後跳轉到社區首頁

===========

在本例中,用application("online")變量記錄已經登錄社區的在線人數,因為一旦有用戶訪問服務器而不管用戶是否登錄,都會產生OnStart事件,所以不能在OnStart事件裡使Applicaiton("online")加一。因為不管是否是登錄用戶的會話結束都會產生OnEnd事件(假如有訪客訪問了服務器但並不登錄社區,他的會話結束後也會產生OnEnd事件),所以在Session_OnEnd事件裡用了句if語句來判斷是否為已登錄用戶的OnEnd事件,如果是才將在線人數減一。

這只是一個統計在線人數的簡單例子,對於一個完整的虛擬社區來說,僅僅統計有多少人在線是不夠的,在本例中數據庫裡有個online字段是用來記錄用戶的在線狀態,用戶登錄的時候,在login.asp裡將online設為1,但用戶離線時並沒有將online設為0,要完善它,就要修改一下Session_OnEnd事件,在該事件裡將online設為0。

===global.sas===

<script LANGUAGE="VBScript" RUNAT="Server">

Sub Application_OnStart

application("online")=0

set application("conn")=Server.CreateObject("ADODB.Connection")

application("db")=Server.MapPath("\bbs.mdb") '此處最好使用絕對路徑\bbs.mdb,下文有詳細介紹

End Sub

sub Application_OnEnd

set application("conn")=nothing

End Sub

Sub Session_OnStart

End Sub

Sub Session_OnEnd

if session.contents("pass") then '判斷是否為登錄用戶的Session_OnEnd

application("con").open ="driver={Microsoft Access Driver (*.mdb)};dbq="&application("db")

application.lock

application("online")=application("online")-1

application("con").Execute ("update friends set online=0 where id="&session.contents("id"))

application.unlock

application("con").close

end if

End Sub

</script>

==============
 

 


至此,完整的代碼已經完成了。因為在Application和Session的OnEnd事件裡不能使用Server對象,所以要將數據庫的連接及數據庫在服務器上的物理地址(d:\inetpub\wwwroot\bbs.mdb)存儲在application變量中,並在
Application_OnStart事件中預先處理。同理,在Session_OnEnd事件中不能用session("pass")來代替session.contents
("pass")(以下有詳盡說明)。

四、本文實例中值得引起注意的兩點

⒈OnEnd事件裡的session.contents

剛開始接觸global.asa的朋友經常會將上面Session_OnEnd事件裡的

if session.contents("pass") then 寫成

if session("pass") then,

這樣的話系統不會提示錯誤,但是永遠也不會執行then後面的內容,這是因為在OnEnd事件裡禁止使用Session對象,但是可以用Session對象的集合來調用session變量。因為IIS並沒提示任何錯誤信息,所以筆者曾經在這上面浪費了很多時間。在此希望大家引以為鑒!

⒉Application_OnStart事件裡用Server.MapPath獲取數據庫的物理地址時應使用絕對地址為了說明這個問題,大家可以做個實驗:將上面Application_OnStart事件裡的

application("db")=Server.MapPath("\bbs.mdb")改為:

application("db")=Server.MapPath("bbs.mdb")

然後在d:\inetpub\wwwroot\目錄下建立一個test子目錄,寫一個temp.asp在test目錄裡。

====test.asp====

<%response.write application("db")%>

================

再將temp.asp拷貝一份放在根目錄下(d:\inetpub\wwwroot\)。用記事本打開global.asa,再打開兩個浏覽器,浏覽器A輸入地址http://localhost/temp.asp,按回車,將在浏覽器上輸出:

d:\inetpub\wwwroot\bbs.mdb

然後,在記事本的窗口上點"文件"菜單,選"保存"(使global.asa的修改時間改變,從而使IIS重啟動所有服務),再在浏覽器B輸入地址http://localhost/test/temp.asp,按回車,在浏覽器上輸出的是:

d:\inetpub\wwwroot\test\bbs.mdb

global.asa文件雖然是放在站點根目錄下,但是如果在server.mappath中使用的是相對地址,而觸發Application_OnStart事件的用戶第一次訪問的頁面又不是屬於根目錄的話,得到數據庫的物理地址將不會是期望的結果,希望大家要特別小心。

()

*
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved