asp 內建對象request和respones
web源於靜態文本,現在很多站點幾乎還是採用這種方式。靜態文本的缺點就是維護難(文件數目多)、查詢難、修改難。雖然可以採用frontpage對站點進行管理,但這只是其中的一個辦法。現在,很多的站點都會在後台採用數據庫,動態生成超文本。這樣要改變式樣,只需修改幾個文件;要變更內容,只需對數據庫進行操作即可,而且易於保持一致性;而對於全文檢索等查詢應用,這種方式的優越性更為突出。 (經常說的“動態”也包括圖片的動態顯示,如動態gif、java applet等,本文所指為資料的動態性)
通用網關界面cgi(common gateway interface)和網絡服務器應用程序界面isapi(internet server application programming interface)與其他相關技術的出現,使我們能夠方便地與web server進行溝通,從而像一些計數器、留言版等cgi程式相繼出現並蔚然成風。
但這些cgi程序都有一個很大的缺點,就是cgi(可用vb、java、perl、c或dephi等編寫)與html只能分開編寫、分開運行,要將兩者融合在一起並不容易,從而導致維護與編寫都相當困難。因此,一些廠商後來都推出了自己的script語言,來增強網頁開發的功能。其中netscape推出了javascript(for client端和for server端兩種);微軟則推出了vbscript和asp(asp的語法與vb的語法類似)兩種,也用於服務器端和客戶端程序的編寫。對於專業開發人員而言,客戶端程序的最重要的一點是通用性,而服務器端的則強調功能和效率。對於client端程序的開發,javascript無疑是最佳的,因為當今兩大主流瀏覽器ie和netscape都宣稱支持該標準;而vbscript則只有ie才能支持。但令我們苦惱的是對某些javascript的標記,ie或ie的某些版本並不一定會支持,這必導致我們不得不把一部分程序移到服務器端去執行,因為服務器端的程序會先解釋生成html(或含activex)文本,再送到客戶端,故不存在兼容問題。
livewire(javascript for server端的編譯器)和asp一樣,都是一些手稿語言(手稿是指類似client端的javascript一樣的、可嵌套在html文本里面、只需用標記標明是由服務器執行的程序段) ,也就是類似c/c++一樣的面向對象的語言。 livewire的文件後綴名還是html,asp的文件後綴名則是asp,因為asp的文件在客戶讀取它的時候,服務器才進行解釋,而livewire的文件則必須預先進行編譯(每次修改後,都要重新編譯)。 asp有相應的輔助開發工具(interdev),可代為生成一些控件。當然,這些並不重要,關鍵是你採用的是netscape web server還是微軟的iis。但就一般而言,因為iis是捆綁在nt上的,故採用iis的用戶會偏多一些。
自從netscape公司推出了livewire和微軟推出了active server page以後,程序員編寫網上程序就方便和容易了很多。但這種script類的語言有一個共同的缺點,那就是由於是解釋執行的,故速度不會太快。最近,微軟建議採用三層模型,中間層可以不用asp,而直接採用vb6.0生成的activex控件,因為是編譯執行的,故速度較快,不過這是後話。
一、asp的基本對象
asp(active server page)是一種類似於vb的面向對象的程序語言。在這裡並不想詳述對像等一些基本概念,而是直接介紹其語言特性,以便開發人員能夠熟練地對asp程序進行修改和編制(因為很多人都只是直接利用開發工具如interdev來生成asp程序) 。
首先,asp程序的存檔名稱肯定是“asp”;其次,在asp程序裡面,服務器端的script要放在字符串中間,例如。如果你想在一個asp文件中調用另一個asp文件,則可在asp中加上下面的聲明: < ! -- #include virtual|file=***.asp -- >,這有些象c語言中的#include。其中,virtual表示虛擬文件路徑,file表示真實文件路徑。
asp有五個主要的內建對象:request、response、server、session、application,下面將分別舉例對其進行說明。
1、request
asp依然遵從流行的、利用客戶端的form進行數據交換的方法。 asp內建的request對象擁有五個獲取客戶端資料的方法(querystring/form/cookies/servervariables/clientcertificate)。
語法:request.方法名稱(參數)|request(參數)
如果採用後者,系統會自動選擇相應的方法。
form
這裡再重新強調form的一些屬性:
enctype=資料傳送的mime形態
method=傳送資料的方式get/post
onrest=按下rest鍵調用的程序
onsubmit=按下sumit鍵調用程序
target=輸出內容的frame窗口>
使用form傳送信息一般有三種方式:由html網頁內的form傳信息給其他asp;由asp內的form傳信息給另外一個asp;asp內的信息傳送給自身。
語法:request.form(參數)[(索引)]
其中參數表示form中元素的名稱,索引表示相同名稱元素的順序號。
例:
可循環讀取名稱為user的元素,其中count是form的系統屬性,用於計算同名元素的個數,如果該元素不存在,則其值為零。如果沒有指明要讀取第幾個同名元素,則係統會把全部同名元素的值都讀取出來,並用“,”作間隔。
例:request.form(user)=abc,bcd,cde
2、querystring
語法:request.querystring(參數)[(索引)]
除了用form傳輸資料外,還可通過在超鏈接後接“?”的方式傳輸信息,如:,這時可通過request.querystring(user)讀取傳輸的信息;如果出現多個重名的參數,如:,則第一次
resquest.querystring(user)=abc,第二次
resquest.querystring(user)=bcd,第三次
resquest.querystring(user)=cde。
3、servervariables
語法:servervariables(參數名稱)
我們知道web/browse的傳輸協議是http,http的報頭會有一些客戶端的信息,如
客戶ip地址、瀏覽器的語言系統等。這時可通過request.servervariables(***)獲取相關信息,如request.servervariables(accept_language)可獲取客戶端瀏覽器的語系。其他系統參數見下表:
server_name server的機器名稱或ip地址。
server_port server正在運行的端口號
request_method 發出request的方法(get/post/head
script_name 程序被調用的路徑,如:cgi-bin/a.pl。
remote_host 發出request請求的遠端機器(client)的名稱。
remote_addr 發出request請求的遠端機器(client)的ip地址。
remote_ident 發出request的使用者名稱(如是撥號上網,則為用戶id),當ncsa identitycheck為enabled,而且client機器支持rfc 931時,該變量有效。
content_type 數據的mime類型,如:“text/html”。
http_accept client可以接受的mime類型列表。
http_user_agent client發出request的瀏覽器類型。
http_referer 在讀取cgi程序之前,client所指的文本url。
4、cookies
在客戶端,cookies記錄了客戶端瀏覽器很多的信息,我們可通過request.cookies(名稱)命令獲取它的值,也可通過response.cookies(名稱)=值在客戶端記錄一些信息,以便控制訪問者。設置多重cookies的方法為response.cookies(名稱)(名稱)=值。
5、cache
我們可以在瀏覽器上設置從cache中抽取已經訪問過的頁面的信息,同樣,在asp程序中也可進行類似的設置。其中response.clear為清空客戶端的內存。 response.buffer=true設置可從cache中讀取資料(缺省時為false)。
6、clientcertificate
clientcertificate用於獲取客戶端瀏覽器的身份確認信息(符合x.509標準),但客戶端瀏覽器必須支持ssl3.0或pct1協議。這裡需做兩步工作,第一步:web server必須啟動用戶端認證選項;第二步:對客戶端瀏覽器進行相應設置,這樣,該方法才會生效,否則,傳回empty值。
2、response
當要從服務器傳送資料到客戶端時,可通過下面的方法:
1)response.write直接輸出信息,如response.write 。
2)response.redirect引導客戶端到另一個url位置,如response.redirect http://zyr.yeah.net,但這裡有一個問題需要注意,就是該語句一定要放在標記前執行,也就是說在服務器未向客戶端送出html文本報頭前就要被執行,否則會出現傳輸錯誤信息。
3)response.contenttype控制輸出的文件類型,服務器送給客戶端的數據包類型可以是text/html文本,也可以是gif/jpeg圖形文件,所以每次傳輸前,我們都必須告知客戶端將要傳輸的文件類型,一般默認情況下為“text/html”類型。
4)response.cookies 用於設置cookies的值,語法為:response.cookies(變量名稱)[(key)|屬性]=寫入的信息。 (key的用法前面已作說明,這裡不在敘述)cookies系統默認有五個屬性,包括expires(時間)、domain(域名)、path(路徑)、secure(安全性)、haskeys(判斷cookies下是否還有其它cookies文本)。
5)response.buffer用於確定是否把信息傳輸到緩衝區。因為有時候我們希望把部分中間信息送到緩衝區,然後繼續工作。當所有處理工作都完成後,才把信息輸出到客戶端。但當在處理過程中flush或end方法被調用,則緩衝區內容將被輸出。
response的其它屬性:
expires:設定網頁保留在客戶端瀏覽器的時間長度。
expiresabsolute:設定網頁保留在客戶端瀏覽器的日期與時間。
response的其它方法:
addheader:設定html文件的http報頭。
appendtolog:在web server記錄檔案末尾,添加字串。
clear:清除在緩衝區中的html輸出資料。
end:停止處理asp檔案,並回傳當時狀態。
flush:立刻送出緩衝區的html資料。