利用 Microsoft Active Server Pages 創(chuàng)建動(dòng)態(tài)、交互式站點(diǎn)
利用微軟的軟件產(chǎn)品 Active Server Pages,通過(guò)在普通頁(yè)面中嵌入的ASP腳本語(yǔ)言,可以幫助建立動(dòng)態(tài)的交互式站點(diǎn),這一點(diǎn)早已是大家所熟知的了,就不用多說(shuō)了.筆者也是初學(xué)ASP 腳本語(yǔ)言編寫,來(lái)談?wù)勛约旱膶W(xué)習(xí)體會(huì),希望能給后學(xué)者一點(diǎn)建議和啟示,更期望引起大家的興趣來(lái)交流探討、共同提高.
一 ASP 與 HTML 相比的優(yōu)點(diǎn) 關(guān)于這方面的論述已經(jīng)很多了,這里就不展開(kāi)討論了.筆者認(rèn)為,ASP與HTML相比,其最大的優(yōu)勢(shì)在于三個(gè)方面: 1.在創(chuàng)建動(dòng)態(tài)、交互式站點(diǎn)方面,其功能強(qiáng)大、處理方式靈活,具體可參見(jiàn)其它歌頌 ASP 功能的文章. 2.由于ASP腳本語(yǔ)言是由服務(wù)端來(lái)解釋和運(yùn)行,動(dòng)態(tài)生成普通的HTML頁(yè)面,然后再傳送到客戶端供瀏覽,因而對(duì)客戶端瀏覽器要求相對(duì)較低,并不要求其必須支持特定的某些腳本語(yǔ)言如JavaScript、JScript、VBScript、Perl等等. 3.由于傳送到客戶端的只是解釋后的HTML頁(yè)面,因而有效地保護(hù)了頁(yè)面開(kāi)發(fā)者的知識(shí)產(chǎn)權(quán).
二 搭建學(xué)習(xí) ASP 的應(yīng)用系統(tǒng)平臺(tái) 關(guān)于這方面的文章也不少,如【計(jì)算機(jī)世界】1998年第38期Internet&Intranet版的一篇文章《自己搭建ASP集成開(kāi)發(fā)環(huán)境》就挺不錯(cuò),目前讀者還保留這篇文章,如果你需要就發(fā)個(gè)Mail過(guò)來(lái)吧.筆者所用的開(kāi)發(fā)平臺(tái)為 Win95 + TCP/IP + PWS + ASP + FrontPage98,其中 FrongPage 不是必須的,可以用其它頁(yè)面開(kāi)發(fā)工具甚至是 NotePad 來(lái)代替.PWS 應(yīng)該容易獲得和安裝,在 Win95 OSR2 及其后的版本中都有;而ASP 則需要在 WinNT 的 IIS 中去找,或在 Visual Interdev 的安裝光盤中去找,實(shí)在找不到就到微軟的站點(diǎn)上去下載一個(gè)吧.
三 建立自己的簡(jiǎn)單ASP頁(yè)面 所謂的ASP頁(yè)面就是在普通的HTML頁(yè)面文件中插入一些特殊的腳本語(yǔ)言并以擴(kuò)展名asp保存后的頁(yè)面,所以可以很容易地建立一個(gè)自己的簡(jiǎn)單的ASP頁(yè)面,體會(huì)一下ASP的入門感覺(jué),同時(shí)獲得點(diǎn)成功的快感以便保持繼續(xù)學(xué)習(xí)下去的興趣. 首先來(lái)學(xué)習(xí)一下ASP腳本語(yǔ)言的簡(jiǎn)單的語(yǔ)法.最基本的的是,在與HTML語(yǔ)言混合使用時(shí)ASP語(yǔ)句是以""<%"為開(kāi)始,以"%>"為結(jié)束的,且必須成對(duì)出現(xiàn).另外,由ASP默認(rèn)的腳本語(yǔ)言是VBScript(設(shè)置其它腳本語(yǔ)言稍后再談),你還應(yīng)該熟悉VBScript的基本語(yǔ)法.有了這些,建立一個(gè)簡(jiǎn)單的ASP頁(yè)面應(yīng)該是沒(méi)有問(wèn)題了. 看看下面的一個(gè)頁(yè)面文件( test1.asp ): <% rem test1.asp %> <html> <head> <title>一個(gè)簡(jiǎn)單的ASP頁(yè)面</title> </head> <body> <p> <h1>下面應(yīng)出現(xiàn)4行語(yǔ)句,字體大小從4到7</h1> <% for i = 4 to 7 %> <br><font size = <% =i %>>這行語(yǔ)句的字體大小為 <% =i %></font> <% next %> </p> </body> </html> 其中,語(yǔ)句 <% =i %> 是將變量 i 的值輸出到HTML文件中.ASP用"<%=變量名%>"將指定變量的內(nèi)容輸出到其生成的HTML頁(yè)面中. 由上可見(jiàn),可以先設(shè)置制作一個(gè)普通的HTML頁(yè)面文件,然后在需要的地方插入ASP腳本語(yǔ)言即可.關(guān)鍵是熟練應(yīng)用ASP腳本語(yǔ)句. 該頁(yè)面雖然簡(jiǎn)單,卻可以幫助熟悉和理解ASP語(yǔ)法.可以用瀏覽器查看運(yùn)行效果,再用其查看源代碼的功能看一下源代碼,可以看對(duì)ASP頁(yè)面解釋后的HTML文件.注意必須用http的方式訪問(wèn)ASP頁(yè)面,不能象HTML頁(yè)面文件那樣雙擊文件名以文件方式瀏覽.如在筆者的計(jì)算機(jī)上的訪問(wèn)方式為 http://wangfajun/aspsamp/test1.asp
四 利用Request對(duì)象制作簡(jiǎn)單的交互頁(yè)面 ASP的內(nèi)建對(duì)象Request中包含了訪問(wèn)者的一些申請(qǐng)信息.可以將這些信息作為某些應(yīng)用(如商業(yè)訂單信息)并對(duì)申請(qǐng)者的申請(qǐng)要求作出反饋. 在我們的這個(gè)例子中,讀者會(huì)員資格注冊(cè)申請(qǐng)頁(yè)面要求申請(qǐng)者填寫其姓名全稱、身份證號(hào)碼、EMail地址.在收到讀者申請(qǐng)后通知其注冊(cè)成功. 先做一個(gè)讀者會(huì)員資格注冊(cè)申請(qǐng)頁(yè)面,可以是HTML頁(yè)面或ASP頁(yè)面.這應(yīng)該不成問(wèn)題. <!-- apply.htm --> <html> <head> <title>讀者會(huì)員資格注冊(cè)申請(qǐng)</title> </head>
<body> <H2>讀者會(huì)員資格注冊(cè)申請(qǐng)</H2>
<form method="post" action="result.asp"> <p> 姓名全稱: <input name="FullName" SIZE="20" value="姓名全稱"> <p> 身份證號(hào)碼: <input name="UniversalID" SIZE="15" value="888888888888888"> <p> 電子郵箱: <input name="Email" value="mailbox@yourcompany.com"> <p><input type=submit value="提交申請(qǐng)"><input type=reset value="重新填寫"> </form>
</body> </html>
在申請(qǐng)頁(yè)面中,所有的申請(qǐng)數(shù)據(jù)均填寫在Form元素中,并且在Form的Action中指定處理申請(qǐng)的頁(yè)面為result.asp.當(dāng)收到申請(qǐng)時(shí),對(duì)應(yīng)項(xiàng)目的數(shù)據(jù)可以由Request.Form("項(xiàng)目名稱")來(lái)獲得,其中"項(xiàng)目名稱"為Form元素的名稱,如"姓名全稱"對(duì)應(yīng)"FullName" ,如"身份證號(hào)碼"對(duì)應(yīng)"UniversalID" .現(xiàn)在利用這些信息來(lái)制作一個(gè)注冊(cè)成功的通知頁(yè)面Result.asp. <% rem result.asp %> <html> <head> <title>讀者會(huì)員資格注冊(cè)申請(qǐng)成功</title> </head>
<body> <p align="center"><H2><font color="green">讀者會(huì)員資格注冊(cè)申請(qǐng)成功</font></H2>
<p>親愛(ài)的<%=Request.Form("FullName")%>讀者:<br> 我們已經(jīng)收到你的申請(qǐng),并接受你的申請(qǐng).你已經(jīng)成為我部正式讀者會(huì)員.<br>你的讀者號(hào)為CN<%=Request.Form("UniversalID")%>.我們將通過(guò)你的電子信箱<%=Request.Form("Email")%><br>來(lái)正式通知你.此后我部舉行讀者沙龍活動(dòng)的時(shí)間和地點(diǎn)也將通過(guò)該信箱通知你.
</body> </html> 現(xiàn)在用瀏覽器打開(kāi)申請(qǐng)頁(yè)面,填入對(duì)應(yīng)數(shù)據(jù)后提交申請(qǐng),查看反饋效果,再用瀏覽器的查看源代碼的功能看一下源代碼,可以看對(duì)ASP頁(yè)面解釋后的HTML文件.
五 通過(guò)內(nèi)建對(duì)象 Request 獲取用戶申請(qǐng)信息 可以從 ASP 的內(nèi)建對(duì)象 Request 獲取用戶通過(guò)HTTP傳送過(guò)來(lái)的申請(qǐng)信息,如客戶認(rèn)證、Cookies數(shù)據(jù)、Post信息、查詢參數(shù)、服務(wù)器環(huán)境信息等,這些可以分別從對(duì)象 Request 的集合屬性ClientCertificate、Cookies、Form、QueryString、ServerVarables 中獲取,獲取方式為 Request.CollectionName( ItemString ),其中CollectionName為集合屬性名稱即 ClientCertificate、Form、QueryString、ServerVarables 中的一個(gè),ItemString 為要獲取的項(xiàng)目的名稱.如果可以確定沒(méi)有重復(fù)的項(xiàng)目名稱,也可直接以Request( ItemString )來(lái)獲取用戶信息,而不用指明集合屬性名稱.例如請(qǐng)求頁(yè)面中有一個(gè)Form元素CustomerID,且沒(méi)有其它元素名稱為CustomerID,則用Request.Form( "CustomerID" ) 與用Request.( "CustomerID" ) 具有同樣的效果. ㈠.用Request.Form獲取表格信息 1.ASP頁(yè)面可從一個(gè)HTML中獲取表格信息,只要將該表格的Action指定為對(duì)應(yīng)的ASP頁(yè)面即可.該項(xiàng)應(yīng)用可參見(jiàn)前面的列舉的讀者會(huì)員資格申請(qǐng)的例子.在該例子中,result.asp 從一個(gè)HTML中獲取表格信息并提供反饋信息. 2.ASP頁(yè)面可從另一個(gè)ASP頁(yè)面生成的HTML中獲取表格信息.具體運(yùn)作方式基本與從HTML頁(yè)面中獲取信息相同. 3.ASP頁(yè)面可從自己生成的HTML中獲取表格信息,只不過(guò)需要判斷該頁(yè)面是輸入頁(yè)面還是反饋?lái)?yè)面.在下面的例子中,login.asp 提供了一個(gè)用戶登錄頁(yè)面,要求用戶輸入登錄帳號(hào)和密碼,然后再通過(guò)Form的Action屬性將表格發(fā)送給自己進(jìn)行處理.在 login.asp 中,將根據(jù)帳號(hào)和密碼是否全為空來(lái)判斷是輸入頁(yè)面還是反饋?lái)?yè)面,并給予不同的提示,若是輸入則提示"用戶登錄,請(qǐng)輸入用戶帳號(hào)和密碼",否則顯示用戶帳號(hào)和密碼. <% rem login.asp %> <html> <head> <title>用戶登錄</title> </head>
<body> <% if isEmpty( Request.Form( "CustomerID" ) ) and isEmpty( Request.Form( "Password" ) ) then PromptString = "用戶登錄,請(qǐng)輸入用戶帳號(hào)和密碼" else PromptString = "用戶"&Request.Form( "CustomerID" )&"登錄成功,密碼為"&Request.Form( "Password" ) end if %>
<H2><% = PromptString %></H2>
<form method="post" action="login.asp"> <p> 用戶帳號(hào): <input name="CustomerID" value=""> <p> 用戶密碼: <input name="Password" value=""> <p><input type=submit value="開(kāi)始登錄"><input type=reset value="重新登錄"> </form>
</body> </html>
㈡.用Request.QueryString獲取用戶查詢參數(shù)信息 當(dāng)用戶以 xxxxx.asp?ParaName = ParaValue 的方式發(fā)出查詢請(qǐng)求時(shí),xxxxx.asp 可以從Request.QueryString("ParaName") 中獲取用戶提交的查詢參數(shù)ParaName的信息ParaValue,還可以從Request.QueryString("ParaName").count得知同一個(gè)參數(shù)被賦值的次數(shù)并進(jìn)行相應(yīng)的處理. 當(dāng)用戶以 query.asp?CustomerID=7777 的方式發(fā)出查詢請(qǐng)求時(shí),query.asp 可以從Request.QueryString("CustomerID") 中取得查詢參數(shù) CustomerID的值為 7777,Request.QueryString("ParaName").count 為 1. 當(dāng)用戶以 query.asp?CustomerID=7777&Password=DogIsDog 的方式發(fā)出查詢請(qǐng)求時(shí),query.asp 可以從Request.QueryString("CustomerID") 中取得查詢參數(shù) CustomerID 的值為 7777,從Request.QueryString("Password") 中取得查詢參數(shù) Password的值為 DogIsDog ,Request.QueryString("CustomerID").count 為 1,Request.QueryString("Password").count 為 1. 有時(shí)用戶可能對(duì)一個(gè)參數(shù)指定若干個(gè)值,此時(shí)可以從Request.QueryString("ParaName ").count 獲取該參數(shù)ParaName被指定的內(nèi)容的個(gè)數(shù),并以索引的方式來(lái)取得參數(shù)值.例如用戶希望查詢到三個(gè)客戶7777 、 8888 和 9999 的相關(guān)資料時(shí)就可能以下面的方式query.asp?CustomerID=7777&CustomerID=8888&CustomerID=9999 發(fā)出查詢請(qǐng)求,此時(shí)在query.asp 可以獲知 : <p><% = Request.QueryString("CustomerID").count %> 為 3 <p><% = Request.QueryString("CustomerID") %> 為 7777,8888,9999 <p><% = Request.QueryString("CustomerID")(1) %> 為 7777 <p><% = Request.QueryString("CustomerID")(2) %> 為 8888 <p><% = Request.QueryString("CustomerID")(3) %> 為 9999 其中Request.QueryString("CustomerID")可同時(shí)獲取三個(gè)參數(shù),各個(gè)之間參數(shù)用逗號(hào)隔開(kāi). 下面的例子(query.asp)用于獲取用戶指定的客戶帳號(hào),并顯示出來(lái)反饋給用戶. <% rem query.asp %> <html> <head> <title>用戶帳號(hào)</title> </head>
<body>
<H2>您指定的客戶帳號(hào)如下</H2> <%for i = 1 to Request.QueryString("CustomerID").count %> <p>第<% = i %>個(gè)用戶帳號(hào):<% = Request.QueryString("CustomerID")( i ) %> <%next%> </body> </html>
㈢.用Request.ServerVariables獲取服務(wù)器環(huán)境信息 Request.ServerVariables 包含了請(qǐng)求HTTP服務(wù)的服務(wù)器的環(huán)境變量信息.由于應(yīng)用較少,現(xiàn)列出常用的幾個(gè). Request.ServerVariables( "SERVER_PORT" ) : HTTP服務(wù)端口號(hào),一般為 80. Request.ServerVariables( "HTTP_ACCEPT_LANGUAGE" ) : 服務(wù)器采用的語(yǔ)言, "en"表示英文,"zh-cn"表示簡(jiǎn)體中文. Request.ServerVariables( "SERVER_NAME" ) : 服務(wù)器的名稱或IP地址 Request.ServerVariables( "REQUEST_METHOD" ) : 發(fā)出Request的方法 (Post/Get/Head) Request.ServerVariables( "SCRIPT_NAME" ) : 程序被調(diào)用的路徑及文件名稱 Request.ServerVariables( "REMOTE_HOST" ) : 發(fā)出Request的客戶端機(jī)器的名稱 Request.ServerVariables( "REMOTE_ADDR" ) : 發(fā)出Request的客戶端機(jī)器的IP地址 Request.ServerVariables( "REMOTE_IDENT" ) : 發(fā)出Request的用戶名稱,當(dāng)NCSA IdentityCheck為True且客戶端機(jī)器支持RFC931時(shí)有效. Request.ServerVariables( "CONTENT_TYPE" ) : 數(shù)據(jù)的MIME類型 Request.ServerVariables( "HTTP_ACCEPT" ) : 客戶端可接受的MIME類型列表. Request.ServerVariables( "HTTP_USER_AGENT" ) : 發(fā)出Request的客戶瀏覽器類型 Request.ServerVariables( "HTTP_REFERER" ) : 在發(fā)出CGI程序之前,客戶所指的文本 URL
㈣.用Request.Cookies獲取用戶的Cookies信息 Cookies 可以服務(wù)器和客戶端之間雙向傳遞,它記錄了特定用戶的某些信息.利用Request.Cookies獲取用戶的Cookies信息. 如果請(qǐng)求用戶的Cookies為 Product=Floppy,則Request.Cookies("Product")的值為"Floppy";如果用戶發(fā)送的Cookies為多重信息即包含有下屬類型時(shí),則可采用類似查詢參數(shù)QueryString的多維方式獲得,此時(shí)可以用Request.Cookies(cookie)的屬性HasKey來(lái)判斷某個(gè)Cookie是否有下屬類型。如當(dāng)用戶的Cookies為 Product=Floppy&Floppy=Sony時(shí),屬性 Request.Cookies("Product").HasKey為True,可通過(guò)Request.Cookies("Product")("Floppy") 得知其值為 "Sony". <p>Product = <%=Request.Cookies("Product")%> <p>Floppy = <%=Request.Cookies("Product")("Floppy")%> ㈤.ClientCertificate用的較少,這里就不說(shuō)了. 要求客戶端必須支持SSL3.0或PCT1協(xié)議, 服務(wù)器端必須啟動(dòng)用戶端認(rèn)證,客戶端必須進(jìn)行相應(yīng)的設(shè)置.
六 通過(guò)內(nèi)建對(duì)象 Response 向用戶發(fā)送信息 可以利用 ASP 的內(nèi)建對(duì)象 Response 很靈活地控制向客戶端發(fā)送的信息的內(nèi)容和方式.例如可以自動(dòng)轉(zhuǎn)向另一個(gè)URL頁(yè)面,可以改變頁(yè)面腳本的解釋方法,可以設(shè)置客戶的Cookie等 等. ㈠.利用Resopnse.Write 控制發(fā)送的信息內(nèi)容 方法 Response.Write 可以向發(fā)往客戶端瀏覽器的HTML文件中直接輸出內(nèi)容.這一點(diǎn)與利用主腳本的<% = 變量名 %>功能基本相同,但Resopnse.Write 的使用更為靈活,這體現(xiàn)在它作為一個(gè)方法函數(shù),可以在非主要腳本的函數(shù)中直接使用(調(diào)用時(shí)傳遞參數(shù)的方式遵守對(duì)應(yīng)腳本語(yǔ)言的規(guī)定),即可以出現(xiàn)在<script></script>之間向客戶輸出內(nèi)容,這一點(diǎn)是<% = 變量名 %>無(wú)法做到的,也是對(duì)其功能的一個(gè)補(bǔ)充吧. 在下面的例子中,selecolr.asp 要求用戶輸入一個(gè)顏色名稱,用戶確認(rèn)后將用戶申請(qǐng)發(fā)往同一個(gè)頁(yè)面selecolr.asp,然后用用戶指定的顏色將顏色名稱顯示出來(lái).這里實(shí)現(xiàn)的功能可以用<% = 變量名 %>的方式來(lái)實(shí)現(xiàn).Response.Write 在函數(shù)中的應(yīng)用要涉及到函數(shù)調(diào)用,稍后會(huì)在討論多腳本語(yǔ)言編程時(shí)有例子出現(xiàn). <% rem selecolr.asp %> <html> <head> <title>選擇顏色</title> </head>
<body> <% if isEmpty( Request.Form( "ColorName" ) ) then Response.write "<H4>你只需選擇顏色名稱,我來(lái)顯示</H4>" else Response.write "<H2>你選擇的顏色是<font color ="&Request.Form( "ColorName" )&">"&Request.Form( "ColorName" )&"</font></H2>" end if %>
<form method="post" action="selecolr.asp"> <p> 顏色名稱: <input name="ColorName" value="black"> <p><input type=submit value="顯示吧"><input type=reset value="想重選"> </form>
</body> </html>
㈡.利用 Response.Redirect 進(jìn)行URL頁(yè)面重新定位 假如由于業(yè)務(wù)上的原因,你的站點(diǎn)的域名或IP地址發(fā)生了變化,就象Borland變成了Inprise一樣,老顧客在用原來(lái)的域名訪問(wèn)時(shí),可以用 Response.Redirect 直接將其引導(dǎo)到新的站點(diǎn)上去;假如要求用戶在訪問(wèn)本頁(yè)面前必須先訪問(wèn)另外一個(gè)頁(yè)面,可用 Response.Redirect 直接將其引導(dǎo)到應(yīng)該去的頁(yè)面上去,而不是發(fā)出用戶無(wú)權(quán)訪問(wèn)該頁(yè)面的信息. 值得注意的是,必須在向客戶端發(fā)送任何信息前使用 Redirect,否則會(huì)引起錯(cuò)誤.你可以在頁(yè)面的第一條語(yǔ)句將用戶引導(dǎo)另一個(gè)URL,也可以將 Response.Buffer 設(shè)置為 True 而在以后適當(dāng)?shù)臅r(shí)間將用戶引導(dǎo)另一個(gè)URL. 在下面的例子中,若用戶調(diào)用本頁(yè)面,則將其引導(dǎo)到另一個(gè)頁(yè)面 selecolr.asp. <% rem redirect.asp %> <%Response.redirect "selecolr.asp"%> <html> <head> <title>重新定向</title> </head>
<body> <p> 你不可能進(jìn)入到本頁(yè)面,否則就是我的失敗. </body> </html> ㈢.利用 Response.ContentType 頁(yè)面內(nèi)容解釋方法 在HTML頁(yè)面代碼中,經(jīng)常會(huì)看見(jiàn)下面一個(gè)句子 <meta http-equiv="Content-Type" content="text/html"> 其中,它用于指定HTML頁(yè)面被瀏覽器解釋的方式.當(dāng) content="text/html"時(shí),瀏覽器將代碼解釋為普通HTML頁(yè)面并顯示給用戶;當(dāng) content="text/plain" 時(shí),瀏覽器將代碼不加任何解釋地顯示給用戶;當(dāng) content = "image/jpeg"是傳遞圖形文件; 當(dāng)未指定時(shí),ContentType 默認(rèn)為 "text/html".在ASP頁(yè)面中,Response.ContentType 作用與普通HTML相同,即可以控制瀏覽器解釋HTML文本的方式。 在下面的例子中,plain.asp 將 Response.ContentType 設(shè)置為"text/plain",使用客戶 端用戶可以直接看到該頁(yè)面的HTML代碼. <% rem plain.asp %> <% Response.ContentType = Request.Form( "ContentTypeName" ) %> <html> <head> <title>內(nèi)容類型設(shè)置</title> </head>
<body> <% if isEmpty( Request.Form( "ContentTypeName" ) ) then Response.write "<H4>你只需選擇類型,我來(lái)顯示</H4>" else Response.write "<H1>內(nèi)容類型設(shè)置成功</H1>" end if %>
<form method="post" action="plain.asp"> <p> 內(nèi)容類型: <input name="ContentTypeName" value="text/html"> <p><input type=submit value="顯示吧"><input type=reset value="想重選"> </form>
</body> </html>
㈣.利用 Response.Cookies 設(shè)置客戶端Cookies 通過(guò)設(shè)置Response.Cookies可以增加或修改客戶端的Cookies,其設(shè)置方法與取得對(duì)應(yīng)Cookie的值的方法相同.當(dāng)要設(shè)置的Cookie不存在時(shí),將創(chuàng)建一個(gè)新的Cookie,其值為要設(shè)置的值;Cookie存在且沒(méi)有下屬類別時(shí),以新值代替原有的值;Cookie存在且有下屬類別時(shí),若要設(shè)置的Cookie不含下屬類別,則原有的下屬類別將被刪除,若含下屬類別且無(wú)對(duì)應(yīng)類別則創(chuàng)建新的下屬類別,有對(duì)應(yīng)類別則以新值代替原有的值. 在下面的例子中,cookie.asp 用來(lái)設(shè)置一個(gè)名稱為 wfj 的Cookie的值.調(diào)用時(shí)將顯示上次設(shè)置的Cookie(wfj)的值.由于設(shè)置Cookie值要在發(fā)送內(nèi)容之前,所以這里將Response.Buffer 設(shè)置為 true( 其原因見(jiàn)后 Response.Buffer 的說(shuō)明 ). <%rem cookie.asp %> <%Response.Buffer = true%> <html> <head> <title>Cookie設(shè)置</title> </head>
<body> <% Response.Write "<p>原來(lái)的Cookie(wfj) = "&Request.Cookies( "wfj" )
if not isEmpty( Request.Form( "CookieValue" ) ) then Response.Cookies("wfj") = Request.Form( "CookieValue" ) Response.Write "<p>Cookie(wfj) 已經(jīng)設(shè)置為 "&Request.Form( "CookieValue" ) Response.Write "<p>下次調(diào)用時(shí)你會(huì)看到的" end if Response.write "<p><hr><H4>你只需設(shè)置Cookie,我來(lái)顯示</H4>" %>
<form method="post" action="cookie.asp"> <p> Cookie設(shè)置: <input name="CookieValue" value="wangfajun"> <p><input type=submit value="設(shè)置吧"><input type=reset value="想重選"> </form>
</body> </html> ㈤.利用 Response.Buffer 控制頁(yè)面發(fā)送進(jìn)度 Response.Buffer 的默認(rèn)值為 Flase,在這種情況下,服務(wù)器在處理對(duì)ASP頁(yè)面的請(qǐng)求時(shí),采用邊處理邊發(fā)送反饋的方式,即在處理完一部分腳本后即向客戶端發(fā)送反饋,這樣在處理耗時(shí)較長(zhǎng)的ASP頁(yè)面時(shí),用戶不用等待很長(zhǎng)時(shí)間就可以得到反饋,在用戶瀏覽的同時(shí)服務(wù)器繼續(xù)處理和發(fā)送反饋信息.當(dāng)Response.Buffer 為 True 時(shí),服務(wù)器在處理對(duì)ASP頁(yè)面的請(qǐng)求時(shí)使用緩沖技術(shù),在頁(yè)面所有的腳本處理結(jié)束后才將處理結(jié)果傳送給客戶端,這樣在處理耗時(shí)較長(zhǎng)的ASP頁(yè)面時(shí),用戶需要等待較長(zhǎng)的時(shí)間,而服務(wù)器端則可減少與客戶端連接的次數(shù)而提高整體響應(yīng)速度,并可以在滿足某種條件時(shí)撤消已經(jīng)處理的結(jié)果而不會(huì)出現(xiàn)響應(yīng)完成一部分才停止的狀況. 在下面的例子中,buffer.asp 可以根據(jù) BufferValue 的值來(lái)決定是否撤消反饋.當(dāng)輸入yes時(shí),用 Response.Clear 取消前面的反饋信息,用 Response.Redirect 將用戶引導(dǎo)到Cookie設(shè)置頁(yè)面,用 Response.End 停止反饋. <% rem buffer.asp%> <% Response.Buffer = true %> <html> <head> <title>Buffer設(shè)置</title> </head>
<body> <% if isEmpty( Request.Form( "BufferValue" ) ) then Response.write "<H4>你只需設(shè)置BufferValue,我來(lái)顯示</H4>" else Response.Write "BufferValue="&Request.Form( "BufferValue" ) end if %>
<form method="post" action="buffer.asp"> <p> 是否撤消響應(yīng): <input name="BufferValue" value="no"> <p><input type=submit value="顯示吧"><input type=reset value="想重選"> </form>
<% if Request.Form( "BufferValue" ) = "yes" then Response.Clear Response.Redirect "cookie.asp" Response.End else Response.Write "BufferValue="&Request.Form( "BufferValue" ) end if %> </body> </html> ㈥.Response其它屬性和方法 1.Expires屬性: 網(wǎng)頁(yè)在客戶端保留的時(shí)間長(zhǎng)度 2.ExpiresAbsolute屬性: 網(wǎng)頁(yè)在客戶端保留的日期與時(shí)間 3.AddHeader方法: 設(shè)定HTML文件的HTTP報(bào)頭. 4.AppendToLog方法: 在服務(wù)器日志中增加字符串. 5.Flush方法: 立刻送出緩沖區(qū)中的的HTML資料.
七 多種腳本語(yǔ)言混合編程 在同一個(gè)ASP頁(yè)面中,可以同時(shí)使用多種腳本語(yǔ)言,充分利用各個(gè)腳本語(yǔ)言的功能優(yōu)勢(shì).但必須指定一個(gè)主要腳本語(yǔ)言,若沒(méi)有指定則默認(rèn)為 VBScript.要在一個(gè)ASP頁(yè)面中指定其它腳本語(yǔ)言為主要腳本語(yǔ)言,必須在該頁(yè)面的第一行指定,方法如下: <%@ Language = LanguageName %> 如果要將JScript指定為某頁(yè)面的主要腳本語(yǔ)言,則須在該頁(yè)面第一行加入: <%@ Language = JScript %> 若沒(méi)有指定,則相當(dāng)于: <%@ Language = VBScript %> 應(yīng)注意,這種方法只對(duì)支持 Object.Method 語(yǔ)法的腳本語(yǔ)言有效,不支持的要在WinNT服務(wù)器上對(duì) LanguageEngines 進(jìn)行設(shè)置,由于筆者沒(méi)有用到,就不討論了. 上述是改變單個(gè)ASP頁(yè)面中主要腳本語(yǔ)言,在改變所有ASP頁(yè)面中主要腳本語(yǔ)言,采用上述方法可能不夠聰明,最好是在WinNT服務(wù)器上對(duì) DefaultScriptLanguage 進(jìn)行設(shè)置,由于筆者沒(méi)有用到,就不討論了,還是用笨辦法吧. 除了主要腳本語(yǔ)言外,還可在頁(yè)面的局部采用其它腳本語(yǔ)言來(lái)實(shí)現(xiàn)特定的功能.此時(shí)要用<Script>來(lái)實(shí)現(xiàn),具體方法如下: <Script Language = LanguageName RunAt = Server> .... 功能實(shí)現(xiàn)部分 .... </Script> 其中,LanguageName 為腳本語(yǔ)言名稱,可以是VBScript、JScript、Perl 等服務(wù)器上已安裝的解釋引擎的腳本語(yǔ)言;Runat = Server 指定該段腳本在服務(wù)器運(yùn)行,以區(qū)別在客戶端瀏覽器運(yùn)行,因?yàn)槟J(rèn)是在客戶端瀏覽器運(yùn)行,所以該設(shè)置不能省略,否則對(duì)應(yīng)的腳本將發(fā)送到客戶端讓瀏覽器解釋運(yùn)行. 在ASP頁(yè)面中,一般每種腳本完成一個(gè)完整的功能,然后用主要腳本語(yǔ)言進(jìn)行調(diào)用,調(diào)用 方法為<%Call Function%>. 用<Script>方式編寫服務(wù)器端腳本時(shí)應(yīng)注意: 1.腳本語(yǔ)句必須作為某個(gè)函數(shù)的一部分出現(xiàn),而不能單獨(dú)出現(xiàn)在函數(shù)體之外. 2.不能使用輸出語(yǔ)句,如<% = 變量名 %>向生成的HTML頁(yè)面輸出. 3.編寫函數(shù)時(shí)不可再用<!-- -->來(lái)屏蔽,因?yàn)榉⻊?wù)器必須能解釋腳本,否則會(huì)引起錯(cuò)誤. 多種腳本語(yǔ)言混合使用時(shí)應(yīng)注意,要使用某種腳本語(yǔ)言,必須首先在服務(wù)器上安裝對(duì)應(yīng)的腳本語(yǔ)言解釋器.在 ASP 中已經(jīng)內(nèi)置了VBScript和JScript兩種腳本語(yǔ)言解釋器,故可不必安裝,但其它腳本語(yǔ)言則必須安裝后才能使用. 下面是一個(gè)VBScript和JScript兩種腳本混合使用的例子,是上面例子query.asp的改寫. <html> <head> <title>用戶帳號(hào)</title> </head>
<Script Language = VBScript RunAt = Server> Sub VBSQuery for i = 1 to Request.QueryString("CustomerID").count Response.Write "<p>第"&i&"個(gè)用戶帳號(hào):"&Request.QueryString("CustomerID")( i ) next End Sub </Script> <SCRIPT LANGUAGE=JScript RUNAT=Server> function JSQuery() { var i; for ( i =1; i <= Request.QueryString("CustomerID").count; i++ ) Response.Write("<p>第" + i + "個(gè)用戶帳號(hào):" + Request.QueryString("CustomerID")( i )); } </Script>
<body> <H2>VBScript :您指定的客戶帳號(hào)如下</H2> <% Call VBSQuery %> <H2>JScript :您指定的客戶帳號(hào)如下</H2> <% Call JSQuery %> <H2>主腳本 :您指定的客戶帳號(hào)如下</H2> <%for i = 1 to Request.QueryString("CustomerID").count %> <p>第<% = i %>個(gè)用戶帳號(hào):<% = Request.QueryString("CustomerID")( i ) %> <%next%> </body> </html>
八 服務(wù)器端腳本和客戶端腳本混合編程 當(dāng)使用<script></script>編寫一段腳本程序時(shí),如果沒(méi)有指定 Runat = Server,則認(rèn)為其中的腳本程序在客戶端執(zhí)行,此時(shí)可以在程序中混合使用服務(wù)器端主要腳本和客戶端腳本,這樣就可以根據(jù)客戶端的請(qǐng)求靈活地控制客戶端腳本的執(zhí)行,使對(duì)客戶的反饋更具有個(gè)性化.在混合使用時(shí),服務(wù)器端腳本要以<%%>的形式嵌入,以示區(qū)別. 下面就是一個(gè)服務(wù)器端腳本和客戶端腳本混合編程的例子.在該例子中,將輸出10條記錄,并為每條記錄定制不同的函數(shù). <html> <head> <title>服務(wù)器端腳本和客戶端腳本混合編程</title> </head> <body> <H1>鼠標(biāo)移到各記錄上的【項(xiàng)目名稱】上時(shí),請(qǐng)注意狀態(tài)條內(nèi)容的變化</H1> <table border = "1"> <tr><td>項(xiàng)目名稱</td><td>狀態(tài)條應(yīng)出現(xiàn)的內(nèi)容</td></tr> <% for i = 1 to 10 %> <tr> <td onmouseover = "Status<% =i %>()"><% =i %></td> <td>第<% =i %>條記錄出現(xiàn)了</td> <tr> <script language = JavaScript> <!-- function Status<% =i %>() { window.status = "第<% =i %>條記錄出現(xiàn)了"; } --> </script> <% next %> </table> </body> </html>
九 增加注釋 在編程時(shí)添加注釋是一個(gè)好的習(xí)慣.ASP 允許在頁(yè)面代碼中添加注釋.具體的注釋方法可參見(jiàn)各腳本語(yǔ)言的規(guī)則規(guī)定,如VBScript的注釋符號(hào)為 Rem 或 單引號(hào)" ' ",JScript的注釋符號(hào)為 雙斜杠"//".有一點(diǎn)要注意,就是在HTML輸出語(yǔ)句中不能添加注釋,如<p>當(dāng)前時(shí)間為<% =now '在HTML輸出當(dāng)前時(shí)間%> 即是無(wú)效的.
十 利用 Include 來(lái)實(shí)現(xiàn)功能模塊化 可以將常用的功能函數(shù)存于一個(gè)ASP文件,在其它ASP頁(yè)中要用其中的功能時(shí),將包含函數(shù)的ASP文件包含在調(diào)用函數(shù)的ASP文件中.這時(shí)可使用 Include 語(yǔ)句.具體語(yǔ)法為: <!-- #include file="AspFileName" --> 或 <!-- #include Virtual="AspFileName" --> . 使用時(shí)應(yīng)該注意: 1.<!-- include file >用于被包含的ASP文件的文件名為普通文件名,其中文件所在的目錄為實(shí)際目錄;而<!-- include virtual>用于被包含的ASP文件的文件名為虛擬文件名,其中文件所在的目錄為虛擬目錄. 2.被包含文件的文件名稱不能使用ASP腳本變量,因?yàn)榘Z(yǔ)句是先于腳本語(yǔ)句被解釋和執(zhí)行的,此時(shí)文件名為無(wú)效文件名稱.如下面語(yǔ)句即為無(wú)效的: <% for i = 1 to 4 AspFileName = "\aspsamp\Asp"&i&".asp" %> <!-- include file=AspFileName --> <% next %> 3.應(yīng)避免自包含,即 File1 包含 File1;在多個(gè)文件中有包含語(yǔ)句時(shí),應(yīng)避免間接自包含即循環(huán)包含,如File1包含F(xiàn)ile2,F(xiàn)ile2包含F(xiàn)ile3,F(xiàn)ile3包含F(xiàn)ile1. 4.被包含的腳本語(yǔ)言的類型必須是默認(rèn)語(yǔ)言類型,即必須是主文件<%@ language%>語(yǔ)句中指定的腳本語(yǔ)言類型;被包含文件中不能使用<%@ language%>語(yǔ)句. 5.可以使用 "../"來(lái)表示相對(duì)路徑.此時(shí)應(yīng)保證服務(wù)器端 EnableParentPaths 設(shè)置為 1,當(dāng)然在Win95上無(wú)法設(shè)置了.
以上是學(xué)習(xí)和使用ASP創(chuàng)建動(dòng)態(tài)、交互式站點(diǎn)的一些入門知識(shí),有了這些基礎(chǔ)知識(shí),就可以發(fā)揮以前自己積累的編程經(jīng)驗(yàn),自己動(dòng)手學(xué)習(xí)和探索用ASP創(chuàng)建動(dòng)態(tài)、交互式站點(diǎn)的高級(jí)應(yīng)用了.歡迎大家將自己的學(xué)習(xí)所得發(fā)表出來(lái),讓我們來(lái)共同分享你成功的喜悅;也歡迎大家寫信到 wangfajun@163.net 與筆者交流學(xué)習(xí)心得.
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!