在上一篇中作者給大家詳細介紹了兩個非常實用的 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 檔案?它其實是一個可選檔案,程式編寫者可以在該檔案中指定事件指令碼,並聲明具有會話和Application 領域的對象。該檔案的內容不是用來給使用者顯示的,而是用來儲存事件資訊和由應用程式全域使用的對象。該檔案的名稱必須是 Global.asa 且必須存放在應用程式的根目錄中。每個應用程式只能有一個 Global.asa 檔案。
在 Global.asa 檔案中,如果包含的指令碼沒有用 < SCRIPT> 標記封裝,或定義的對象沒有會話或Application 領域,則伺服器將返回錯誤。我們可以用任何支援指令碼的語言編寫 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
%>
第一次運行 chat.asp 程式,你首先將看到如下頁面 :
選擇你的 nick 進入聊天室後,將看到如下頁面 :
輸入你想要說的話,對話將出現在輸入框的下方,如下圖 :
下面我們來對這個聊天室程式進行逐步的分析。
首先,由於聊天室的所有客戶都要能夠共用資訊,所以不可避免的要用到具有應用程式級變數的對象 Application,這是建立 Chat 程式的關鍵所在,所有的談話資料都存放在一個應用程式級變數中,以便讓所有的客戶讀取。我們可以用所學過的 request 對象擷取客戶所輸入的談話,並儲存在變數 talk 中 , 然後將 talk 的值存入應用程式級變數 show 中,如下 :
< % Application("show")=talk&Application("show") %>
接下來要考慮的是當不同的客戶同時向 Chat 應用程式進行操作的時候如何處理。這個問題其實與在資料庫中的兩個使用者同時寫入同一個記錄一樣,如果兩個使用者同時對同一個應用程式級變數進行寫操作,則一個使用者所作的修改會被另一個使用者的操作所覆蓋,所以,如果對 Appliation 對象資料的並發訪問不採取一定措施,則會導致當兩個使用者試圖同時對 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,你們就可以通過你的電腦在網路聊天了,很爽的,不信你試試 !