在上一篇中作者給大家詳細介紹了兩個非常實用的ASP 內建對象Application 和Session 的使用方法。由於這兩者的OnStart、OnEnd 事件的腳本都必須在Global.asa 文件中聲明, 因此,本篇將給大家詳細介紹Global.asa 文件的使用方法。為使大家熟練掌握至今所學過的知識,本篇還將舉出一個ASP 的Chat 程序,供各位參考。
最近很多朋友來信問我,為什麼前兩期的範例程序運行時有這樣那樣的錯。首先,我要向大家聲明,這些程序都是我自己寫的,在出廠前都經過合格檢驗,絕無假冒偽劣產品。 :) 由於程序中使用了cookie 記錄客戶信息,所以如果你在瀏覽器中沒有設置接受cookie 則程序將不能正常運行。另外,程序將客戶信息記錄在客戶端的cookie 所使用的方法是Response.Cookie,此語句必須寫在ASP 文件中的第一個< HTML> 標記前,這是因為Cookie 是作為HTTP 傳輸的頭信息的一部分發送給客戶的,如果當HTTP 報頭信息已經傳輸給客戶後再使用Response.Cookie,將出現以下錯誤:HTTP 標題已經寫入到客戶瀏覽器。任何HTTP 標題的修改必須在寫入頁內容之前。 ,可能一些朋友在剪貼程序的時候沒有註意,打亂了程序的前後次序, 或者是錯誤的將HTML 代碼添加在ASP 範例程序之前,因而導致程序運行出錯。因此,我建議大家一方面在首次運行例程的時候不要對程序進行任何改動,盡量在看懂程序的基礎上逐步改進,另一方面在運行ASP 程序時至少要在瀏覽器中選擇可接受Cookie ,否則一旦ASP 程序中使用了Cookie 或Session,它們都將無法正常運行。
下面我來向大家介紹Global.asa 文件的使用方法。
什麼是Global.asa 文件?它其實是一個可選文件,程序編寫者可以在該文件中指定事件腳本,並聲明具有會話和應用程序作用域的對象。該文件的內容不是用來給用戶顯示的,而是用來存儲事件信息和由應用程序全局使用的對象。該文件的名稱必須是Global.asa 且必須存放在應用程序的根目錄中。每個應用程序只能有一個Global.asa 文件。
在Global.asa 文件中,如果包含的腳本沒有用< SCRIPT> 標記封裝,或定義的對像沒有會話或應用程序作用域,則服務器將返回錯誤。我們可以用任何支持腳本的語言編寫Global.asa 文件中包含的腳本。如果多個事件使用同一種腳本語言,就可以將它們組織在一組< SCRIPT> 標記中。
在Global.asa 文件中聲明的過程只能從一個或多個與Application_OnStart、Application_OnEnd、Session_OnStart 和Session_OnEnd 事件相關的腳本中調用。在基於ASP 的應用程序的ASP 頁中,它們是不可用的。如果要在應用程序之間共享過程,可在單獨的文件中聲明這些過程,然後使用服務器端包容(SSI) 語句將該文件包含在調用該過程的ASP 程序中。通常,包含文件的擴展名應為.inc。
下面是一個很標準的Global.asa 文件:
< SCRIPT LANGUAGE=VBScript RUNAT=Server>
'Session_OnStart 當客戶首次運行ASP 應用程序中的任何一個頁面時運行
'Session_OnEnd 當一個客戶的會話超時或退出應用程序時運行
'Application_OnStart 當任何客戶首次訪問該應用程序的首頁時運行
'Application_OnEnd 當該站點的WEB 服務器關閉時運行
< /SCRIPT>
< SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
VisitorCountFilename = Server.MapPath (/ex2) + /VisitCount.txt
Set FileObject = Server.CreateObject(Scripting.FileSystemObject)
Set Out= FileObject.OpenTextFile (VisitorCountFilename, 1, FALSE, FALSE)
Application(visitors) = Out.ReadLine
Application(VisitorCountFilename) = VisitorCountFilename
End Sub
'================================================= ========
SUB Application_OnEnd
Set FileOutObject = Server.CreateObject(Scripting.FileSystemObject)
Set Out= FileOutObject.CreateTextFile (Application(VisitorCountFilename), TRUE,FALSE)
Out.WriteLine(application(visitors))
End Sub
'================================================= ========Sub Session_OnStart
Session.Timeout = 5
Application(visitors) = Application(visitors) + 1
Session(ID)=Session.SessionID
End Sub
< /SCRIPT>
在這個Global.asa 程序中,涉及到了ASP 的File Access 組件,它可以提供用於訪問文件系統的方法、屬性和集合。這將在以後ASP 的組件中進行展開討論。在這裡,它起到了在服務器上創建新文件並對文件進行寫操作的作用。這其實是一個ASP 頁面訪問記數器應用程序的Global 文件,首先當客戶首次訪問該應用程序的首頁時, 過程Application_OnStart 定義了在服務器上指定的虛擬目錄下新建一個VisitCount.txt 的文本文件,並將文件的路徑和內容保存在應用程序級的變量中。而當任何一個客戶訪問ASP 應用程序中的任何一個頁面時,過程Session_OnStart 定義將應用程序級的變量visitors 的值自動加一。這樣,每當有客戶訪問頁面時,變量visitors 都將自動加一,以起到統計點擊率的作用。由於變量visitors 的值是存儲在系統內存之中,所以如果服務器關閉或重新啟動,存儲在變量中的數據將自動丟失,所以通過定義過程Application_OnEnd,在服務器關閉或重啟之前將數據寫入事先建立的文本文件之中,這樣就能確保當服務器再次啟動時,Application_OnStart 過程可以從VisitCount.txt 文件中讀取以前的統計數。
經過這段時間的學習,相信大家已經能夠比較熟練的運用我們所學過的這些ASP 內建對象來編寫一些較簡單的ASP 應用程序,可別小看你現在所掌握的這些ASP 基本知識哦!其實你已經能夠開發一些簡單但實用的ASP 應用程序了。下面我就舉一個非常簡單的ASP WEB 聊天室程序,你會發覺寫聊天室原來是一件這麼容易、輕鬆的事。可能朋友們已經在一些雜誌上看到過ASP 聊天程序的編寫方法,但作者在這裡自己寫了一個更簡單的程序,僅僅使用了一個.asp 文件。請將以下代碼剪貼到記事簿並保存為chat.asp。
< %@ Language=VBScript %>
< %
Response.Buffer=true ' 設置輸出緩存,用於顯示不同頁面。
On error resume next ' 忽略程序出錯部分
If Request.ServerVariables(Request_Method)=GET then
' 判斷客戶是以什麼方式請求WEB 頁面
'------------------------
' 客戶登陸界面
'------------------------
%>
< form method=POST action=chat.asp>< p>
< input type=text name=nick size=20 value=nick style=background-color: rgb(192,192,192)>< br>
< input type=submit value= 進入聊天室name=B1 style=color: rgb(255,255,0); font-size: 9pt; background-color: rgb(0,128,128)>
< p>< input type=hidden name=log size=20 value=1>< br>< /p>
< /form>
< %
Response.End ' 結束程序的處理
Else
Response.clear ' 清空緩存中的內容
dim talk
If Request.Form(nick)<> then
' 判斷客戶是是否在聊天界面中
Session(nick)=Request.Form(nick)
End If
'------------------------'
客戶聊天界面
'------------------------
%>
< form method=POST action=chat.asp name=form1> < p>< %=Session(nick)%> 說話:< input type=text name=talk size=50>< br>
< input type=submit value= 提交name=B1>
< input type=reset value= 取消name=B2>< /p>
< /form>
< A HREF=/asptest/shusheng/chat.asp> 離開< /a>< br>< br>
< %
If Request.Form(log)<>1 then
If trim(Request.Form(talk))= then
' 判斷用戶是否沒有輸入任何內容
talk=Session(nick)& 沉默是金。
Else
talk=trim(Request.Form(talk))
' 去掉字符後的空格
End If
Application.lock
Application(show)=< table border='0' cellpadding='0' cellspacing='0' width='85%' >< tr>< td width='100%' bgcolor='#C0C0C0'>< /td >< /tr>< tr>< td width='100%'>< font color='#0000FF'> 來自&Request.ServerVariables(remote_addr)& 的&Session(nick)&time& 說:< /font>&talk&< /td >< /tr>< tr>< td width='100%' bgcolor='#C0C0C0'>< /td>< /tr>< /table>< br>&Application(show)
Application.UnLock
Response.Write Application(show)
End If
End If
%>
下面我們來對這個聊天室程序進行逐步的分析。
首先,由於聊天室的所有客戶都要能夠共享信息,所以不可避免的要用到具有應用程序級變量的對象Application,這是建立Chat 程序的關鍵所在,所有的談話數據都存放在一個應用程序級變量中,以便讓所有的客戶讀取。我們可以用所學過的request 對象獲取客戶所輸入的談話,並保存在變量talk 中, 然後將talk 的值存入應用程序級變量show 中,如下:
< % Application(show)=talk&Application(show) %>
接下來要考慮的是當不同的客戶同時向Chat 應用程序進行操作的時候如何處理。這個問題其實與在數據庫中的兩個用戶同時寫入同一個記錄一樣,如果兩個用戶同時對同一個應用程序級變量進行寫操作,則一個用戶所作的修改會被另一個用戶的操作所覆蓋,所以,如果對Application 對像數據的並發訪問不採取一定措施,則會導致當兩個用戶試圖同時對Asp 聊天室應用程序提交時,一個用戶的提交內容會被另一個用戶的提交內容所覆蓋,在被參加到會話中的任何人看到之前就消失了。為了避免這類問題的出現,我們需要使用Application 對象的Lock 屬性來約束只允許當前的用戶編輯或增加Application 對象的屬性,這樣當用戶開始修改應用程序級變量開始,到Application 對像被顯式地Unlocked為止,Application 對象的屬性只能被該用戶編輯,如果此時有其他用戶請求編輯Application 對象,則這些用戶要排隊等待,知道應用程序被Unlock 為止。如下所示:
Application.lock
Application(show)=talk&Application(show)
Application.UnLock
現在整個程序的核心部分你已經了解了,下面考慮如何保存客戶信息,這裡我們要用到一個會話級變量,即將客戶的nick 保存在Session 中。如:
Session(nick)=Request.Form(nick)
最後,我們要考慮的是如何僅在一個.asp 文件中處理各種事件, 如: 客戶登陸界面、客戶聊天界面。由於客戶第一次請求.asp 文件時,採用的是簡單的HTTP GET 方式,但是當客戶向頁面上的表單字段中增加的數據並向自身提交表單後,.asp 文件會再次被請求,不過這次數據是經過HTTP POST 方式進行傳遞的。文件被請求的方式可以用兩種方法來確定。一是測試Request.Form 集合是否包含成員,若沒有,則表明沒有發送給表單處理的數據。二是使用Request.ServerVariables(Request_Method) 變量。如果表單是通過HTTP GET 方式被請求的,則這個變量會返回GET,如果表單被提交處理則返回POST。由於後一種方法對於確定文件的請求方式更直接,所以我們使用如下代碼進行判斷:
if Request.ServerVariables(Request_Method)=GET then
由於我們設置了ASP 緩存,所以當程序判斷頁面請求方式為GET 時,程序運行Response.End,來結束後面的所有操作,否則則運行Response.clear, 清空緩存中已有的內容,並繼續程序的運行。這樣我們就得以用同一個.asp 文件根據不同情況給客戶顯示不同的界面。
好了,我已經將這個ASP Chat 程序的核心部分告訴大家了,剩下的一些細節性問題請各位自己讀程序吧,其實這個程序還存在很多不足之處,最大的毛病是我沒有寫自動刷新的功能,因此如果你在Chat 中不說話,那也就看不到其他客戶所說的話了。 Chat 在Internet 中的魅力大家是知道的,其實, 用ASP 也完全能做到同irc 類似的強大功能,當然這就需要寫更多的代碼,如果大家有興趣請寫信給我,我將在今後的文章中逐步提升這個chat 程序的等級,讓大家也過過Oper的隱。注:有了這個chat 程序,你就可以用來在自己的PWS 上建一個chat 應用程序,只要將你的IP 地址告訴朋友,如http://202.96.210.33/asp/chat.asp,你們就可以通過你的電腦在網上聊天了,很爽的,不信你試試!