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