明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

ASP知識(shí)講座3

[摘要]Application對(duì)象與Session對(duì)象 上一講中,我們學(xué)習(xí)了Request對(duì)象的Form數(shù)據(jù)集合、QueryString數(shù)據(jù)集合和ServerVariables數(shù)據(jù)集合。在繼續(xù)下面的學(xué)習(xí)之前...

Application對(duì)象與Session對(duì)象 

上一講中,我們學(xué)習(xí)了Request對(duì)象的Form數(shù)據(jù)集合、QueryString數(shù)據(jù)集合和ServerVariables數(shù)據(jù)集合。在繼續(xù)下面的學(xué)習(xí)之前,建議你先輕松一下,因?yàn)榻酉聛硪榻B的Application對(duì)象相對(duì)比較抽象,剛開始理解起來恐怕會(huì)不辨東西。切記:當(dāng)你找不到北時(shí),便不要過多考慮Application對(duì)象到底是什么東西?還是一句老話,先學(xué)會(huì)使用它。

一、了解Application對(duì)象。為了提神我們先看一個(gè)計(jì)數(shù)器的例程(你應(yīng)該運(yùn)行它以便于理解)
先編輯一個(gè)wuf16.htm文件:
<html>
<body>
記錄某個(gè)頁面的點(diǎn)擊數(shù)示例:<a href="wuf17.asp">wuf17.asp</a> 
</body>
</html>
wuf17.asp的代碼如下:
<% @ LANGUAGE = VBScript %>
<% 'wuf17.asp - 記錄某一頁面的訪問數(shù)(計(jì)數(shù)器原理)
Option Explicit
Dim CountWeb
CountWeb = Request.ServerVariables("SCRIPT_NAME")
'這樣保證每個(gè)頁面都有一個(gè)唯一的變量, 避免混亂
%>
<HTML><BODY>
<%
Response.Write CountWeb & "<Br><Br>" & vbcrlf
Application.Lock '請(qǐng)看講解
Application(CountWeb) = Application(CountWeb) + 1 '累加器,點(diǎn)擊數(shù)加1
Application.UnLock
Response.Write "WEB服務(wù)器關(guān)閉重啟前該頁的點(diǎn)擊總數(shù)為: " & Application(CountWeb) 
%>
</BODY></HTML>
運(yùn)行這個(gè)程序時(shí),對(duì)大部分的人來說,只有一臺(tái)機(jī)器,既是Web服務(wù)器,又是客戶端。那么你只能想象這樣一種境況了:你的這兩個(gè)主頁文件放在很遠(yuǎn)的Web服務(wù)器上,而如潮水般的國內(nèi)外用戶正通過瀏覽器訪問它們。每個(gè)用戶點(diǎn)擊一次,Application(CountWeb) 的值就加1,而且只要存放文件wuf17.asp的服務(wù)器沒有關(guān)閉,Application(CountWeb)就將一直累加下去。但是注意,如果服務(wù)器關(guān)閉后重啟,則Application(CountWeb)將重新從0開始計(jì)數(shù)(我暈,我說我的頁面訪問數(shù)怎么老是一位數(shù))。為了避免這種永遠(yuǎn)從零開始的計(jì)數(shù)情況,你必須要在服務(wù)器關(guān)閉之前將Application(CountWeb)的值保存起來,下次需要時(shí)再取出來,就能夠順序累計(jì)下去了,具體如何做,且聽N回后分解。
接下來的問題,就是Application.Lock、UnLock是什么意思?剛才我們做了一個(gè)假設(shè),大量的用戶正在訪問該頁面,而每一個(gè)用戶的點(diǎn)擊都會(huì)發(fā)生Application(CountWeb)加1,想想看,這樣不就亂套了(什么!想不出,那肯定是你的主頁終日只有你一個(gè)人贊助),所以得有個(gè)先來后到的規(guī)則。當(dāng)某一用戶訪問該頁面,需要修改Application(CountWeb)的值時(shí),使用Lock方法加鎖,避免其他用戶修改,修改完后,再解鎖。 
從上例中您是否已看出,Application對(duì)象提供給所有用戶共享信息(Application(CountWeb)),它所面向的是所有用戶(每個(gè)用戶的訪問都會(huì)導(dǎo)致計(jì)數(shù)器加1)。Application對(duì)象還有兩個(gè)事件,Application_OnStart事件和Application_OnEnd事件(您可千萬別暈,這只是面向?qū)ο缶幊陶Z言中起步的概念),使用時(shí)語法如下:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnEnd
'當(dāng)WEB服務(wù)器關(guān)閉時(shí),將激活A(yù)pplication_OnEnd事件
'也就是程序?qū)?zhí)行放在這里的代碼
'因此服務(wù)器關(guān)閉前我們可以在這里將wuf17.asp中Application(CountWeb)的值
'保存起來,如放在一個(gè)文本文件中。
End Sub

Sub Application_OnStart
'當(dāng)?shù)谝粋(gè)用戶瀏覽ASP網(wǎng)頁時(shí),將激活A(yù)pplication_OnStart事件,而以后其他用戶瀏覽時(shí),就不發(fā)生這一事件了
'也就是程序?qū)?zhí)行放在這里的代碼
'因此可在這里讀出保存在文本文件中Application(CountWeb)的值。
End Sub
</SCRIPT>
下面通過一個(gè)實(shí)例來說明如何使用事件,該程序的作用是統(tǒng)計(jì)站點(diǎn)所有頁面的總點(diǎn)擊數(shù)。
文件wuf18.asp的代碼(站點(diǎn)內(nèi)其他頁面文件與這個(gè)文件類似):
<% @ LANGUAGE = VBScript %>
<% Option Explicit
'站內(nèi)所有頁面文件都應(yīng)包括這句<!--#include file="wuf19.asp"-->%>
<!--#include file="wuf19.asp"-->
<HTML><BODY>
在服務(wù)器關(guān)閉重啟之前站點(diǎn)所有頁面總點(diǎn)擊數(shù): <%= Application("CountAll") %>
</BODY></HTML>
文件wuf19.asp的代碼:
<% ' wuf19.asp
Application.Lock
Application("CountAll") = Application("CountAll") + 1
Application.UnLock
%>
文件wuf18.asp與wuf19.asp放在同一目錄下。文件global.asa的代碼:
注意:事件處理程序必須以名為"global.asa"的文本文件存盤,而且必須放在虛擬路徑的根目錄下(一般就是與index.htm或default.htm文件放在同一目錄下,例如:以我的機(jī)器為例,就絕對(duì)路徑而言,global.asa放在c:\InetPub\home下,而wuf18.asp和wuf19.asp放在c:\InetPub\home\asp下),同一虛擬路徑只允許有一個(gè)global.asa文件存在。
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
'global.asa - wuf18.asp 在下載包中的文件名為18global.asa,使用時(shí)要改名。
Sub Application_OnStart
'當(dāng)?shù)谝粋(gè)用戶瀏覽網(wǎng)頁時(shí),置計(jì)數(shù)器初值為0,
'而以后其他用戶瀏覽時(shí),不再執(zhí)行以下代碼
Application.Lock
Application("CountAll") = 0
Application.UnLock
End Sub
</SCRIPT>
瀏覽wuf18.asp查看運(yùn)行結(jié)果?磥,僅僅學(xué)會(huì)使用Application對(duì)象并不難。

二、認(rèn)識(shí)Session對(duì)象。有了前面的Application對(duì)象做鋪墊,Session對(duì)象就容易多了。它與Application對(duì)象類似,只不過是僅僅用來記錄單個(gè)用戶的相關(guān)信息,它面向單個(gè)用戶,因此我們可以使用Session對(duì)象存儲(chǔ)某單個(gè)用戶的信息。
與Application對(duì)象一樣,Session對(duì)象也有兩個(gè)事件:Session_OnStart事件和Session_OnEnd事件。使用語法與Application對(duì)象類似。
值得一提的是,使用Session對(duì)象前,必須確認(rèn)瀏覽器的Cookie功能已啟用(默認(rèn)設(shè)置就可以了)。
下面舉一個(gè)實(shí)例,文件global.asa的要求同上,因此上例中的global.asa將被本例中的global.asa覆蓋。
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
' global.asa - wuf20.asp 在下載包中文件名為20global.asa
Sub Session_OnStart
Session("In") = Now '函數(shù)Now取得當(dāng)前時(shí)間
End Sub

Sub Session_OnEnd
Session("Out") = Now
Application.Lock
Application("Out") = Session("Out")
Application("In") = Session("In")
Application("Out").UnLock
End Sub
</SCRIPT>
文件wuf20.asp:
<%@ Language=VBScript %>
<HTML>
<BODY>
<% 'wuf20.asp
Response.Write "默認(rèn)Timeout設(shè)置:" & Session.Timeout & "分鐘<Br>"
Session.Timeout = 1
Response.Write "您進(jìn)入本站的時(shí)間:" & Session("In") & "<Br>"
Response.Write "請(qǐng)?jiān)?nbsp;1 分鐘后刷新本頁" & "<Br><Br>"

if Not IsEmpty(Application("Out")) then
Response.Write "您上次進(jìn)入本站的時(shí)間:" & Application("In") & "<Br>"
Response.Write "您上次離開本站的時(shí)間:" & Application("Out") & "<Br>"
Response.Write "瀏覽時(shí)間(分鐘):" &_
Datediff("n",Application("In"),Application("Out")) & "<Br><Br>"
End If

if IsEmpty(Session("Out")) then
Response.Write "刷新前和刷新后Session(""Out"")的值都為空" & "<Br>"
End If
%>
</BODY>
</HTML>
當(dāng)用戶第一次瀏覽網(wǎng)頁時(shí),發(fā)生Session_OnStart事件,程序記錄用戶本次進(jìn)入網(wǎng)頁的時(shí)間,而此時(shí)不會(huì)發(fā)生Session_OnEnd事件,故Application("Out")值為空,程序不會(huì)顯示瀏覽時(shí)間。
我們知道,Application對(duì)象的生存期為第一個(gè)用戶瀏覽網(wǎng)頁直至服務(wù)器關(guān)閉。而Session對(duì)象的生存期為用戶第一次瀏覽網(wǎng)頁(會(huì)話開始)直至?xí)捊Y(jié)束。那什么時(shí)候會(huì)話結(jié)束呢?具體到本例中,Session.Timeout = 1設(shè)置會(huì)話超時(shí)為1分鐘,即如果長達(dá)1分鐘沒有向Web服務(wù)器提供請(qǐng)求,則會(huì)話超時(shí),導(dǎo)致會(huì)話結(jié)束,發(fā)生Session_OnEnd事件,程序執(zhí)行Session_OnEnd內(nèi)的代碼。在這里我們將進(jìn)入和離開時(shí)間分別放入Application("In")和Application("Out"),因?yàn)闀?huì)話結(jié)束后,Session對(duì)象將不復(fù)存在,這點(diǎn)我們?cè)诖a的最后做了驗(yàn)證。
從這個(gè)例程,可以看出:
1. Application對(duì)象和Session對(duì)象的生存期不同。
2. Session對(duì)象是針對(duì)單個(gè)用戶的,它的值存放在客戶端,其他用戶的瀏覽對(duì)該單用戶的Session對(duì)象沒有任何影響。單個(gè)用戶只能讀寫自己Session對(duì)象的值(如:Session("In"))。
3. 注意在Response.Write中顯示雙引號(hào)的表示方法:(""Out"")。
4. 特別提醒:該程序沒有實(shí)用性,僅供調(diào)試用(僅適用于只有一個(gè)用戶瀏覽的情況),請(qǐng)思考這是為什么?答案見本文末。
提示:請(qǐng)注意Application對(duì)象的特性。

三、一個(gè)經(jīng)典的實(shí)例:如何在網(wǎng)頁上顯示在線人數(shù)
在下面的例子中,用Application("Online")來存放在線人數(shù),用Application("CountAll")存放總訪問人數(shù)。
原理:當(dāng)一個(gè)新用戶瀏覽網(wǎng)頁時(shí),發(fā)生Session_OnStart事件,在線人數(shù)加1,訪問用戶數(shù)也加1。當(dāng)某用戶離開時(shí),會(huì)話超時(shí)后會(huì)發(fā)生Session_OnEnd事件,在線人數(shù)減1。
Global.asa代碼如下:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
' Global.asa - wuf21.asp
Sub Application_OnStart
Application.Lock
'在這里讀出Application("CountAll")的初始值
Application.UnLock
End Sub

Sub Session_OnStart
Application.Lock
Application("Online") = Application("Online") + 1
Application("CountAll") = Application("CountAll") + 1
Application.UnLock
End Sub

Sub Session_OnEnd
Application.Lock
Application("Online") = Application("Online") - 1
Application.UnLock
End Sub

Sub Application_OnEnd
Application.Lock
'應(yīng)該在這里將Application("CountAll")保存到文件中
Application.UnLock
End Sub
</SCRIPT>
Wuf21.asp代碼如下:
<%@ Language=VBScript %>
<HTML>
<BODY>
<%Session.Timeout = 5%>
<P>在線人數(shù): <%= Application("Online")%></P>
<P>訪問總?cè)藬?shù): <%= Application("CountAll")%></P>
</BODY>
</HTML>
請(qǐng)注意將本例程與wuf17.asp對(duì)比,后者是計(jì)算點(diǎn)擊數(shù),而前者是計(jì)算訪問人數(shù)。

答案:由于Applicaton對(duì)象適用于所有用戶,所以在多用戶的情況下,其他用戶的瀏覽也會(huì)改變Application("In")和Application("Out")的值。



標(biāo)簽:ASP知識(shí)講座3