Asp(Active Server Page)的語言特性 (轉)

gugu99發表於2008-03-20
Asp(Active Server Page)的語言特性 (轉)[@more@](Active Server Page)的語言特性 源於靜態文字,現在很多站點幾乎還是採用這種方式。靜態文字的缺點就是維護難(數目多)、查詢難、修改難。雖然可以採用FrontPage對站點進行管理,但這只是其中的一個辦法。現在,很多的站點都會在後臺採用,動態生成超文字。這樣,要改變式樣,只需修改幾個檔案;要變更內容,只需對資料庫進行操作即可,而且易於保持致性;而對於全文檢索等查詢應用,這種方式的優越性更為突出。(經常說的“動態” 也包括圖片的動態顯示,如動態GIF、 Applet等,本文所指為資料的動態性)通用閘道器介面CGI(Common Gateway Interface)和應用介面IS(Inte Server Application Programming Interface)與其他相關技術的出現,使我們能夠方便地與Web Server進行溝通,從而象一些計數器、留言版等CGI程式相繼出現並蔚然成風。但這些CGI程式都有一個很大的缺點,就是CGI(可用VB、Java、、C或Dephi等編寫)與html只能分開編寫、分開執行,要將兩者融合在一起並不 容易,從而導致維護與編寫都相當困難。因此,一些廠商後來都推出了自己的Script語言,來增強網頁開發的功能。其中推出了(for client端和for Server端兩種);則推出了和Asp(Asp的語法與VB的語法類似)兩種,也用於伺服器端和客戶端程式的編寫。對於專業開發人員而言,客戶端程式的最重要的一點是通用性,而伺服器端的則強調功能和。對於Client端程式的開發,JavaScript無疑是最佳的,因為當今兩大主流IE和Netscape都宣稱支援該標準;而VBScript則只有IE才能支援。但令我們苦惱的是對某些JavaScript的標記,IE或IE的某些版本並不一定會支援,這必導致我們不得不把一部分程式移到伺服器端去,因為伺服器端的程式會先解釋生成html(或含)文字,再送到客戶端,故不存在相容問題。

   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,而直接採用.0生成的ActiveX控制元件,因為是編譯執行的,故速度較快,不過這是後話。

  

  1.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.1 Request

  Asp依然遵從流行的、利用客戶端的Form進行資料的方法。Asp內建的request物件擁有五個獲取客戶端資料的方法(QueryString/Form//ServerVariables/ClientCertificate)。

  語法:request.方法名稱("引數")|request("引數")

  如果採用後者,會自動選擇相應的方法。

   1.1.1 Fo

   在這裡再重新強調Form的一些屬性:

  

   Enctype=資料傳送的MIME形態

   Method=傳送資料的方式Get/Post

   Onrest=按下rest鍵呼叫的程式

   Onsubmit=按下sumit鍵呼叫程式

   Target=輸出內容的frame視窗>

   使用Form傳送資訊一般有三種方式:由html網頁內的Form傳資訊給其他Asp;由Asp內的Form傳資訊給另外一個Asp;Asp內的資訊傳送給自身。

   語法:Request.Form(引數)[()]

   其中參數列示Form中元素的名稱,索引表示相同名稱元素的順序號。

   例:

  

   For I=1 To Request.Form("user").Count

   Response.Write Request.Form("user")(I)

   Next

   %>

  可迴圈讀取名稱為user的元素,其中Count是Form的系統屬性,用於計算同名元素的個數,如果該元素不存在,則其值為零。如果沒有指明要讀取第幾個同名元素,則系統會把全部同名元素的值都讀取出來,並用“,”作間隔。

  例:Request.form("user")=abc,bcd,cde

  

   1.1.2 QueryString

   語法:Request.QueryString(引數)[(索引)]

  除了用Form傳輸資料外,還可透過在超連結後接“?”的方式傳輸資訊,如:,這時可透過Request.QueryString("user")讀取傳輸的資訊;如果出現多個重名的引數,如:,則第一次Resquest.QueryString("user")=abc,第二次Resquest.QueryString("user")=bcd,第三次Resquest.QueryString("user")=cde。

  

   1.1.3 ServerVariables

   語法:ServerVariables(引數名稱)

   我們知道Web/Browse的傳輸是http,http的報頭會有一些客戶端的資訊,如

  客戶、瀏覽器的語言系統等。這時可透過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_NT 發出request的使用者名稱(如是撥號上網,則為使用者ID),

   當NCSA IdentityCheck為enabled,而且client機器支援

   931時,該變數有效。

   CONTENT_TYPE 資料的MIME型別,如:“text/html”。

   HTTP_ACCEPT client可以接受的MIME型別列表。

   HTTP_USER_AGENT client發出request的瀏覽器型別。

   HTTP_REFERER 在讀取CGI程式之前,client所指的文字URL。

  

   1.1.4 Cookies

  在客戶端,Cookies記錄了客戶端瀏覽器很多的資訊,我們可透過Request.Cookies("名稱")命令獲取它的值,也可透過Response.Cookies("名稱")="值"在客戶端記錄一些資訊,以便控制訪問者。設定多重Cookies的方法為Response.Cookies("名稱")("名稱")="值"。

  

   1.1.5 Cache

   我們可以在瀏覽器上設定從Cache中抽取已經訪問過的頁面的資訊,同樣,在Asp程式中也可進行類似的設定。其中Response.Clear為清空客戶端的。Response.Buffer=True設定可從Cache中讀取資料(預設時為False)。

  

   1.1.6 ClientCertificate

   ClientCertificate用於獲取客戶端瀏覽器的身份確認資訊(符合X.509標準),但

  客戶端瀏覽器必須支援3.0或PCT1協議。這裡需做兩步工作,第一步:web server必須啟動使用者端選項;第二步:對客戶端瀏覽器進行相應設定,這樣,該方法才會生效,否則,傳回empty值。

  

  1.2 Response

   當要從伺服器傳送資料到客戶端時,可透過下面的方法:

   1)Response.Write直接輸出資訊,如Response.write ""。

   2)Response.Redirect引導客戶端到另一個url位置,如Response.Redirect "",但這裡有一個問題需要注意,就是該語句一定要放在標記前執行,也就是說在伺服器未向客戶端送出html文字報頭前就要被執行,否則會出現傳輸錯誤資訊。

  3)Response.ContentType控制輸出的檔案型別,伺服器送給客戶端的資料包型別可以是text/html文字,也可以是gif/jpeg圖形檔案,所以每次傳輸前,我們都必須告知客戶端將要傳輸的檔案型別,一般預設情況下為“Text/Html”型別。例如。

  4)Response.Cookies 用於設定Cookies的值,語法為:Response.cookies(變數名稱)[(key)|屬性]=寫入的資訊。(key的用法前面已作說明,這裡不在敘述)cookies系統預設有五個屬性,包括Expires(時間)、ain(域名)、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資料。

  

   1.3 Server

  Server物件會為你提供一些固定的server端的方法和屬性,包括ScriptTimeout、MapPath和URLEncode等。其中ScriptTimeout是server的屬性,可規定一個asp程式執行的最長時間,如:server.scripttimeout=200(計數單位為秒,預設時為90秒)。

  MapPath是server的一個方法,用於把web server的虛擬路徑轉換為實際路徑。如server.mappath("/")=c:inetpubwww,對於路徑引數“/”和“”,Asp都會視為一樣。在這裡有一點要注意的是,系統只是對應web server的真實根目錄輸出結果,而不會去檢查檔案系統中是否真的存在這樣一個目錄。

   URLEncode是server的另外一個方法,該方法會根據URL編碼原則,把源字串編

  碼為目標字串,其中空白的字元用“+”代替。

  

   1.4 Session

   Session是asp中一個非常重要的物件,在用一些傳統的語言時,都會涉及到變數是定義為全域性變數還是區域性變數這個問題。但在Internet上的開發卻很少提及這個問題(Java除外),因為每一個html頁面都是非相關的,傳輸完畢後,全部連結都會斷開。在asp中則不一樣,我們可以定義一些全域性變數,這裡的全域性是指在當前瀏覽器沒有被關閉前都可以被使用。這些變數可以在Global.asa中進行定義。如果你的Web應用程式是用InterDev自動建立的,則會在根目錄找到該檔案;如果不是則可自行建立。

   語法:session.屬性|方法

   一般建立新的session物件都是採用set關鍵字,如

  

   1.5 Application

   Global.asa是用於定義session、application和object物件的一個檔案,客戶端是不能看到該檔案的。但該檔案一定要放在程式的根目錄上,而且文字中不能有html標記並且檔名不能改動。下面是一個Global.asa文字的範例。

  

</P> <P>  Sub Session_OnStart </P> <P>   '==Visual InterDev Generated - DataConnection startspan== </P> <P>   '--Project Data Connection </P> <P>  Session("nnb_ConnectionString") = "DSN=***;UID=zyr;APP= (R) Developer </P> <P>   Studio;WSID=ZYR;DATABASE=***" </P> <P>  Session("nnb_ConnectionTimeout") = 15 </P> <P>  Session("nnb_CommandTimeout") = 30 </P> <P>  Session("nnb_RuntimeUserName") = "zyr" </P> <P>  Session("nnb_RuntimePass") = "******" </P> <P>  '==Visual InterDev Generated - DataConnection endspan== </P> <P>  End Sub </P> <P>  

   Application與session的區別在於,網上的使用者都可以使用Application的物件,因而是需要加鎖的;而session只是針對一個客戶而已。如定義一個Application變數為Application("name")="1234"。

   Asp的功能僅此而已?當然不是,Asp更高階的應用還包括它內建有一些ActiveX控制元件和可呼叫其它的控制元件等功能,暫不在本文討論。如果希望獲取更多的資訊,可以訪問下面的站點:

  

  

  

  

  2.Asp的程式設計例項

  為了使大家對上面提到的功能有一個感性的認識,下面我們將以一個非常簡單的用asp編寫的chatroom(交談室)作為例子。為了儘量簡化,我們這裡只採用四個檔案,一個是主檔案main.asp和enter.asp(讓使用者輸入使用者名稱),一個是資料輸入檔案input.asp,一個是顯示檔案show.asp。原理是定義一個application變數show,然後每次有人說話,我們都把它加到前面;另外顯示檔案show.asp每三秒鐘重新整理一次,用於顯示show變數.全部工作僅此而已,用其它語言或方法可能需要更復雜的工作,在這裡則變得非常簡單和明瞭。(這裡沒有使用Global.asa檔案。)

  

  2.1 main.asp檔案

  

  if session("sname")="" then

   response.redirect "enter.asp"

  end if

  ;如果使用者沒有輸入名字,則將重新回到名字輸入介面

  %>

  

  

  

  

  

  

  

  

This page uses frames, but your browser doesn't support them.

  

  

  

  

  

  2.2 enter.asp檔案

  

  nickname=request.form("nickname")

  ;讀取使用者輸入的名字

  if nickname="" then

   msg=msg+"請輸入您的名稱
"

  else

   response.cookies("whoami")=nickname

  ;把使用者名稱字寫到cookies中

   application.lock

   application("show")="

" _

  &"

來至" & request.servervariables("remote_addr") _

  & "的" & request.cookies("whoami") & "大駕光臨...

" _

  & application("show")

  ; _是分隔符,與VB一樣

   application.unlock

   session("sname")=nickname

   response.redirect "main.asp"

  end if

  %>

  

  

  

   你的姓名:

  

  

  

  

  

  

  2.3 show.asp檔案

  

  

  

  ;設定每三秒鐘重新整理一次

  

  

聊天的內容

  

  

  

  

  

  

   2.4 input.asp檔案

  

  mytalk=trim(request.form("txtbox"))

  ;讀取使用者寫的資訊,trim用於去掉後面的空格

  application.lock

  application("show")="" & request.cookies("whoami") & _

   ":" & mytalk & "
" & application("show")

  ;把新的資訊新增到application變數show的前面,其中request.cookies("whoami")是從

  ;cookies中讀出該使用者的名字。

  application.unlock

  %>

  

  

  

  

  

輸入介面

  

  

  

  

  

   輸入:

  

  

  

  


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1001208/,如需轉載,請註明出處,否則將追究法律責任。

相關文章