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

深入研究Application與Session對(duì)象(3)

[摘要]三、Global.asa  ASP的Application和Session對(duì)象體現(xiàn)了其他ASP內(nèi)置對(duì)象所沒有的特征--事件。每一個(gè)訪客訪問服務(wù)器時(shí)都會(huì)觸發(fā)一個(gè)OnStart事件(第一個(gè)訪客會(huì)同時(shí)觸發(fā)...
三、Global.asa

  ASP的Application和Session對(duì)象體現(xiàn)了其他ASP內(nèi)置對(duì)象所沒有的特征--事件。每一個(gè)訪客訪問服務(wù)器時(shí)都會(huì)觸發(fā)一個(gè)OnStart事件(第一個(gè)訪客會(huì)同時(shí)觸發(fā)Application和Session的OnStart事件,但Application先于Session),每個(gè)訪客的會(huì)話結(jié)束時(shí)都會(huì)觸發(fā)一個(gè)OnEnd事件(最后一個(gè)訪客會(huì)話結(jié)束時(shí)會(huì)同時(shí)觸發(fā)Application和Session的OnEnd事件,但Session先于Application)。

  OnStart和OnEnd這兩個(gè)事件一般應(yīng)用在虛擬社區(qū)中統(tǒng)計(jì)在線人數(shù)、修改用戶的在線離線狀態(tài)等。要具體定義這兩個(gè)事件,需要將代碼寫在Global.asa文件,并將該文件放在站點(diǎn)的根目錄下(缺省是\Inetpub\wwwroot\)。另外,Application和Session對(duì)象規(guī)定了在OnEnd事件里除了Application對(duì)象外其他ASP內(nèi)置對(duì)象(Response、Request、Server、Session...)一概不能使用。以下舉一個(gè)虛擬社區(qū)統(tǒng)計(jì)在線人數(shù)的例子來說明如何使用這兩個(gè)事件。

  文件說明:

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

  default.asp 位于d:\Inetpub\wwwroot\目錄下,虛擬社區(qū)登錄頁面

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

  index.asp 位于d:\Inetpub\wwwroot\目錄下,虛擬社區(qū)首頁

  bbs.mdb 位于d:\Inetpub\wwwroot\目錄下,存儲(chǔ)用戶信息的數(shù)據(jù)庫

  數(shù)據(jù)庫(ACCESS)結(jié)構(gòu):

   ===bbs表===

  id 用戶ID,長整型

  name 用戶名,文本型

  code 密碼,文本型

  online 在線狀態(tài),是/否

 
  ===global.asa===

 。約cript 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===

   ......'密碼驗(yàn)證,連接數(shù)據(jù)庫,檢測用戶輸入的用戶名及密碼是否正確

  if 密碼驗(yàn)證通過 then

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

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

   session("pass")=true

  else

   rs.close

   conn.close

   response.write "密碼錯(cuò)誤!"

   response.end

  end if

  application.lock

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

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

  application.unlock

  rs.close

  conn.close

  response.redirect "index.asp" '初始化數(shù)據(jù)后跳轉(zhuǎn)到社區(qū)首頁

  ===========

  在本例中,用application("online")變量記錄已經(jīng)登錄社區(qū)的在線人數(shù),因?yàn)橐坏┯杏脩粼L問服務(wù)器而不管用戶是否登錄,都會(huì)產(chǎn)生OnStart事件,所以不能在OnStart事件里使Applicaiton("online")加一。因?yàn)椴还苁欠袷堑卿浻脩舻臅?huì)話結(jié)束都會(huì)產(chǎn)生OnEnd事件(假如有訪客訪問了服務(wù)器但并不登錄社區(qū),他的會(huì)話結(jié)束后也會(huì)產(chǎn)生OnEnd事件),所以在Session_OnEnd事件里用了句if語句來判斷是否為已登錄用戶的OnEnd事件,如果是才將在線人數(shù)減一。

  這只是一個(gè)統(tǒng)計(jì)在線人數(shù)的簡單例子,對(duì)于一個(gè)完整的虛擬社區(qū)來說,僅僅統(tǒng)計(jì)有多少人在線是不夠的,在本例中數(shù)據(jù)庫里有個(gè)online字段是用來記錄用戶的在線狀態(tài),用戶登錄的時(shí)候,在login.asp里將online設(shè)為1,但用戶離線時(shí)并沒有將online設(shè)為0,要完善它,就要修改一下Session_OnEnd事件,在該事件里將online設(shè)為0。

  ===global.sas===

 。約cript LANGUAGE="VBScript" RUNAT="Server">

  Sub Application_OnStart

   application("online")=0

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

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

  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>

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

  至此,完整的代碼已經(jīng)完成了。因?yàn)樵贏pplication和Session的OnEnd事件里不能使用Server對(duì)象,所以要將數(shù)據(jù)庫的連接及數(shù)據(jù)庫在服務(wù)器上的物理地址(d:\inetpub\wwwroot\bbs.mdb)存儲(chǔ)在application變量中,并在Application_OnStart事件中預(yù)先處理。同理,在Session_OnEnd事件中不能用session("pass")來代替session.contents("pass")(以下有詳盡說明)。

  四、本文實(shí)例中值得引起注意的兩點(diǎn)

  ⒈O(jiān)nEnd事件里的session.contents

  剛開始接觸global.asa的朋友經(jīng)常會(huì)將上面Session_OnEnd事件里的

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

  if session("pass") then,

  這樣的話系統(tǒng)不會(huì)提示錯(cuò)誤,但是永遠(yuǎn)也不會(huì)執(zhí)行then后面的內(nèi)容,這是因?yàn)樵贠nEnd事件里禁止使用Session對(duì)象,但是可以用Session對(duì)象的集合來調(diào)用session變量。因?yàn)镮IS并沒提示任何錯(cuò)誤信息,所以筆者曾經(jīng)在這上面浪費(fèi)了很多時(shí)間。在此希望大家引以為鑒!

  ⒉Application_OnStart事件里用Server.MapPath獲取數(shù)據(jù)庫的物理地址時(shí)應(yīng)使用絕對(duì)地址為了說明這個(gè)問題,大家可以做個(gè)實(shí)驗(yàn):將上面Application_OnStart事件里的

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

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

然后在d:\inetpub\wwwroot\目錄下建立一個(gè)test子目錄,寫一個(gè)temp.asp在test目錄里。

  ====test.asp====

 。迹esponse.write application("db")%>

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

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

  d:\inetpub\wwwroot\bbs.mdb

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

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

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