ASP概覽
發(fā)表時(shí)間:2024-05-19 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]1. ASP 1.1. 簡(jiǎn)介 Microsoft® Active Server Pages (ASP) 是服務(wù)器端腳本環(huán)境,可用來(lái)創(chuàng)建交互式 Web 頁(yè)并建立強(qiáng)大的 Web 應(yīng)用程序。我們可以采用VBScript和JScript來(lái)創(chuàng)建服務(wù)器端腳本,也可以內(nèi)嵌到HTML中,使得編程更...
1. ASP
1.1. 簡(jiǎn)介
Microsoft® Active Server Pages (ASP) 是服務(wù)器端腳本環(huán)境,可用來(lái)創(chuàng)建交互式 Web 頁(yè)并建立強(qiáng)大的 Web 應(yīng)用程序。我們可以采用VBScript和JScript來(lái)創(chuàng)建服務(wù)器端腳本,也可以內(nèi)嵌到HTML中,使得編程更為方便,同時(shí)可以調(diào)用COM組件(如訪問(wèn)數(shù)據(jù)庫(kù)的ADO等),這樣ASP的功能可以無(wú)限地?cái)U(kuò)增。
服務(wù)器上安裝IIS后,可以訪問(wèn)http://localhost/iishelp/來(lái)訪問(wèn)關(guān)于IIS的幫助,其中涵蓋了ASP編程指南,所以我們僅對(duì)自學(xué)難點(diǎn)加以闡述,幫助您達(dá)到速成的目的。
(圖1.1-1)
ASP不是語(yǔ)言,它是一種環(huán)境,具體編程還需要使用VBScript、Jscript等腳本語(yǔ)言。本文示例中除非特殊說(shuō)明,否則默認(rèn)采用VBScript。
1.2. 內(nèi)置對(duì)象
盡管在Microsoft提供的資料中會(huì)有其他的內(nèi)置對(duì)象,但對(duì)于我們來(lái)說(shuō)只要掌握Application、Session、Server、Request和Response五個(gè)對(duì)象就足夠了。學(xué)習(xí)前,首先對(duì)B/S模式作簡(jiǎn)單介紹,B/S是瀏覽器(Browser)/服務(wù)器(Server)的縮寫(xiě)形式,是一種特殊的客戶端(Client)/服務(wù)器(Server)模式,客戶端主要通過(guò)兩種方式訪問(wèn)服務(wù)器,一種是發(fā)送URL地址到服務(wù)器,一種是通過(guò)已有的HTML頁(yè)面填寫(xiě)表單提交到服務(wù)器;服務(wù)器需要做的就是根據(jù)得到的客戶端信息返回結(jié)果—通常就是HTML頁(yè)面。
如果您做過(guò)Socket開(kāi)發(fā)和DLL開(kāi)發(fā),希望圖1.2-1能幫助你了解ASP。
可以不嚴(yán)格的說(shuō),ASP中全局內(nèi)存訪問(wèn)是通過(guò)Application對(duì)象實(shí)現(xiàn)的,服務(wù)器資源訪問(wèn)是通過(guò)Server對(duì)象實(shí)現(xiàn)的(Server對(duì)象CreateObject方法可以創(chuàng)建COM對(duì)象,從而訪問(wèn)更多服務(wù)器資源),客戶端代理中私有內(nèi)存通過(guò)Session進(jìn)行管理,接收的數(shù)據(jù)相對(duì)于服務(wù)器來(lái)說(shuō),就是客戶端的請(qǐng)求信息(Request對(duì)象),發(fā)送數(shù)據(jù)就是服務(wù)器對(duì)客戶端的響應(yīng)(Response對(duì)象實(shí)現(xiàn))。
注意:千萬(wàn)不要總是徘徊在“為什么”中,“到底怎樣接收數(shù)據(jù)”,“到底怎樣發(fā)送數(shù)據(jù)”等等,這些過(guò)程不需要了解,你可以認(rèn)為數(shù)據(jù)就是放在那里的。
1.2.1. Application對(duì)象
1.2.1.1. 集合
Application有兩個(gè)子集合Contents和StaticObjects,一般情況下StaticObjects能實(shí)現(xiàn)的事情通過(guò)Contents都可以實(shí)現(xiàn),所以我們了解Contents就足夠了。
Contents集合中的內(nèi)容相當(dāng)于一個(gè)語(yǔ)言中的變量名與其值的對(duì)應(yīng)。比如我想記錄所有在線人員的個(gè)數(shù)(UserCount),我們可以這樣賦值:
Application.Contents(“UserCount”)=0
或者
Application.Contents(“UserCount”)=Application.Contents(“UserCount”)+1
通常情況下,我們把Application.Contents(…)替換為Application(…),ASP中這是允許的。所以Application.Contents(“UserCount”)將變?yōu)锳pplication(“UserCount”)。你可以把Application(“UserCount”)整個(gè)部分視為一個(gè)變量。
集合Contents有兩個(gè)方法:Remove及RemoveAll,通過(guò)字面即可理解含義,不再贅述。
1.2.1.2. 方法
Lock和Unlock是Application對(duì)象提供的兩個(gè)方法,由于Application使用的是公共的內(nèi)存,當(dāng)多個(gè)客戶端同時(shí)訪問(wèn)時(shí)就必然會(huì)造成沖突,Lock和Unlock就很好的解決了這個(gè)問(wèn)題,寫(xiě)入Application變量前首先調(diào)用Application.Lock鎖定公共內(nèi)存,等寫(xiě)入完畢再調(diào)用Application.Unlock釋放鎖定,使你的程序很簡(jiǎn)單就可以避免多用戶訪問(wèn)的問(wèn)題。
1.2.1.3. 事件
關(guān)于Application的事件Application_OnStart及Application_OnEnd請(qǐng)參照Global.asa節(jié)有關(guān)介紹。
1.2.1.4. 應(yīng)用
Application對(duì)象的內(nèi)容存放在公共內(nèi)存區(qū)域中,對(duì)于所有客戶端代理而言皆是完全訪問(wèn)的。公共的事物適合做公共的事情,比如計(jì)數(shù)器和一些公共對(duì)象。
1.2.2. Session對(duì)象
1.2.2.1. 集合
Contents和StaticObjects集合是Session中重要組成部分,可以通過(guò)調(diào)用Session.Contents,來(lái)定義Session級(jí)的變量,如Session.Contents(“UserLevel”),也可寫(xiě)作Session(“UserLevel”),我們通常也把Session(“UserLevel”)這一部分作為一個(gè)變量看待。
其他略。
1.2.2.2. 屬性
常用的屬性有兩個(gè),一個(gè)是SessionID,一個(gè)是Timeout。
SessionID在一次Web服務(wù)運(yùn)行周期內(nèi),唯一標(biāo)識(shí)一個(gè)客戶端。需要注意的是“一次服務(wù)運(yùn)行周期”,如果重起Web服務(wù),SessionID將極大可能與重起前某次的SessionID相同,所以千萬(wàn)不要用SessionID作為數(shù)據(jù)庫(kù)表中主關(guān)鍵字。
Timeout表示在客戶端多長(zhǎng)時(shí)間沒(méi)有刷新或發(fā)送請(qǐng)求后,服務(wù)器將認(rèn)為其Session已結(jié)束,單位為“分鐘”,IIS5.0中默認(rèn)為10分鐘。Session.Timeout時(shí)間后,將觸發(fā)Session_OnEnd事件。設(shè)置此屬性的根本原因是由于http協(xié)議造成的,每次瀏覽器向服務(wù)器發(fā)送請(qǐng)求后,就立即斷開(kāi),但服務(wù)器需要在一定時(shí)間內(nèi)保留客戶端的連接信息,如果用戶超過(guò)一定時(shí)間(Timeout的值)沒(méi)有刷新,發(fā)送請(qǐng)求或者直接關(guān)閉了瀏覽器,服務(wù)器需要把這個(gè)客戶端的Session信息刪除。想象一下,如果Session信息用不刪除,服務(wù)器終究會(huì)內(nèi)存不足,然后造成系統(tǒng)崩潰。這也是DoS攻擊的簡(jiǎn)單原理。所以,Timeout屬性值的大小必須根據(jù)實(shí)際情況設(shè)置合適的值。
1.2.2.3. 方法
如果說(shuō)設(shè)置Session.Timeout是為了被動(dòng)的刪除沒(méi)有用的客戶端信息,Session.Abandon就是主動(dòng)刪除沒(méi)有用的客戶端信息,且將主動(dòng)觸發(fā)Session_OnEnd事件。在Internet中,用您自己的賬號(hào)登錄一個(gè)網(wǎng)站后,通常會(huì)有“退出登錄”的功能,而且網(wǎng)站一般都建議您通過(guò)點(diǎn)擊“退出登錄”來(lái)退出而不是簡(jiǎn)單的關(guān)閉瀏覽器!巴顺龅卿洝蓖ǔ5膶(shí)現(xiàn)就是刪除當(dāng)前賬號(hào)的登錄信息(可能包含數(shù)據(jù)庫(kù)中的信息或者存儲(chǔ)文件中的信息),以防被人盜用。
1.2.2.4. 事件
Session_OnStart和Session_OnEnd事件參見(jiàn)Global.asa節(jié)。
1.2.2.5. 應(yīng)用
Session的特點(diǎn)就是私有性,所以開(kāi)發(fā)者通常用來(lái)存放登錄用戶的私有信息,如權(quán)限、級(jí)別等信息。
1.2.3. Server對(duì)象
1.2.3.1. 屬性
Server對(duì)象僅有一個(gè)屬性ScriptTimeout,用來(lái)設(shè)置腳本的最長(zhǎng)運(yùn)行時(shí)間,否則將被中斷。設(shè)置單位為秒,默認(rèn)值為90秒。
Server.ScriptTimeout與IIS管理對(duì)象中的元數(shù)據(jù)(Metabase)相互影響,其時(shí)間值將取兩者之間的最大值。
1.2.3.2. 方法
關(guān)于Execute和GetLastError方法請(qǐng)查閱相關(guān)資料。
1.2.3.2.1. CreateObject
ASP對(duì)于服務(wù)器的訪問(wèn)能力幾乎全部從Server.CreateObject擴(kuò)展,如對(duì)目錄文件系統(tǒng)的訪問(wèn),可以創(chuàng)建Scripting.FileSystemObject對(duì)象,如數(shù)據(jù)庫(kù)連接可以創(chuàng)建ADODB.Connection對(duì)象等等。當(dāng)然您也可以開(kāi)發(fā)自己的COM對(duì)象,比如加密、文件上載,或者隱藏的業(yè)務(wù)邏輯等等。
服務(wù)器組件中如果包含OnStartPage和OnEndPage的實(shí)現(xiàn),那么創(chuàng)建服務(wù)器組件時(shí)OnStartPage將被執(zhí)行。
例如,創(chuàng)建文件系統(tǒng)對(duì)象FileSystemObject:
Set fso = Server.CreateObject("Scripting.FileSystemObject")
‘然后就可以調(diào)用Com的任何方法或?qū)傩粤耍?
Set MyFile = fso.CreateTextFile("c:\testfile.txt", True)
MyFile.WriteLine("This is a test.")
MyFile.Close
Set MyFile = Nothing
Set fso = Nothing
現(xiàn)在,查看一下服務(wù)器的C盤(pán)根目錄下是否多了一個(gè)testfile.txt文件,打開(kāi)后的文件內(nèi)容見(jiàn)圖1.2.3.2.1-1:
1.2.3.2.2. HTMLEncode
HTMLEncode對(duì)給定的字符串進(jìn)行HTML編碼,通常是結(jié)合Response對(duì)象使用。如果需要顯示HTML中的特殊字符,就需要進(jìn)行編碼,比如“<”編碼為“<”,空格符“ ”編碼為“ ”等等。
例如:
<%=Server.HTMLEncode("The paragraph tag: <P>") %>
輸出結(jié)果為:
The paragraph tag: <P>
瀏覽器解釋處理后,顯示::
The paragraph tag: <P>
1.2.3.2.3. MapPath
MapPath方法主要用來(lái)把服務(wù)器上的相對(duì)路徑或虛擬路徑轉(zhuǎn)化為絕對(duì)路徑。
調(diào)用方法:Server.MapPath(path)。
如果path中以“/”或“\”開(kāi)始,則將path作為虛擬路徑的全路徑取結(jié)果返回。
1.2.3.2.4. Transfer
Session.Transfer將把當(dāng)前ASP文件已經(jīng)裝配的信息發(fā)送到另外的ASP中,并將結(jié)果組合輸出。
例如test.asp內(nèi)容為:
<HTML><BODY><%
Dim sessvar1
Response.Write Session.SessionID
Response.Write ("<BR>")
Response.Write ("I am going to ASP2 <BR>")
Server.Transfer("test2.asp")
%>
Test2.asp的內(nèi)容為:
<% Response.Write Session.SessionID %></BODY></HTML>
以上代碼中Response.Write為發(fā)送信息到瀏覽器,請(qǐng)查閱Response對(duì)象相關(guān)描述。通過(guò)URL訪問(wèn)test.asp,將組合以下結(jié)果(鼠標(biāo)右鍵單擊瀏覽器,然后查看源代碼):
<HTML><BODY>214636745<BR>I am going to ASP2
<BR>214636745</BODY></HTML>
在瀏覽器中顯示如圖1.2.3.2.4-1所示:
(圖1.2.3.2.4-1)
1.2.3.2.5. URLEncode
Server.URLEncode可以對(duì)一個(gè)字符串進(jìn)行URL編碼,通常情況下我們用來(lái)組合一個(gè)鏈接,轉(zhuǎn)換其中的特殊字符(比如空格、漢字等)。
1.2.3.3. 應(yīng)用
關(guān)于服務(wù)器資源的訪問(wèn),使用Server是當(dāng)仁不讓。通過(guò)開(kāi)發(fā)COM,通過(guò)Server.CreateObject調(diào)用,既掩蓋了業(yè)務(wù)邏輯,又充分發(fā)揮ASP環(huán)境的優(yōu)勢(shì)。
1.2.4. Request對(duì)象
1.2.4.1. 集合
1.2.4.1.1. Cookies
如果對(duì)Web有所了解,就應(yīng)該知道,在客戶端如果沒(méi)有特殊的ActiveX支持的話,客戶端的腳本不可能訪問(wèn)客戶端資源。有些時(shí)候,我們希望用戶登錄一個(gè)網(wǎng)站后就記錄某些信息,比如以什么賬號(hào)登錄的,在關(guān)閉再打開(kāi)瀏覽器后,這些信息依然存在,并且不需要再次登錄。這個(gè)時(shí)候可以利用瀏覽器管理的Cookies來(lái)簡(jiǎn)單實(shí)現(xiàn)。
Cookies的資源空間很小,所以不可能把所有信息都存放到Cookies中,并且由于存放于客戶端,還會(huì)涉及到安全性的若干問(wèn)題。
Request.Cookies(key)可以返回關(guān)于key的值,或者是一個(gè)字典(dictionary),如果需要判斷它返回的是值還是字典,可以通過(guò)調(diào)用Request.Cookies(key).HasKeys的返回值來(lái)判斷,True表示為字典,F(xiàn)alse表示為值。
<%=Request.Cookies("myCookie").HasKeys %>
1.2.4.1.2. Form
我們知道在HTML的標(biāo)記中就有<form>標(biāo)記,通常我們會(huì)看到這樣的HTML代碼:
<form method=”P(pán)OST” action=”dologin.asp”>
<p align=”center”>賬號(hào):<input type=”text” name=”LoginUser” /></p>
<p align=”center”>口令:<input type=”password” name=”LoginPWD” /></p>
<p align=”center”><input type=”submit” value=”提交”/> <input type=”reset” value=”重寫(xiě)” /></p>
</form>
在網(wǎng)頁(yè)上顯示需要我們輸入賬號(hào)與密碼,然后點(diǎn)擊“提交”按鈕就會(huì)把數(shù)據(jù)提交到dologin.asp處理,這個(gè)時(shí)候dologin.asp中就可以通過(guò)調(diào)用Request.Form(“LoginUser”)與Request.Form(“LoginPWD”)來(lái)得到客戶端用戶輸入的相應(yīng)賬號(hào)與口令。
您好,<%=Request.Form("LoginUser") %>,<br>
您輸入的口令為:<%= Request.Form("LoginPWD") %>。<br>
但是并非所有的<form>標(biāo)記提交到服務(wù)器的都可以用Request.Form來(lái)得到相應(yīng)的值,這還需要看<form>標(biāo)記中method的值是否是”P(pán)OST”,如果是則可以,否則不行。比如,method的值為”GET”,則等同于通過(guò)URL編碼來(lái)請(qǐng)求服務(wù)器頁(yè)面;假設(shè)在賬號(hào)只能中輸入了“test”,口令中輸入了“123”,則URL將為:
http://localhost/dologin.asp?LoginUser=test&LoginPWD=123
這個(gè)是否,服務(wù)器中則需要通過(guò)Request.QueryString來(lái)獲取相應(yīng)LoginUser與LoginPWD的值了。
1.2.4.1.3. QueryString
Request.QueryString同Request.Form類(lèi)似,如上節(jié)所述,如果<form>標(biāo)記中method的值為”GET”或者通過(guò)地址來(lái)輸入U(xiǎn)RL,則用Request.QueryString來(lái)得到相應(yīng)值。
URL中ASP腳本“?”后面部分為通過(guò)URL傳遞的數(shù)據(jù)部分,以符號(hào)“&”來(lái)分隔,每一部分鐘中,等號(hào)前面可以成為關(guān)鍵字(Key),等號(hào)后面的部分為相應(yīng)的值,很多情況下,值這一部分是經(jīng)過(guò)Server.URLEncode編碼后的,Request.QueryString得到相應(yīng)的值時(shí)就已經(jīng)自動(dòng)解碼了,所以Server對(duì)象中根本不需要提供解碼函數(shù)。
比如上節(jié)中的URL,對(duì)應(yīng)dologin.asp應(yīng)該這樣實(shí)現(xiàn):
您好,<%=Request.QueryString("LoginUser") %>,<br>
您輸入的口令為:<%= Request.QueryString("LoginPWD") %>。<br>
1.2.4.1.4. ServerVariables
ServerVariables集合用來(lái)返回所有已確定的環(huán)境變量的值。這些都是跟這次客戶端連接相關(guān)的變量。比如Request.ServerVariables(“LOCAL_ADDR”)返回服務(wù)器IP地址;Request.ServerVariables(“REMOTE_ADDR”)客戶端IP地址等等。詳細(xì)的列表說(shuō)明請(qǐng)查看“http://localhost/iishelp/iis/htm/asp/vbob5vsj.htm”。
1.2.4.2. 屬性
1.2.4.2.1. TotalBytes
TotalBytes返回客戶端發(fā)送的請(qǐng)求主體的字節(jié)數(shù)。
通常情況下,TotalBytes屬性跟Request.BinaryRead方法結(jié)合使用,以得到客戶端發(fā)送來(lái)的二進(jìn)制數(shù)據(jù)流。
1.2.4.3. 方法
1.2.4.3.1. BinaryRead
BinaryRead方法用來(lái)得到客戶端通過(guò)POST方法提交到服務(wù)器的數(shù)據(jù),然后存放到SafeArray中。SafeArray是包含維數(shù)及范圍的數(shù)組。
注意,一旦您使用了BinaryRead方法,再使用Request.Form來(lái)獲取相應(yīng)關(guān)鍵字變量的值就會(huì)出錯(cuò),Request.BinaryRead的使用方法如下:
<%
Dim vntPostedData, lngCount
lngCount = Request.TotalBytes
vntPostedData = Request.BinaryRead(lngCount)
%>
1.2.4.4. 應(yīng)用
通過(guò)訪問(wèn)Request對(duì)象,您可以得到客戶端代理得到客戶端的所有信息。
1.2.5. Response對(duì)象
1.2.6. 集合
1.2.6.1. Cookies
Response.Cookies用來(lái)向客戶端設(shè)置相應(yīng)的Cookie,設(shè)置方法為:
<% Response.Cookies("myCookie") = "Hello World!" %>
1.2.7. 屬性
1.2.7.1. Buffer
Response.Buffer用來(lái)標(biāo)識(shí)向客戶端發(fā)送的內(nèi)容是否緩存,F(xiàn)alse為不緩存,True為緩存。IIS4.0及以下版本默認(rèn)為False,IIS5中默認(rèn)為T(mén)rue。
當(dāng)Response.Buffer設(shè)置為緩存時(shí),輸出內(nèi)容一直等到整個(gè)ASP頁(yè)處理完畢,或者調(diào)用了Response.Flush或Response.End方法后才發(fā)送至客戶端。
1.2.7.2. Charset
Response.Charset用來(lái)向返回內(nèi)容的頭部添加字符集信息,例如簡(jiǎn)體中文字符集“GB2312”。
<% Response.Charset= "GB2312" %>
1.2.7.3. ContentType
Response.ContentType用來(lái)指出返回客戶端的內(nèi)容類(lèi)型,例如HTML類(lèi)型“text/html”,純文本類(lèi)型“text/plain”,JPEG圖片類(lèi)型“image/JPEG”等等。
<% Response.ContentType = "image/JPEG" %>
1.2.7.4. Expires
Response.Expires指出當(dāng)前網(wǎng)頁(yè)經(jīng)過(guò)多少時(shí)間后網(wǎng)頁(yè)過(guò)期,單位“分鐘”。IIS會(huì)根據(jù)給出的過(guò)期數(shù)值添加到HTTP頭中。但由于服務(wù)器時(shí)間與客戶端時(shí)間的不一致,例如時(shí)區(qū)的原因,或者哪個(gè)出了問(wèn)題,設(shè)置Response.Expires=0,將不會(huì)達(dá)到網(wǎng)頁(yè)立即過(guò)期的效果,相反您可以通過(guò)設(shè)置Response.ExpireAbsolute來(lái)達(dá)到立即過(guò)期的目的。更好的方式是設(shè)置Response.Expires為一個(gè)負(fù)數(shù),例如:
<% Response.Expires=-1 %>
也可使網(wǎng)頁(yè)立即過(guò)期。
1.2.7.5. ExpiresAbsolute
Response.ExpiresAbsolute通過(guò)設(shè)置具體的日期和時(shí)間來(lái)達(dá)到過(guò)期的效果。如果僅指定日期而沒(méi)有指示時(shí)間,網(wǎng)頁(yè)將在指定日期的午夜12:00過(guò)期;如果僅指定時(shí)間而不指定日期,網(wǎng)頁(yè)將在腳本運(yùn)行的當(dāng)天那個(gè)時(shí)間過(guò)期。
<% Response.ExpiresAbsolute=#May 31,2004 11:11:11# %>
上例將使網(wǎng)頁(yè)在2004年5月31日11點(diǎn)11分11秒過(guò)期。
1.2.8. 方法
1.2.8.1. AddHeader
AddHeader方法可以在發(fā)送的HTTP數(shù)據(jù)中添加相應(yīng)的頭信息。
下例將強(qiáng)迫客戶端使用基本驗(yàn)證方式:
<% Response.Addheader "WWW-Authenticate", "BASIC" %>
1.2.8.2. BinaryWrite
Response.BinaryWrite將通過(guò)HTTP向客戶端發(fā)送二進(jìn)制流。我們時(shí)常用它來(lái)提供軟件下載,組合圖片顯示等。
1.2.8.3. Clear
當(dāng)Response.Buffer=True時(shí),通過(guò)調(diào)用Response.Clear可以清除發(fā)送緩沖區(qū)中的所有內(nèi)容。當(dāng)Response.Buffer設(shè)置為False時(shí),調(diào)用Response.Clear將出現(xiàn)錯(cuò)誤。
1.2.8.4. End
通過(guò)調(diào)用Response.End可以終止當(dāng)前服務(wù)器腳本的執(zhí)行,并將結(jié)果發(fā)送客戶端。
1.2.8.5. Flush
Response.Flush將在Reponse.Buffer為T(mén)rue時(shí)發(fā)送緩沖區(qū)中的數(shù)據(jù)。如果Response.Buffer=False,調(diào)用Reponse.Flush將出錯(cuò)。
1.2.8.6. Redirect
調(diào)用Reponse.Redirect將跳轉(zhuǎn)至另外的URL地址。如果已經(jīng)發(fā)送HTML信息到客戶端,調(diào)用此方法將出現(xiàn)錯(cuò)誤。下例將跳轉(zhuǎn)至“CSDN”:
<% Response.Redirect “http://www.csdn.net” %>
1.2.8.7. Write
Response.Write方法將發(fā)送指定字符串到客戶端。
<% Response.Write “Hello World!” %>
1.2.9. 應(yīng)用
Reponse對(duì)象就是用來(lái)向客戶端發(fā)送信息的,它不僅可以發(fā)送一般的HTML信息,同樣,通過(guò)指定HTTP頭,或者設(shè)置Response.ContentType屬性,然后調(diào)用Response.BinaryWrite方法返回任何形式的內(nèi)容,圖片、各種文檔等等。所以我們可以實(shí)現(xiàn)計(jì)數(shù)器、文件下載等,然后稍加結(jié)合我們還可以實(shí)現(xiàn)文件下載并計(jì)數(shù),只有你想不到的,沒(méi)有你做不到的。
1.3. Global.asa文件
我們僅對(duì)Application和Session相應(yīng)事件加以描述。
1.3.1. Application事件
1.3.1.1. Application_OnStart
當(dāng)啟動(dòng)Web服務(wù)后,第一個(gè)客戶端通過(guò)瀏覽器訪問(wèn)您的網(wǎng)站時(shí),將首先觸發(fā)Application_OnStart事件,因?yàn)檫@個(gè)時(shí)候可能需要您在公共內(nèi)存區(qū)域中預(yù)先定義一些Application變量,或者預(yù)先訪問(wèn)一些服務(wù)器資源。
<SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server>
Sub Application_OnStart
. . .
End Sub
</SCRIPT>
1.3.1.2. Application_OnEnd
由于您在Application_OnStart很有可能就聲明了Application變量來(lái)存儲(chǔ)COM對(duì)象等等,如同面向?qū)ο蟮木幊桃粯,您的網(wǎng)站的析構(gòu)函數(shù)就是Application_OnEnd。當(dāng)所有客戶端斷開(kāi)連接并會(huì)話結(jié)束,將觸發(fā)Application_OnEnd。
<SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server>
Sub Application_OnEnd
. . .
End Sub
</SCRIPT>
1.3.2. Session事件
1.3.2.1. Session_OnStart
當(dāng)客戶端連接上服務(wù)器時(shí),服務(wù)器端必然需要?jiǎng)?chuàng)建新的客戶端代理來(lái)響應(yīng)客戶端請(qǐng)求,創(chuàng)建新的客戶端代理后就會(huì)觸發(fā)Session_OnStart事件。
<SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server>
Sub Session_OnStart
. . .
End Sub
</SCRIPT>
1.3.2.2. Session_OnEnd
當(dāng)客戶端調(diào)用的服務(wù)器腳本中顯式地調(diào)用了Session.Abandon方法或者客戶端超過(guò)了Session.Timeout的時(shí)間被動(dòng)的會(huì)話終止,在會(huì)話終止前Session_OnEnd將被觸發(fā)。
<SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server>
Sub Session_OnEnd
. . .
End Sub
</SCRIPT>
1.3.3. 應(yīng)用
根據(jù)Application與Session事件的特點(diǎn),我們可以初始化全局公共的Application變量,或者僅當(dāng)前客戶端的私有環(huán)境變量。比如,我們可以通過(guò)一個(gè)Application變量Application(“ClientCount”)來(lái)記錄連接到服務(wù)器的客戶端總數(shù),然后,每次Session_OnStart時(shí),Application(“ClientCount”)增加一個(gè),Session_OnEnd時(shí),Application(“ClientCount”)減1,這樣就可以比較準(zhǔn)確的記錄客戶端總數(shù)。
<Script Language=VBScript RUNAT=Server>
Sub Application_OnStart
Application(“ClientCount”)=0
‘其他代碼
End Sub
Sub Application_OnEnd
Application(“ClientCount”)=0 ‘僅為示范用,表示復(fù)原之意
‘其他代碼
End Sub
Sub Session_OnStart
Application.Lock
Application(“ClientCount”)=Application(“ClientCount”)+1
Application.UnLock
End Sub
Sub Session_OnEnd
Application.Lock
Application(“ClientCount”)=Application(“ClientCount”)-1
Application.UnLock
End Sub
</Script>
是的,就這么簡(jiǎn)單。
1.4. 關(guān)于COM的簡(jiǎn)單說(shuō)明
由于ASP的功能主要通過(guò)COM來(lái)擴(kuò)展,我們只好再啰嗦幾句,通過(guò)FSO的對(duì)象,可以實(shí)現(xiàn)基本的文件訪問(wèn);通過(guò)創(chuàng)建ADO我們可以訪問(wèn)各式各樣的數(shù)據(jù)庫(kù);通過(guò)MSXML我們實(shí)現(xiàn)XML的各種操作。它們的詳細(xì)幫助說(shuō)明都包含各自得SDK中,MSDN也可以找到。
一個(gè)網(wǎng)站,關(guān)鍵在于您想怎么實(shí)現(xiàn),思路很重要,剩余的就慢慢查閱資料吧。比如您可以創(chuàng)建一個(gè)XML架構(gòu)的網(wǎng)站,通過(guò)組織數(shù)據(jù)為自定義的XML格式,然后以不同XSL實(shí)現(xiàn)不同的用戶客戶端,既可起到模版的作用,又可實(shí)現(xiàn)數(shù)據(jù)的過(guò)濾(不需要的東西,通過(guò)XSL的處理將不發(fā)送到客戶端)。關(guān)于最新的MSXML,請(qǐng)到微軟的站點(diǎn)下載。
1.5. 關(guān)于.Net
自從有了.Net以后,學(xué)習(xí)新語(yǔ)言的浪潮可謂一浪高過(guò)一浪,然而在應(yīng)用一門(mén)新的語(yǔ)言前,人們首先應(yīng)該強(qiáng)調(diào)的是語(yǔ)言的熟悉程度,發(fā)揮不了新語(yǔ)言的特長(zhǎng)就沒(méi)有必要采用新的語(yǔ)言。
ASP.Net環(huán)境也是如此,如果您對(duì)DHTML、CSS、HTC、ASP、XML等等都非常熟悉,那么學(xué)習(xí)ASP.Net也會(huì)輕車(chē)熟路。不妨先學(xué)習(xí)學(xué)習(xí)ASP,畢竟它很簡(jiǎn)單。