首先.asa是檔案後綴名,它是Active Server Application的縮寫。 Global.asa檔案可以管理在ASP應用程式中兩個非常苛刻的物件:Application、Session。
它其實是一個可選文件,程式編寫者可以在該文件中指定事件腳本,並聲明具有會話和應用程式作用域的物件。該文件的內容不是用來給使用者顯示的,而是用來儲存事件資訊和由應用程式全域使用的物件。該檔案必須存放在應用程式的根目錄內。每個應用程式只能有一個Global.asa檔案。
關於Global.asa檔案最常見的錯誤概念是它能為一般的使用的函數和子程式用作書庫。 Global.asa檔案只能用於建立物件的參考和捕獲啟動,以及結束Application物件和Session物件。
Global.asa檔案主要基於會話級事件被訪問,在以下三種情況下被呼叫:
1,當Application_OnStart或Application_OnEnd事件被觸發。
2,當Session_OnStart或Session_OnEnd事件被觸發。
3,當引用一個在Global.asa檔案裡被實例化的物件(Object)。
Global.asa的標準文件格式如下:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
'Application_OnStart 當任何客戶首次造訪該應用程式的首頁時執行
End Sub
Sub Session_OnStart
'Session_OnStart 當客戶首次執行ASP 應用程式中的任何一個頁面時執行
End Sub
Sub Session_OnEnd
'Session_OnEnd 當一個客戶的會話逾時或退出應用程式時執行
End Sub
Sub Application_OnEnd
'Application_OnEnd 當該網站的WEB 伺服器關閉時執行
End Sub
</SCRIPT>
一、Session_onStart
先看一個控制使用者進入頁面的程式碼:
1,Global.asa(放在被調試的虛擬目錄的根目錄下面)
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Session_OnStart '只要是使用者第一次登入本站,就會跳到首頁
response.redirect(http://www.vevb.com)
End Sub
</SCRIPT>
然後調試當前虛擬目錄下的任何文件,你會發現所有頁面都跳轉向http://www.vevb.com/<
透過此強制進入某頁的例子,可以想像當首頁需要被關注的時候是非常必要的。
以下就以一個線上人數的例子來繼續觀察Session_OnStart和Session_OnEnd事件
二、Session_onEnd
2,Global.asa(放在被調試的虛擬目錄的根目錄下面)
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_onStart '初始值為0
Application(OnLine) = 0
End Sub
Sub Session_onStart '一個使用者訪問進行記數加1
Application.Lock
Application(OnLine) = Application(OnLine) + 1
Application.Unlock
End Sub
Sub Session_OnEnd '一個使用者進程的結束,記數減1 (PS如果沒有該事件程序,則執行的就是頁面訪問程序了。)
Application.Lock
Application(OnLine) = Application(OnLine) - 1
Application.Unlock
End Sub
</SCRIPT>
3,online.asp
<%
if request.querystring(logout)=true then
session.Abandon()
response.end
end if
%>
目前共有<%=Application(OnLine)%>在線
<a href=online.asp?logout=true>退出</a>
你發現在該頁中只有一個Application(OnLine),而且還是被顯示引用的。那麼其值來自何方?這正是Global.asa檔案的關鍵。你可以在本機依序打開個窗口,進行進行關閉窗口或退出兩種方法的調試。
三、繼續細化一下
上面的程式你會發現:當進行退出連線後關閉視窗和直接關閉視窗效果是不一樣的。因為Session存在時間的緣故,當直接進行關閉窗口,並不能觸發Session_OnEnd事件,所以該如何實現這個幾乎不可能的想法呢?
大家都知道,網頁進行關閉的時候可以連帶一個onunload事件,那麼該onunload只要能執行Session的註銷功能不就我們需要的嗎?廢話少說,將online.asp進行修改
3,online.asp
<%
if request.querystring(logout)=true then
session.Abandon()
response.end
end if
%>
<body onunload=javascript:window.open(exit.asp)>
目前共有<%=Application(OnLine)%>在線
<a href=online.asp?logout=true>退出</a>
請注意,online.asp進行onunload的時候會開啟exit.asp,那就只要在exit.asp中再設定session.Abandon()不就OK了。
4,exit.asp
<%session.Abandon()%>
<script>
self.close()
</script>
當然,加了段Script腳本,目的是進行Session的註銷以後立即進行關閉本身。那現在基本一個線上統計的Web應用程式就可以了。
四、深入研究Global.asa
從上面的調試中,舉一反三的你,一定會提出一個問題:如何控制註冊用戶在線人數?那下面幾個文件一個一個看:
5,Global.asa(放在被調試的虛擬目錄的根目錄下面)
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
application(online)=0
End 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
Sub Application_OnEnd
End Sub
</SCRIPT>
注意本Global.asa中的Session_OnStart區塊不做任何事件。
因為一旦有使用者存取伺服器而不管使用者是否登錄,都會產生OnStart事件,而現在需要的只是登入使用者的在線,所以不能在OnStart事件裡使Application(online)加1。
又因為不管是否是登入使用者的會話結束都會產生OnEnd事件(假如有訪客訪問了伺服器但並不登錄,他的會話結束後也會產生OnEnd事件),所以在Session_OnEnd事件裡用了句if語句來判斷是否為已登入使用者的OnEnd事件,如果是才將線上人數減1。
且值得注意的是:session.contents(pass)的使用,因為在OnEnd事件裡禁止使用Session對象,但是可以用Session物件的集合來呼叫session變數。也就是說不能直接寫session(pass),而是需要寫session.contents(pass)。
6,login.asp
<%
if request.querystring(logout)=true then
session.Abandon()
end if
submitname=request.form(submit)
if submitname=submit then
name=request.form(name)
pwd=request.form(pwd)
if name=cnbruce and pwd=cnrose then
session(name)=name
session(pass)=true
else
response.write Error Name Or Pwd.<a href='login.asp'>Back</a>
response.end
end if
application.lock
application(online)=application(online)+1
application.unlock
%>
目前註冊會員<%=application(online)%>人。
<a href=login.asp?logout=true>退出</a>
<%else%>
<form action=login.asp method=post>
<input type=text name=name><br>
<input type=password name=pwd><br>
<input type=submit name=submit value=submit>
<%end if%>
只是簡單地偵測用名是cnbruce,密碼是cnrose的時候,產生一個session(pass)=true,就是放在Global.asa中判斷的。
五,繼續發揮想像
僅僅統計有多少人在線上是不夠的,還要判斷使用者的線上狀態。
可以想像辦法基本,當使用者登入的時候,在login.asp裡將online設為1(如果有資料庫則上傳),但使用者離線時將online設為0,要完善它,就要修改一下Session_OnEnd事件,在該事件裡將online設為0(同樣將為0的值上傳)…