熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP講座之三:Application對象與Session對象

2013-11-13 10:23:41  來源: .NET編程 

  了解Application對象
  
  為了提神我們先看一個計數器的例程(你應該運行它以便於理解)
  先編輯一個文件
  <html>
  <body>
  記錄某個頁面的點擊數示例<a >wufasp</a>
  </body>
  </html>
  wufasp的代碼如下
  <% @ LANGUAGE = VBScript %>
  <% wufasp 記錄某一頁面的訪問數(計數器原理)
  Option Explicit
  Dim CountWeb
  CountWeb = RequestServerVariables(SCRIPT_NAME)
  這樣保證每個頁面都有一個唯一的變量 避免混亂
  %>
  <HTML><BODY>
  <%
  ResponseWrite CountWeb & <Br><Br> & vbcrlf
  ApplicationLock  請看講解
  Application(CountWeb) = Application(CountWeb) +   累加器點擊數加
  ApplicationUnLock
  ResponseWrite WEB服務器關閉重啟前該頁的點擊總數為: & Application(CountWeb)
  %>
  </BODY></HTML>
  運行這個程序時對大部分的人來說只有一台機器既是Web服務器又是客戶端那麼你只能想象這樣一種境況了你的這兩個主頁文件放在很遠的Web服務器上而如潮水般的國內外用戶正通過浏覽器訪問它們每個用戶點擊一次Application(CountWeb) 的值就加而且只要存放文件wufasp的服務器沒有關閉Application(CountWeb)就將一直累加下去但是注意如果服務器關閉後重啟則Application(CountWeb)將重新從開始計數(我暈我說我的頁面訪問數怎麼老是一位數)為了避免這種永遠從零開始的計數情況你必須要在服務器關閉之前將Application(CountWeb)的值保存起來下次需要時再取出來就能夠順序累計下去了具體如何做且聽N回後分解
  接下來的問題就是ApplicationLockUnLock是什麼意思?剛才我們做了一個假設大量的用戶正在訪問該頁面而每一個用戶的點擊都會發生Application(CountWeb)加想想看這樣不就亂套了(什麼!想不出那肯定是你的主頁終日只有你一個人贊助)所以得有個先來後到的規則當某一用戶訪問該頁面需要修改Application(CountWeb)的值時使用Lock方法加鎖避免其他用戶修改修改完後再解鎖
  從上例中您是否已看出Application對象提供給所有用戶共享信息(Application(CountWeb))它所面向的是所有用戶(每個用戶的訪問都會導致計數器加Application對象還有兩個事件Application_OnStart事件和Application_OnEnd事件(您可千萬別暈這只是面向對象編程語言中起步的概念)使用時語法如下
  <SCRIPT LANGUAGE=VBScript RUNAT=Server>
  Sub Application_OnEnd
  當WEB服務器關閉時將激活Application_OnEnd事件
  也就是程序將執行放在這裡的代碼
  因此服務器關閉前我們可以在這裡將wufasp中Application(CountWeb)的值
  保存起來如放在一個文本文件中
  End Sub
  
  Sub Application_OnStart
  當第一個用戶浏覽ASP網頁時將激活Application_OnStart事件而以後其他用戶浏覽時就不發生這一事件了
  也就是程序將執行放在這裡的代碼
  因此可在這裡讀出保存在文本文件中Application(CountWeb)的值
  End Sub
  </SCRIPT>
  下面通過一個實例來說明如何使用事件該程序的作用是統計站點所有頁面的總點擊數
  文件wufasp的代碼(站點內其他頁面文件與這個文件類似)
  <% @ LANGUAGE = VBScript %>
  <% Option Explicit
  站內所有頁面文件都應包括這句<!#include file=wufasp>%>
  <!#include file=wufasp>
  <HTML><BODY>
  在服務器關閉重啟之前站點所有頁面總點擊數: <%= Application(CountAll) %>
  </BODY></HTML>
  文件wufasp的代碼
  <% wufasp
  ApplicationLock
  Application(CountAll) = Application(CountAll) +
  ApplicationUnLock
  %>
  文件wufasp與wufasp放在同一目錄下文件globalasa的代碼
  注意事件處理程序必須以名為globalasa的文本文件存盤而且必須放在虛擬路徑的根目錄下(一般就是與或文件放在同一目錄下例如以我的機器為例就絕對路徑而言globalasa放在c:\InetPub\home下而wufasp和wufasp放在c:\InetPub\home\asp下)同一虛擬路徑只允許有一個globalasa文件存在
  <SCRIPT LANGUAGE=VBScript RUNAT=Server>
  globalasa wufasp 在下載包中的文件名為globalasa使用時要改名
  Sub Application_OnStart
  當第一個用戶浏覽網頁時置計數器初值為
  而以後其他用戶浏覽時不再執行以下代碼
  ApplicationLock
  Application(CountAll) =
  ApplicationUnLock
  End Sub
  </SCRIPT>
  浏覽wufasp查看運行結果看來僅僅學會使用Application對象並不難
  
  認識Session對象
  
  有了前面的Application對象做鋪墊Session對象就容易多了它與Application對象類似只不過是僅僅用來記錄單個用戶的相關信息它面向單個用戶因此我們可以使用Session對象存儲某單個用戶的信息
  與Application對象一樣Session對象也有兩個事件Session_OnStart事件和Session_OnEnd事件使用語法與Application對象類似
  值得一提的是使用Session對象前必須確認浏覽器的Cookie功能已啟用(默認設置就可以了)
  下面舉一個實例文件globalasa的要求同上因此上例中的globalasa將被本例中的globalasa覆蓋
  <SCRIPT LANGUAGE=VBScript RUNAT=Server>
   globalasa wufasp 在下載包中文件名為globalasa
  Sub Session_OnStart
  Session(In) = Now  函數Now取得當前時間
  End Sub
  
  Sub Session_OnEnd
  Session(Out) = Now
  ApplicationLock
  Application(Out) = Session(Out)
  Application(In) = Session(In)
  Application(Out)UnLock
  End Sub
  </SCRIPT>
  文件wufasp
  <%@ Language=VBScript %>
  <HTML>
  <BODY>
  <% wufasp
  ResponseWrite 默認Timeout設置: & SessionTimeout & 分鐘<Br>
  SessionTimeout =
  ResponseWrite 您進入本站的時間: & Session(In) & <Br>
  ResponseWrite 請在 分鐘後刷新本頁 & <Br><Br>
  
  if Not IsEmpty(Application(Out)) then
  ResponseWrite 您上次進入本站的時間: & Application(In) & <Br>
  ResponseWrite 您上次離開本站的時間: & Application(Out) & <Br>
  ResponseWrite 浏覽時間(分鐘): &_
  Datediff(nApplication(In)Application(Out)) & <Br><Br>
  End If
  
  if IsEmpty(Session(Out)) then
  ResponseWrite 刷新前和刷新後Session(Out)的值都為空 & <Br>
  End If
  %>
  </BODY>
  </HTML>
  當用戶第一次浏覽網頁時發生Session_OnStart事件程序記錄用戶本次進入網頁的時間而此時不會發生Session_OnEnd事件故Application(Out)值為空程序不會顯示浏覽時間
  我們知道Application對象的生存期為第一個用戶浏覽網頁直至服務器關閉而Session對象的生存期為用戶第一次浏覽網頁(會話開始)直至會話結束那什麼時候會話結束呢?具體到本例中SessionTimeout = 設置會話超時為分鐘即如果長達分鐘沒有向Web服務器提供請求則會話超時導致會話結束發生Session_OnEnd事件程序執行Session_OnEnd內的代碼在這裡我們將進入和離開時間分別放入Application(In)和Application(Out)因為會話結束後Session對象將不復存在這點我們在代碼的最後做了驗證
  從這個例程可以看出
  . Application對象和Session對象的生存期不同
  . Session對象是針對單個用戶的它的值存放在客戶端其他用戶的浏覽對該單用戶的Session對象沒有任何影響單個用戶只能讀寫自己Session對象的值(如Session(In))
  . 注意在ResponseWrite中顯示雙引號的表示方法(Out)
  . 特別提醒該程序沒有實用性僅供調試用(僅適用於只有一個用戶浏覽的情況)請思考這是為什麼?答案見本文末
  提示請注意Application對象的特性
  
  一個經典的實例如何在網頁上顯示在線人數
  
  在下面的例子中用Application(Online)來存放在線人數用Application(CountAll)存放總訪問人數
  
  原理當一個新用戶浏覽網頁時發生Session_OnStart事件在線人數加訪問用戶數也加當某用戶離開時會話超時後會發生Session_OnEnd事件在線人數減
  Globalasa代碼如下
  <SCRIPT LANGUAGE=VBScript RUNAT=Server>
   Globalasa wufasp
  Sub Application_OnStart
  ApplicationLock
  在這裡讀出Application(CountAll)的初始值
  ApplicationUnLock
  End Sub
  
  Sub Session_OnStart
  Applic
From:http://tw.wingwit.com/Article/program/net/201311/13475.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.