什么是對象?在面向對象編程中,對象就是指由當作完整實體的操作和數據組成的變量。對象是基于特定模型的,在對象中客戶使用對象的服務通過由一組方法或相關函數的接口訪問對象的數據,然后客戶端可以調用這些方法執行某中操作。ActiveX 組件是建立 Web 應用程序的關鍵,組件提供了在腳本中執行任務的對象。ActiveX 組件是一個文件,該文件包含執行某項或一組任務的代碼,由于組件可以執行公用任務,這樣程序員們就不必自己去創建執行這些任務的代碼?梢岳媒M件作為腳本和基于 Web 應用程序的基本構造塊。只要知道如何訪問組件提供的對象,即使是位編寫腳本的新手,也可以在不了解組件運作方式的情況下編寫腳本?傊M件使您不用學習編程就能夠編寫強大的腳本。組件是包含在動態鏈接庫 .dll 或可執行文件 .exe 中的可執行代碼。組件可以提供一個或多個對象以及對象的方法和屬性。要使用組件提供的對象,請創建對象的實例并將這個新的實例分配變量名。使用 ASP 的 Server.CreateObject 方法可以創建對象的實例,使用腳本語言的變量分配指令可以為對象實例命名。如下例:
Set db=Server.CreateObject("ADODB.Connection")
這里的變量 db 就是 ASP 程序創建的訪問數據庫的對象實例。
Active Server Pages 提供了可在腳本中使用的內建對象。這些對象使用戶更容易收集通過瀏覽器請求發送的信息、響應瀏覽器以及存儲用戶信息 , 從而使對象開發者擺脫了很多繁瑣的工作。目前的 ASP 版本總共提供了六個內建對象,下面讓我們將通過實例分別來進行學習。
4.1 ASP內建對象Request
可以使用 Request 對象訪問任何基于 HTTP 請求傳遞的所有信息,包括從 HTML 表格用 POST 方法或 GET 方法傳遞的參數、cookie 和用戶認證。Request 對象使您能夠訪問客戶端發送給服務器的二進制數據。
Request 的語法 :
Request[. 集合 | 屬性 | 方法 ]( 變量 )
在這里將挑選一些常用的對象語法進行分析
1、Form
Form 集合通過使用 POST 方法的表格檢索郵送到 HTTP 請求正文中的表格元素的值。
語法
Request.Form(element)[(index)|.Count]
參數
element 指定集合要檢索的表格元素的名稱。
index 可選參數,使用該參數可以訪問某參數中多個值中的一個。它可以是 1 到 Request.Form(parameter).Count 之間的任意整數。
Count 集合中元素的個數
Form 集合按請求正文中參數的名稱來索引。Request.Form(element) 的值是請求正文中所有 element 值的數組。通過調用 Request.Form(element).Count 來確定參數中值的個數。如果參數未關聯多個值,則計數為 1。如果找不到參數,計數為 0。要引用有多個值的表格元素中的單個值,必須指定 index 值。index 參數可以是從 1 到 Request.Form(element).Count 中的任意數字。如果引用多個表格參數中的一個,而未指定 index 值,返回的數據將是以逗號分隔的字符串。
可以使用重述符來顯示表格請求中的所有數據值。
對于 hobby 參數,您可以使用下面的腳本檢索這些值。
<html>
<head><title></title>
</head>
<body>
<p> 請填寫你的愛好 </p>
<form method="POST" action="form.asp">
<p><input type="text" name="hobby" size="20"><br>
<input type="checkbox" name="hobby" value=" 足球 "> 足球
<input type="checkbox" name="hobby" value=" 乒乓球 "> 乒乓球 </p> <p>
<input type="submit" value=" 發送 " name="B1">
<input type="reset" value=" 重填 " name="B2"></p>
</form>
<% For Each i In Request.Form("hobby") Response.Write i & "<BR>" Next
%>
</body>
</html>
將以上代碼剪貼到記事簿中(注意將“<”后面的空格去掉),保存為 form.asp 文件并運行,request 對象可以根據你在 form 中填入或選擇元素內容的不同將元素逐個顯示出來。
當然使用 For...Next 循環也可以生成同樣的輸出,如下所示 :
<%
For i = 1 To Request.Form("hobby").Count
Response.Write Request.Form("hobby")(i) & "<BR>"Next
%>
2、QueryString
QueryString 集合檢索 HTTP 查詢字符串中變量的值 ,HTTP 查詢字符串由問號 (?) 后的值指定。如:
<A HREF= "example.asp?string=this is a sample">string sample</A>
生成值為 "this is a sample" 的變量名字符串。通過發送表格或由用戶在其瀏覽器的地址框中鍵入查詢也可以生成查詢字符串。
語法
Request.QueryString(variable)[(index)|.Count]
QueryString 集合可以讓您以名稱檢索 QUERY_STRING 變量。Request.QueryString( 參數 ) 的值是出現在 QUERY_STRING 中所有參數的值的數組。通過調用Request.QueryString(parameter).Count 可以確定參數有多少個值。
我們也可以使用 QueryString 來達到與前一個范例相同的功能。只需要將 request.form 部分替換如下:
<%
For Each i In Request.querystring("hobby")
Response.Write i & "<BR>"
Next
%>
3、Cookies
什么是 Cookie?Cookie 其實是一個標簽,當你訪問一個需要唯一標識你的站址的 WEB 站點時,它會在你的硬盤上留下一個標記,下一次你訪問同一個站點時,站點的頁面會查找這個標記。每個 WEB 站點都有自己的標記,標記的內容可以隨時讀取,但只能由該站點的頁面完成。每個站點的 Cookie 與其他所有站點的 Cookie 存在同一文件夾中的不同文件內(你可以在 Windows 的目錄下的 Cookie 文件夾中找到它們)。一個 Cookie 就是一個唯一標識客戶的標記,Cookie 可以包含在一個對話期或幾個對話期之間某個 WEB 站點的所有頁面共享的信息,使用 Cookie 還可以在頁面之間交換信息。Request 提供的 Cookies 集合允許用戶檢索在 HTTP 請求中發送的 cookie 的值。這項功能經常被使用在要求認證客戶密碼以及電子公告板、WEB 聊天室等 ASP 程序中。
語法
Request.Cookies(cookie)[(key)|.attribute]
參數
cookie 指定要檢索其值的 cookie。
key 可選參數,用于從 cookie 字典中檢索子關鍵字的值。
attribe 指定 cookie 自身的有關信息。如:HasKeys 只讀,指定 cookie 是否包含關鍵字。
可以通過包含一個 key 值來訪問 cookie 字典的子關鍵字。如果訪問 cookie 字典時未指定 key,則所有關鍵字都會作為單個查詢字符串返回。例如,如果 MyCookie 有兩個關鍵字 , First 和 Second,而在調用 Request.Cookies 時并未指定其中任何一個關鍵字,那么將返回下列字符串。
First=firstkeyvalue&Second=secondkeyvalue
如果客戶端瀏覽器發送了兩個同名的 cookie,那么 Request.Cookie 將返回其中路徑結構較深的一個。例如,如果有兩個同名的的 cookie,但其中一個的路徑屬性為 /www/ 而另一個為 /www/home/,客戶端瀏覽器同時將兩個 cookie 都發送到 /www/home/ 目錄中,那么 Request.Cookie 將只返回第二個 cookie。
要確定某個 cookie 是不是 cookie 字典(cookie 有否有關鍵字),可使用下列腳本。
<%= Request.Cookies("myCookie").HasKeys %>
如果 myCookie 是一個 cookie 字典,則前面的賦值為 TRUE。否則,為 FALSE。下面我們來看看一個 cookie 的應用實例:
<%
nickname=request.form("nick")response.cookies("nick")=nickname
' 用 response 對象將用戶名寫入 Cookie 之中
response.write " 歡迎 "&request.cookies("nick")&" 光臨小站!"
%>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>cookie</title>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0"></head>
<body>
<form method="POST" action="cookie.asp">
<p><input type="text" name="nick" size="20">
<input type="submit" value=" 發送 " name="B1"><input type="reset" value=" 重填 " name="B2"></p></form>
</body></html>
這其實是一個在基于 WEB 的 BBS 或 CHAT 的 ASP 程序中常用的手法,它將用戶在起始頁面上填入的姓名保存在 cookie 中,這樣后面的程序就可以很容易地調用該用戶的 nick 了。
4、ServerVariables
大家都知道在瀏覽器中瀏覽網頁的時候使用的傳輸協議是 HTTP,在 HTTP 的標題文件中會記錄一些客戶端的信息,如 : 客戶的 IP 地址等等,有時服務器端需要根據不同的客戶端信息做出不同的反映,這時候就需要用 ServerVariables 集合獲取所需信息。
語法
Request.ServerVariables ( 服務器環境變量 )
由于服務器環境變量較多,僅將一些常用的變量在下表中列出 :
ALL_HTTP 客戶端發送的所有 HTTP 標題文件。
CONTENT_LENGTH 客戶端發出內容的長度。
CONTENT_TYPE 內容的數據類型。如:“text/html”。同附加信息 的查詢一起使用,如 HTTP 查詢 GET、POST 和 PUT。
LOCAL_ADDR 返回接受請求的服務器地址。如果在綁定多 個 IP 地址的多宿主機器上查找請求所使用的地址 時,這條變量非常重要。
LOGON_USER 用戶登錄 Windows NT 的帳號。
QUERY_STRING 查詢 HTTP 請求中問號(?)后的信息。
REMOTE_ADDR 發出請求的遠程主機 (client) 的 IP 地址。
REMOTE_HOST 發出請求的主機 (client) 名稱。如果服務器無此 信息,它將設置為空的 MOTE_ADDR 變量。
REQUEST_METHOD 該方法用于提出請求。相當于用于 HTTP 的 GET、HEAD、POST等 等。
SERVER_NAME 出現在自引用 URL 中的服務器主機名、DNS 化名 或 IP 地址。
SERVER_PORT 發送請求的端口號。
我們可以使用以下腳本打印出所有的服務器環境變量。
<TABLE>
<TR><TD><B>Server Variable</B></TD><TD><B>Value</B></TD></TR><% For Each name In Request.ServerVariables %>
<TR><TD> <%= name %> </TD><TD> <%= Request.ServerVariables(name) %> </TD></TR></TABLE>
<% Next %>
本節我們詳細學習了 ASP 內建對象中的 request 對象,這也是 ASP 程序中使用最頻繁的對象,希望大家多多實踐。
4.2 ASP內建對象Response
在上一節中作者給大家詳細介紹了 ASP 內建對象之一 Request 的使用方法,相信各位讀者通過一系列的實踐已經能夠熟練掌握,本節將繼續給大家介紹 ASP 的另一個內建對象 Response。
4.2.1 屬性
1、Buffer
Buffer 屬性指示是否緩沖頁輸出。當緩沖頁輸出時,只有當前頁的所有服務器腳本處理完畢或者調用了 Flush 或 End 方法后,服務器才將響應發送給客戶端瀏覽器,服務器將輸出發送給客戶端瀏覽器后就不能再設置 Buffer 屬性。因此應該在 .asp 文件的第一行調用 Response.Buffer。
2、Charset
Charset 屬性將字符集名稱附加到 Response 對象中 content-type 標題的后面。對于不包含 Response.Charset 屬性的 ASP 頁,content-type 標題將為 :content-type:text/html。
我們可以在 .asp 文件中指定 content-type 標題,如 :
<% Response.Charset="gb2312") %>
將產生以下結果 :
content-type:text/html; charset=gb2312
注意,無論字符串表示的字符集是否有效,該功能都會將其插入 content-type 標題中。且如果某個頁包含多個含有 Response.Charset 的標記,則每個 Response.Charset 都將替代前一個 CharsetName。這樣,字符集將被設置為該頁中 Response.Charset 的最后一個實例所指定值。
3、ContentType
ContentType 屬性指定服務器響應的 HTTP 內容類型。如果未指定 ContentType,默認為 text/HTML。
4、Expires
Expires 屬性指定了在瀏覽器上緩沖存儲的頁距過期還有多少時間。如果用戶在某個頁過期之前又回到此頁,就會顯示緩沖區中的頁面。如果設置 response.expires=0,則可使緩存的頁面立即過期。這是一個較實用的屬性,當客戶通過 ASP 的登陸頁面進入 WEB 站點后,應該利用該屬性使登陸頁面立即過期,以確保安全。
5、ExpiresAbsolute
與 Expires 屬性不同 ExpiresAbsolute 屬性指定緩存于瀏覽器中的頁面的確切到期日期和時間。在未到期之前,若用戶返回到該頁,該緩存中的頁面就顯示。如果未指定時間,該主頁在當天午夜到期。如果未指定日期,則該主頁在腳本運行當天的指定時間到期。如下示例指定頁面在 1998 年 12 月 10 日上午 9:00 分 30 秒到期。
<% Response.ExpiresAbsolute=#Dec 12,1998 9:00:30# %>
4.2.2 方法
1、Clear
可以用 Clear 方法清除緩沖區中的所有 HTML 輸出。但 Clear 方法只清除響應正文而不清除響應標題?梢杂迷摲椒ㄌ幚礤e誤情況。但是如果沒有將 Response.Buffer 設置為 TRUE,則該方法將導致運行時錯誤。
2、End
End 方法使 Web 服務器停止處理腳本并返回當前結果。文件中剩余的內容將不被處理。如果 Response.Buffer 已設置為 TRUE,則調用 Response.End 將緩沖輸出。
3、Flush
Flush 方法立即發送緩沖區中的輸出。如果沒有將 Response.Buffer 設置為 TRUE,則該方法將導致運行時錯誤。
4、Redirect
Redirect 方法使瀏覽器立即重定向到程序指定的 URL。這也是一個我們經常用到方法,這樣程序員就可以根據客戶的不同響應,為不同的客戶指定不同的頁面或根據不同的情況指定不同的頁面。一旦使用了 Redirect 方法任何在頁中顯式設置的響應正文內容都將被忽略。然而,此方法不向客戶端發送該頁設置的其他 HTTP 標題,將產生一個將重定向 URL 作為鏈接包含的自動響應正文。Redirect 方法發送下列顯式標題,其中 URL 是傳遞給該方法的值。如:
<% Response.redirect("www.chinabyte.com") %>
5、Write
Write 方法是我們平時最常用的方法之一,它是將指定的字符串寫到當前的 HTTP 輸出。
4.2.3 集合
Response 對象只有一個集合 --Cookie
Cookies 集合設置 cookie 的值。若指定的 cookie 不存在,則創建它。若存在,則設置新的值并且將舊值刪去。
語法
Response.Cookies(cookie)[(key)|.attribute]=value
這里的 cookie 是指定 cookie 的名稱。而如果指定了 key,則該 cookie 就是一個字典。attribute 指定 cookie 自身的有關信息。attribute 參數可以是下列之一 :
Domain 若被指定,則 cookie 將被發送到對該域的請求中去。
Expires 指定 cookie 的過期日期。為了在會話結束后將 cookie 存儲在客戶端磁盤上,必須設置該日期。若此項屬性的設置未超過當前日期,則在任務結束后 cookie 將到期。
HasKeys 指定 cookie 是否包含關鍵字。
Path 若被指定,則 cookie 將只發送到對該路徑的請求中。如果未設置該屬性,則使用應用程序的路徑。
至此,我們已經學習的 Response 對象的所有屬性、方法和集合的理論知識,下面給大家演示一段簡單的程序,通過實踐讓大家加深理解。 <% Dim user Dim flag Dim pwd Dim say Response.buffer=true ' 開啟緩沖頁面功能 Response.ContentType="text/HTML" Response.Charset="gb2312" user=Request.Form("username") pwd=Request.Form("password") say=Request.QueryString("say") %> <form method="POST" action="asp7.asp"> <p> 用戶名 :<input type="text" name="username" size="12"><br> 口 令 :<input type="password" name="password" size="12"><br> <input type="submit" value=" 提交 " name="B1"><input type="reset" value=" 取消 " name="B2"></p></form> <% If say=1 then Response.Write " 歡迎光臨 !" End If If say > 1 then Response.Write " 歡迎再次光臨!" End If If user="Adm" and pwd="shusheng" Then Response.Expires=1 ' 設置該頁面在瀏覽器的緩沖中存儲 1 分鐘后過期。 flag=1 ElseIf user="guest" and pwd="guest" Then Response.Expires=0 ' 使緩存的頁面立即過期。 Response.Clear ' 清空存儲在緩存中的頁面 flag=2 ElseIf user="vip" and pwd="vip" Then Response.Write " 歡迎 VIP 光臨" flag=3 Else flag=0 Response.End ' 立即停止腳本處理,并將緩存中的頁面輸出 End If Response.write "<p><a href='asp7b.asp?flag="&flag&"'> 動態網站設計實踐練習 </a></p>" %> <p> 動態網站設計練習 </p> 再將以下程序保存為 asp7b.asp。 <% Dim saysay=Request.QueryString("flag") Select case say case "1" Response.Redirect "asp7.asp?say=1" case "2" Response.Redirect "asp7.asp?say=2" case "3" Response.Redirect "asp7.asp?say=3" case "0" Response.Redirect "asp7.asp?say=0" End Select %>
將這兩個程序放在有執行權限的 WEB 虛擬目錄下,并以 http 方式訪問 asp7.asp。在這兩個程序中我們充分運用了至今為止所學過的兩個 ASP 內建對象 :Request 和 Response。當你第一次訪問 asp7.asp 文件時,頁面上出現一個 Form 并提示輸入用戶名和口令。 因為我們設置了頁面緩存,當使用 guest 登陸時,判斷程序自動清空其之前所有存儲在緩存中的頁面,而僅將其后腳本程序執行的結果顯示出來。
4.3 ASP內建對象Application 和 Session
在上一節給大家詳細介紹了 ASP 內建對象 Response 的使用方法,在這一節中繼續給大家介紹另兩個非常實用且重要的 ASP 的內建對象 Application 和 Session。 在 ASP 的內建對象中除了用于發送、接收和處理數據的對象外,還有一些非常實用的代表 Active Server 應用程序和單個用戶信息的對象。
4.3.1 Application
讓我們先來看看 Application 對象。在同一虛擬目錄及其子目錄下的所有 .asp 文件構成了 ASP 應用程序。我們非但可以使用 Application 對象,在給定的應用程序的所有用戶之間共享信息,并在服務器運行期間持久的保存數據。而且,Application 對象還有控制訪問應用層數據的方法和可用于在應用程序啟動和停止時觸發過程的事件。
下面就讓我們一起來學習 Application 對象。
4.3.1.1 屬性
雖然 Application 對象沒有內置的屬性,但我們可以使用以下句法設置用戶定義的屬性也可稱為集合。
Application(" 屬性 / 集合名稱 ")= 值
我們可以使用如下腳本聲明并建立 Application 對象的屬性。 <% Application("MyVar") = "Hello" Set Application("MyObj") = Server.CreateObject("MyComponent") %>
一旦我們分配了 Application 對象的屬性,它就會持久地存在,直到關閉 WEB 服務器服務使得 Application 停止。由于存儲在 Application 對象中的數值可以被應用程序的所有用戶讀取,所以 Application 對象的屬性特別適合在應用程序的用戶之間傳遞信息。
4.3.1.2 方法
Application 對象有兩個方法,它們都是用于處理多個用戶對存儲在 Application 中的數據進行寫入的問題
1、Lock 方法禁止其他客戶修改 Application 對象的屬性。
Lock 方法阻止其他客戶修改存儲在 Application 對象中的變量,以確保在同一時刻僅有一個客戶可修改和存取 Application 變量。如果用戶沒有明確調用 Unlock 方法,則服務器將在 .asp 文件結束或超時后即解除對 Application 對象的鎖定。
讓我們來看看下面這段用 Application 來記錄頁面訪問次數的程序 : <% Dim NumVisitsNumVisits=0 Application.LockApplication("NumVisits") = Application("NumVisits") + 1 Application.Unlock %> 歡迎光臨本網頁,你是本頁的第 <%= Application("NumVisits") %> 位訪客 !
將以上腳本保存在你的 .asp 文件中,就輕而易舉地給你的頁面添加了一個計數器。
2、和 Lock 方法相反,Unlock 方法允許其他客戶修改 Application 對象的屬性。
在上面的例子中,上述例子中,Unlock 方法解除對象的鎖定,使得下一個客戶端能夠增加 NumVisits 的值。
4.3.1.3 事件
1、Application_OnStart
Application_OnStart 事件在首次創建新的會話 ( 即 Session_OnStart 事件 ) 之前發生。當 WEB 服務器啟動并允許對應用程序所包含的文件進行請求時就觸發 Application_OnStart 事件。Application_OnStart 事件的處理過程必須寫在 Global.asa 文件之中。
Application_OnStart 事件的語法如下 : <SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Application_OnStart. . . End Sub </SCRIPT>
2、Application_OnEnd
Application_OnEnd 事件在應用程序退出時于 Session_OnEnd 事件之后發生,Application_OnEnd 事件的處理過程也必須寫在 Global.asa 文件之中。
下面讓我們來看看在使用 Application 對象時必須注意的一些事項。
不能在 Application 對象中存儲 ASP 內建對象。例如,下面的每一行都返回一個錯誤。 <% Set Application("var1")=Session Set Application("var2")=Request Set Application("var3")=Response Set Application("var4")=Server Set Application("var5")=Application Set Application("var6")=ObjectContext %>
若您將一個數組存儲在 Application 對象中,請不要直接更改存儲在數組中的元素。例如,下列的腳本無法運行。 <% Application("StoredArray")(3) = "new value" %>
這是因為 Application 對象是作為集合被實現的。數組元素 StoredArray(3) 未獲得新的賦值。而此值將包含在 Application 對象集合中,并將覆蓋此位置以前存儲的任何信息。建議您在將數組存儲在 Application 對象中時,在檢索或改變數組中的對象前獲取數組的一個副本。在對數組操作時,您應再將數組全部存儲在 Application 對象中,這樣您所做的任何改動將被存儲下來。下列的腳本對此進行演示。
<% dim MyArray() Redim MyArray(5) MyArray(0)="hello" MyArray(1)="some other string" Application.Lock Application("StoredArray")=MyArray Application.Unlock Response.Redirect "asp8b.asp" %>
<% LocalArray=Application("StoredArray") LocalArray(1)=" there" Response.Write LocalArray(0)&LocalArray(1) Application.Lock Application("StoredArray")=LocalArray Application.Unlock %>
4.3.2 Session
與 Application 對象具有相近作用的另一個非常實用的 ASP 內建對象就是 Session。我們可以使用 Session 對象存儲特定的用戶會話所需的信息。當用戶在應用程序的頁之間跳轉時,存儲在 Session 對象中的變量不會清除,而用戶在應用程序中訪問頁面時,這些變量始終存在。當用戶請求來自應用程序的 Web 頁時,如果該用戶還沒有會話,則 Web 服務器將自動創建一個 Session 對象。當會話過期或被放棄后,服務器將終止該會話。 通過向客戶程序發送唯一的 Cookie 可以管理服務器上的 Session 對象。當用戶第一次請求 ASP 應用程序中的某個頁面時,ASP 要檢查 HTTP 頭信息,查看是否有在報文中有名為 ASPSESSIONID 的 Cookie 發送過來,如果有,則服務器會啟動新的會話,并為該會話生成一個全局唯一的值,在把這個值作為新 ASPSESSIONID Cookie 的值發送給客戶端,正是使用這種 Cookie,可以訪問存儲在服務器上的屬于客戶程序的信息。Session 對象最常見的作用就是存儲用戶的首選項。例如,如果用戶指明不喜歡查看圖形,就可以將該信息存儲在 Session 對象中。另外其還經常被用在鑒別客戶身份的程序中。要注意的是,會話狀態僅在支持 cookie 的瀏覽器中保留,如果客戶關閉了 Cookie 選項,Session 也就不能發揮作用了。
4.3.2.1 屬性
1、SessionID
SessionID 屬性返回用戶的會話標識。在創建會話時,服務器會為每一個會話生成一個單獨的標識。會話標識以長整形數據類型返回。在很多情況下 SessionID 可以用于 WEB 頁面注冊統計。
2、TimeOut
Timeout 屬性以分鐘為單位為該應用程序的 Session 對象指定超時時限。如果用戶在該超時時限之內不刷新或請求網頁,則該會話將終止。
4.3.2.2 方法
Session 對象僅有一個方法,就是 Abandon,Abandon 方法刪除所有存儲在 Session 對象中的對象并釋放這些對象的源。如果您未明確地調用 Abandon 方法,一旦會話超時,服務器將刪除這些對象。當服務器處理完當前頁時,下面示例將釋放會話狀態。 <% Session.Abandon %>
4.3.2.3 事件
Session 對象有兩個事件可用于在 Session 對象啟動和釋放是運行過程。
1、Session_OnStart 事件在服務器創建新會話時發生。服務器在執行請求的頁之前先處理該腳本。Session_OnStart 事件是設置會話期變量的最佳時機,因為在訪問任何頁之前都會先設置它們。
盡管在 Session_OnStart 事件包含 Redirect 或 End 方法調用的情況下 Session 對象仍會保持,然而服務器將停止處理 Global.asa 文件并觸發 Session_OnStart 事件的文件中的腳本。
為了確保用戶在打開某個特定的 Web 頁時始終啟動一個會話,就可以在 Session_OnStart 事件中調用 Redirect 方法。當用戶進入應用程序時,服務器將為用戶創建一個會話并處理 Session_OnStart 事件腳本。您可以將腳本包含在該事件中以便檢查用戶打開的頁是不是啟動頁,如果不是,就指示用戶調用 Response.Redirect 方法啟動網頁。程序如下 :
<SCRIPT RUNAT=Server Language=VBScript> Sub Session_OnStart startPage = "/MyApp/StartHere.asp" currentPage = Request.ServerVariables("SCRIPT_NAME") if strcomp(currentPage,startPage,1) then Response.Redirect(startPage) end if End Sub </SCRIPT>
上述程序只能在支持 cookie 的瀏覽器中運行。因為不支持 cookie 的瀏覽器不能返回 SessionID cookie,所以,每當用戶請求 Web 頁時,服務器都會創建一個新會話。這樣,對于每個請求服務器都將處理 Session_OnStart 腳本并將用戶重定向到啟動頁中。
2、Session_OnEnd 事件在會話被放棄或超時發生。
關于使用 Session 對象需要注意的事項 Application 對象相近,請參照前文。
會話可以通過以下三種方式啟動 :
1、一個新用戶請求訪問一個 URL,該 URL 標識了某個應用程序中的 .asp 文件,并且該應用程序的 Global.asa 文件包含 Session_OnStart 過程。
2、用戶在 Session 對象中存儲了一個值。
3、用戶請求了一個應用程序的 .asp 文件,并且該應用程序的Global.asa 文件使用 <OBJECT> 標簽創建帶有會話作用域的對象的實例。
如果用戶在指定時間內沒有請求或刷新應用程序中的任何頁,會話將自動結束。這段時間的默認值是 20 分鐘?梢酝ㄟ^在 Internet 服務管理器中設置“應用程序選項”屬性頁中的“會話超時”屬性改變應用程序的默認超時限制設置。應依據您的 Web 應用程序的要求和服務器的內存空間來設置此值。例如,如果您希望瀏覽您的 Web 應用程序的用戶在每一頁僅停留幾分鐘,就應該縮短會話的默認超時值。過長的會話超時值將導致打開的會話過多而耗盡您的服務器的內存資源。對于一個特定的會話,如果您想設置一個小于默認超時值的超時值,可以設置 Session 對象的 Timeout 屬性。例如,下面這段腳本將超時值設置為 5 分鐘。 <% Session.Timeout = 5 %> 當然你也可以設置一個大于默認設置的超時值,Session.Timeout 屬性決定超時值。你還可以通過 Session 對象的 Abandon 方法顯式結束一個會話。例如,在表格中提供一個“退出”按鈕,將按鈕的 ACTION 參數設置為包含下列命令的 .asp 文件的 URL。 <% Session.Abandon %> 在本節我們學習了兩個在 WEB 頁面特別是基于 WEB 的 BBS 或 Chat 上經常使用 ASP 內建對象,由于這兩個對象在實際運用中很實用,因此在下一節中將運用至此我們所學過的 4 個 ASP 內建對象,給大家演示一個完整的 ASP 應用程序,相信通過這個練習,能大大加深你對 ASP 應用程序的理解和掌握。
4.4 Global.asa文件的使用及Chat程序
在上一節中給大家詳細介紹了兩個非常實用的 ASP 內建對象 Application 和 Session 的使用方法。由于這兩者的 OnStart、OnEnd 事件的腳本都必須在 Global.asa 文件中聲明 , 因此,本節將給大家詳細介紹 Global.asa 文件的使用方法。為使大家熟練掌握至今所學過的知識,本篇還將舉出一個 ASP 的 Chat 程序,供各位參考。 下面向大家介紹 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 WEB 聊天室程序:
<%@ Language=VBScript %> <% Response.Buffer=true ' 設置輸出緩存,用于顯示不同頁面。 On error resume next ' 忽略程序出錯部分 If Request.ServerVariables("Request_Method")="GET" then %>
<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><br>"&Application("show") Application.UnLock
Response.Write Application("show") End If End If %>
下面我們來對這個聊天室程序進行逐步的分析。
首先,由于聊天室的所有客戶都要能夠共享信息,所以不可避免的要用到具有應用程序級變量的對象 Application,這是建立 Chat 程序的關鍵所在,所有的談話數據都存放在一個應用程序級變量中,以便讓所有的客戶讀取。我們可以用所學過的
<% 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 文件根據不同情況給客戶顯示不同的界面。
4.5 ASP內建對象Server
Server 對象提供對服務器上的方法和屬性的訪問 , 其中大多數方法和屬性是作為實用程序的功能服務的。有了 Server 對象,你就可以在服務器上啟動 ActiveX 對象例程,并使用 Active Server 服務提供象 HTML 和 URL 編碼這樣的函數。
4.5.1 語法
Server.property|method
4.5.2 屬性
ScriptTimeout 超時值,在腳本運行超過這一時間之后即作超時處理。如下代碼指定服務器處理腳本在 100 秒后超時。
<% Server.ScriptTimeout=100 %>
這里需要注意的是,通過使用元數據庫中的 AspScriptTimeout 屬性可以為 Web 服務或 Web 服務器設置缺省的 ScriptTimeout 值。ScriptTimeout 屬性不能設置為小于在原數據庫中指定的值。例如,如果 NumSeconds 設置為 60,而元數據庫設置包含了默認值 90 秒,則腳本在 90 秒后超時。
4.5.3 方法
1、HTMLEncode 方法
HTMLEncode 方法允許你對特定的字符串進行 HTML 編碼,雖然 HTML 可以顯示大部分你寫入 ASP 文件中的文本,但是當你需要實際包含 HTML 標記中所使用的字符,就會遇到問題。這是因為,當瀏覽器讀到這樣的字符串時,會試圖進行解釋。例如下面的這段文本 :
這是對 HTMLEncode 方法的測試。<br> 這里應該不會另起一行。
會被瀏覽器顯示為 :
這是對 HTMLEncode 方法的測試。 這里應該不會另起一行。
為了避免此類問題,我們就需要使用 Server 對象的 HTMLEncode 方法,采用對應的不由瀏覽器解釋的 HTML Character Code 替代 HTML 標記字符。所以,用下面的代碼才能顯示正確的 HTMLEncode 字符串,從而在瀏覽器中按你的需要輸出文本。 <% Response.write Server.HTMLEncode(" 這是對 HTMLEncode 方法的測試。<br> 這里應該不會另起一行。")%>
2、URLEncode 方法
就象 HTMLEncode 方法使客戶可以將字符串翻譯成可接受的 HTML 格式一樣,Server 對象的 URLEncode 方法可以根據 URL 規則對字符串進行正確編碼,當字符串數據以 URL 的形式傳遞到服務器時,在字符串中不允許出現空格,也不允許出現特殊字符。為此,如果你希望在發送字符串之前進行 URL 編碼,可以使用 Server.URLEncode 方法。
3、MapPath 方法
MapPath 方法將指定的相對或虛擬路徑映射到服務器上相應的物理目錄上。
語法如下 :Server.MapPath(Path)
Path 指定要映射物理目錄的相對或虛擬路徑。若 Path 以一個正斜杠 (/) 或反斜杠 (\) 開始,則 MapPath 方法返回路徑時將 Path 視為完整的虛擬路徑。若 Path 不是以斜杠開始,則 MapPath 方法返回同 .asp 文件中已有的路徑相對的路徑。這里需要注意的是 MapPath 方法不檢查返回的路徑是否正確或在服務器上是否存在。 對于下列示例,文件 data.txt 和包含下列腳本的 test.asp 文件都位于目錄 C:\Inetpub\Wwwroot\asp 下。C:\Inetpub\Wwwroot 目錄被設置為服務器的宿主目錄。下列示例使用服務器變量 PATH_INFO 映射當前文件的物理路徑。以下腳本
<%= server.mappath(Request.ServerVariables("PATH_INFO"))%>
輸出
c:\inetpub\wwwroot\asp\test.asp
由于下列示例中的路徑參數不是以斜杠字符開始的,所以它們被相對映射到當前目錄,此處是目錄 C:\Inetpub\Wwwroot\asp。以下腳本 <%= server.mappath("data.txt")%> <%= server.mappath("asp/data.txt")%>
輸出 c:\inetpub\wwwroot\asp\data.txt c:\inetpub\wwwroot\asp\asp\data.txt
4、CreateObject 方法
Server.CreateObject 恐怕是 ASP 中最為實用,也是最強勁的功能了。它用于創建已經注冊到服務器上的 ActiveX 組件實例。這是一個非常重要的特性,因為通過使用 ActiveX 組件能夠使你輕松地擴展 ActiveX 的能力,正是使用了 ActiveX 組件,你可以實現至關重要的功能,譬如數據庫連接、文件訪問、廣告顯示和其他 VBScript 不能提供或不能簡單地依靠單獨使用 ActiveX 所能完成的功能。正是因為這些組件才使得 ASP 具有了強大的生命力。
其語法如下:
Server.CreateObject("Component Name")
默認情況下,由 Server.CreateObject 方法創建的對象具有頁作用域。這就是說,再當前 ASP 頁處理完成之后,服務器將自動破壞這些對象。如果要創建有會話或應用程序作用域的對象,可以使用 <OBJECT> 標記并設置 SESSION 或 APPLICATION 的 SCOPE 屬性,也可以在對話及應用程序變量中存儲該對象。如下例程 :
<% Set Session("ad") = Server.CreateObject("MSWC.AdRotator")%>
這里需要注意的是,不能創建與內建對象同名的對象實例,否則,如下列腳本將返回錯誤。
<% Set Response = Server.CreateObject("Response") %>
至今為止,我們已經學習完了 ASP 所有的內建對象,從下一章起作者將開始介紹 ASP 內建 ActiveX 組件,這也是 ASP 運用中非常重要和實用的一部分。
|