深入研究Application和Session對象(包括global.asa)

來源:互聯網
上載者:User
application|session|對象


用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事件的使用者第一次訪問的頁面又不是屬於根目錄的話,得到資料庫的物理地址將不會是期望的結果,希望大家要特別小心。




相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。