ASP中的內(nèi)建對(duì)象學(xué)習(xí)課件_第1頁(yè)
ASP中的內(nèi)建對(duì)象學(xué)習(xí)課件_第2頁(yè)
ASP中的內(nèi)建對(duì)象學(xué)習(xí)課件_第3頁(yè)
ASP中的內(nèi)建對(duì)象學(xué)習(xí)課件_第4頁(yè)
ASP中的內(nèi)建對(duì)象學(xué)習(xí)課件_第5頁(yè)
已閱讀5頁(yè),還剩98頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

在面向?qū)ο缶幊讨?,?duì)象就是指由當(dāng)作完整實(shí)體的操作和數(shù)據(jù)組成的變量,是基于特定模型的。在對(duì)象中客戶使用對(duì)象的服務(wù),通過(guò)由一組方法或相關(guān)函數(shù)的接口訪問(wèn)對(duì)象的數(shù)據(jù),然后客戶端調(diào)用這些方法執(zhí)行某種操作。ASP提供了可在腳本中使用的內(nèi)建對(duì)象。通過(guò)這些對(duì)象,用戶更容易收集通過(guò)瀏覽器請(qǐng)求發(fā)送的信息,響應(yīng)瀏覽器以及存儲(chǔ)用戶信息,從而使對(duì)象開(kāi)發(fā)者擺脫很多煩瑣的工作。6.1 在HTML中使用表單表單在HTML頁(yè)面中起著重要作用,它是與用戶交互信息的主要手段。一個(gè)表單至少應(yīng)該包括說(shuō)明性文字、用戶填寫(xiě)的表格、提交和重填按鈕等內(nèi)容。用戶填寫(xiě)了所需的資料之后,按下“提交”按鈕,所填資料就會(huì)通專門(mén)的CGI接口傳到Web服務(wù)器上。網(wǎng)頁(yè)的設(shè)計(jì)者隨后就能在Web服務(wù)器上看到用戶填寫(xiě)的資料,從而完成了從用戶到作者之間的反饋和交流。表單中主要包括下列元素:

button——普通按鈕

radio——單選按鈕

checkbox——復(fù)選框Select——下拉式菜單

text——單行文本框

textarea——多行文本框

submit——提交按鈕

reset——

重填按鈕用HTML設(shè)計(jì)表單常用的標(biāo)記是:<form>、<input>、<option>、<select>、<textarea>和<isindex>等標(biāo)記。6.1.1表單標(biāo)記<form><form>標(biāo)記的主要作用是設(shè)定表單的起止位置,并指定處理表單數(shù)據(jù)程序的url地址?;菊Z(yǔ)法如下:<formaction=urlmethod=get|postname=valueonreset=functiononsubmit=functiontarget=window></form>其中:action:用于設(shè)定處理表單數(shù)據(jù)程序url的地址,這樣的程序通常是CGI應(yīng)用程序,例如采用電子郵件方式時(shí),用action=“mailto:你的郵件地址”。method:指定數(shù)據(jù)傳送到服務(wù)器的方式,有兩種主要的方式,當(dāng)method=get時(shí),將輸入數(shù)據(jù)加在action指定的地址后面?zhèn)魉偷椒?wù)器;當(dāng)method=post時(shí),則將輸入數(shù)據(jù)按照HTTP傳輸協(xié)議中的post傳輸方式傳送到服務(wù)器,用電子郵件接收用戶信息采用這種方式。name:用于設(shè)定表單的名稱。

onreset和onsubmit:主要針對(duì)“reset”按鈕和“submit”按鈕來(lái)說(shuō)的,分別設(shè)定了在按下相應(yīng)的按鈕之后要執(zhí)行的子程序。target:指定輸入數(shù)據(jù)結(jié)果顯示在那個(gè)窗口,這需要與<frame>標(biāo)記配合使用。6.1.2表單輸入標(biāo)記<input>此標(biāo)記在表單中使用頻繁,大部分表單內(nèi)容需要用到此標(biāo)記。語(yǔ)法如下:<inputaligh=left|righ|top|middle|bottomname=valuetype=text|textarea|password|checkbox|radio|submit|reset|file|hidden|image|buttonvalue=valuesrc=urlcheckedmaxlength=nsize=nonclick=functiononselect=function>其中:align:用于設(shè)定表單的位置是靠左(left)、靠右(right)、居中(middle)、靠上(top),還是靠底(bottom)。name:設(shè)定當(dāng)前變量名稱。

type:決定了輸入數(shù)據(jù)的類型。其選項(xiàng)較多,各項(xiàng)的意義是:

text:表示輸入單行文本;

textarea:表示輸入多行文本;password:表示輸入數(shù)據(jù)為密碼,用星號(hào)表示;checkbox:表示復(fù)選框;radio:表示單選框;submit:表示提交按鈕,數(shù)據(jù)將被送到服務(wù)器;

reset:表示清除表單數(shù)據(jù),以便重新輸入;file:表示插入一個(gè)文件;hidden:表示隱藏按鈕;image:表示插入一個(gè)圖像;button:表示普通按鈕;value:用于設(shè)定輸入默認(rèn)值,即如果用戶不輸入的話,就采用此默認(rèn)值;src:是針對(duì)type=image的情況來(lái)說(shuō)的,設(shè)定圖像文件的地址;checked:表示選擇框中,此項(xiàng)被默認(rèn)選中;maxlength:表示在輸入單行文本的時(shí)候,最大輸入字符個(gè)數(shù);size:用于設(shè)定在輸入多行文本時(shí)的最大輸入字符數(shù),采用width,height方式;onclick:表示在按下輸入時(shí)調(diào)用指定的子程序;onselect:表示當(dāng)前項(xiàng)被選擇時(shí)調(diào)用指定的子程序。6.1.3下拉菜單標(biāo)記<select>用<select>標(biāo)記可以在表間中插入一個(gè)下拉菜單,它需與<option>標(biāo)記聯(lián)用,因?yàn)橄吕藛沃械拿總€(gè)選項(xiàng)要用<option>標(biāo)記來(lái)定義。<select>標(biāo)記的語(yǔ)法如下:<selectname=nametextsize=nmultiple>其中:name:設(shè)定下拉式菜單的名稱;size:設(shè)定菜單框的高度,也就是一次顯示幾個(gè)菜單項(xiàng),一般取默認(rèn)值(size="1");multiple:設(shè)定為可以進(jìn)行多選。6.1.4選項(xiàng)標(biāo)記<option>

該標(biāo)記為下拉菜單中一個(gè)選項(xiàng),語(yǔ)法很簡(jiǎn)單:<optionselectedvalue=value>其中:selected:表示當(dāng)前項(xiàng)被默認(rèn)選中;value:表示該項(xiàng)對(duì)應(yīng)的值,在該項(xiàng)被中之后,該項(xiàng)的值就會(huì)被送到服務(wù)器進(jìn)行處理。6.1.5多行文本輸入標(biāo)記<textarea>這是一個(gè)建立多行文本輸入框的專用標(biāo)記,其語(yǔ)法如下:<textareaname=namecols=nrows=nwrap=off|hard|soft>其中:name:文本框名稱;cols:寬度;rows:高度(行數(shù));wrap:換行控制;off:不自動(dòng)換行;hard:自動(dòng)硬回車換行,換行標(biāo)記一同被傳送到服務(wù)器中去;soft:自動(dòng)軟回車換行,換行標(biāo)記不會(huì)傳送到服務(wù)器中去。表單所涉及的標(biāo)記較多,參數(shù)也較復(fù)雜,而在實(shí)際制作表單時(shí)就是這些標(biāo)記的組合應(yīng)用。一般的表單不可能涉及所有參數(shù),選擇參數(shù)時(shí)盡量用默認(rèn)值,不設(shè)定一個(gè)不用的參數(shù)。6.2Request對(duì)象Request對(duì)象是ASP編程中使用最頻繁的對(duì)象之一??梢允褂肦equest對(duì)象訪問(wèn)任何基于HTTP請(qǐng)求傳遞的所有信息,包括從HTML表格用POST方法或GET方法傳遞的參數(shù)、cookie和用戶認(rèn)證等。通過(guò)Request對(duì)象能夠訪問(wèn)客戶端發(fā)送給服務(wù)器的二進(jìn)制數(shù)據(jù)。Request的語(yǔ)法:Request[.集合|屬性|方法](變量)其中,集合可以被指定為Form或者QueryString。變量即提交頁(yè)面中使用的Form對(duì)象的變量名。6.2.1Form集合Form集合通過(guò)使用POST方法的表格檢索發(fā)送到HTTP請(qǐng)求正文中的表格元素的值。語(yǔ)法:Request.Form(element)[(index)|.Count]其中:element指定集合要檢索的表格元素的名稱。index可選參數(shù),使用該參數(shù)可以訪問(wèn)某參數(shù)中多個(gè)值中的一個(gè)。它可以是1到Request.Form(parameter).Count之間的任意整數(shù)。Count集合中元素的個(gè)數(shù)。圖6-2調(diào)查表

Form:集合按請(qǐng)求正文中參數(shù)的名稱來(lái)索引.Request.Form(element)的值是請(qǐng)求正文中所有element值的數(shù)組。通過(guò)調(diào)用Request.Form(element).Count來(lái)確定參數(shù)中值的個(gè)數(shù)。如果參數(shù)未關(guān)聯(lián)多個(gè)值,則計(jì)數(shù)為1。如果找不到參數(shù),計(jì)數(shù)為0。要引用有多個(gè)值的表格元素中的單個(gè)值,必須指定index值。index參數(shù)可以是從1到Request.Form(element).Count中的任意數(shù)字。如果引用多個(gè)表格參數(shù)中的一個(gè),而未指定index值,返回的數(shù)據(jù)將是以逗號(hào)分隔的字符串。

對(duì)于圖6-2調(diào)查表中的多個(gè)“愛(ài)好”參數(shù),可以使用程序6.2來(lái)檢索這些值。程序6.2sample6-02.asp<html><head><title></title></head><body><p>請(qǐng)?zhí)顚?xiě)你的愛(ài)好</p><formmethod="POST"action="form.asp"><p><inputtype="text"name="hobby"size="20"><br><inputtype="checkbox"name="hobby"value="足球">足球<inputtype="checkbox"name="hobby"value="乒乓球">乒乓球</p><p><inputtype="submit"value="發(fā)送"name="B1"><inputtype="reset"value="重填"name="B2"></p></form><%ForEachiInRequest.Form("hobby")Response.Writei&"<BR>"Next%></body></html>當(dāng)然使用For...Next循環(huán)也可以生成同樣的輸出,如下所示:<%Fori=1ToRequest.Form("hobby").CountResponse.WriteRequest.Form("hobby")(i)&"<BR>"Next%>

6.2.2QueryString集合QueryString集合用來(lái)檢索HTTP查詢字符串中變量的值,HTTP查詢字符串由問(wèn)號(hào)(?)后的值指定。如:<ahref="example.asp?string=thisisasample">stringsample</a>生成值為"thisisasample"的變量名字符串。通過(guò)發(fā)送表格或由用戶在其瀏覽器的地址框中鍵入查詢也可以生成查詢字符串。語(yǔ)法:Request.QueryString(variable)[(index)|.Count]QueryString集合可以用名稱來(lái)檢索QUERY_STRING變量。Request.QueryString(參數(shù))的值是出現(xiàn)在QUERY_STRING中所有參數(shù)的值的數(shù)組。通過(guò)調(diào)用Request.QueryString(parameter).Count可以確定參數(shù)有多少個(gè)值。也可以使用QueryString來(lái)達(dá)到與前一個(gè)范例相同的功能。只需要將request.form部分替換如下:<%

ForEachiInRequest.querystring("hobby")Response.Writei&"<BR>"

Next%>

6.2.3Cookies1.什么是Cookies?Cookie其實(shí)就是一個(gè)標(biāo)簽。在訪問(wèn)一個(gè)需要唯一標(biāo)識(shí)你的地址的Web站點(diǎn)時(shí),它會(huì)在你的硬盤(pán)上留下一個(gè)標(biāo)記,下一次再次訪問(wèn)這個(gè)站點(diǎn)時(shí),站點(diǎn)的頁(yè)面就會(huì)查找這個(gè)標(biāo)記。每個(gè)Web站點(diǎn)都有自己的標(biāo)記,標(biāo)記的內(nèi)容可以隨時(shí)讀取,但只能由該站點(diǎn)的頁(yè)面完成。每個(gè)站點(diǎn)的Cookie與其它所有站點(diǎn)的Cookie存在同一文件夾中的不同文件內(nèi)(Windows2000系統(tǒng)下,可以在C:\DocumentsandSettings\Administrator\Cookies的目錄下找到它們)。

一個(gè)Cookie就是一個(gè)唯一標(biāo)識(shí)客戶的標(biāo)記,Cookie可以包含在一個(gè)對(duì)話期或幾個(gè)對(duì)話期之間某個(gè)Web站點(diǎn)的所有頁(yè)面共享的信息,使用Cookie還可以在頁(yè)面之間交換信息。Request提供的Cookies集合允許用戶檢索在HTTP請(qǐng)求中發(fā)送的cookie的值。這項(xiàng)功能經(jīng)常被使用在要求認(rèn)證客戶密碼以及電子公告板、Web聊天室等ASP程序中。語(yǔ)法:Request.Cookies(cookie)[(key)|.attribute]其中:cookie指定要檢索其值的cookie。key是可選參數(shù),用于從cookie字典中檢索子關(guān)鍵字的值。attribute指定cookie自身的有關(guān)信息。如:HasKeys只讀,指定cookie是否包含關(guān)鍵字??梢酝ㄟ^(guò)包含一個(gè)key值來(lái)訪問(wèn)cookie字典的子關(guān)鍵字。如果訪問(wèn)cookie字典時(shí)未指定key,則所有關(guān)鍵字都會(huì)作為單個(gè)查詢字符串返回。例如,如果MyCookie有兩個(gè)關(guān)鍵字,First和Second,而在調(diào)用Request.Cookies時(shí)并未指定其中任何一個(gè)關(guān)鍵字,那么將返回下列字符串。First=firstkeyvalue&Second=secondkeyvalue

如果客戶端瀏覽器發(fā)送了兩個(gè)同名的cookie,那么Request.Cookie將返回其中路徑結(jié)構(gòu)較深的一個(gè)。例如,如果有兩個(gè)同名的的cookie,但其中一個(gè)的路徑屬性為/www/而另一個(gè)為/www/home/,客戶端瀏覽器同時(shí)將兩個(gè)cookie都發(fā)送到/www/home/目錄中,那么Request.Cookie將只返回第二個(gè)cookie。

要確定某個(gè)cookie是不是cookie字典(cookie有否有關(guān)鍵字),可使用下列腳本。<%=Request.Cookies("myCookie").HasKeys%>

如果myCookie是一個(gè)cookie字典,則前面的賦值為T(mén)RUE。否則為FALSE。下面看一個(gè)cookie的應(yīng)用實(shí)例。程序6.3sample6-03.asp<%nickname=request.form("nick")response.cookies("nick")=nickname'用

response對(duì)象將用戶名寫(xiě)入

Cookie之中

response.write"歡迎"&request.cookies("nick")&"光臨小站!"%><html><head><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"><title>cookie</title><metaname="GENERATOR"content="MicrosoftFrontPage3.0"></head><body><formmethod="POST"action="cookie.asp"><p><inputtype="text"name="nick"size="20"><inputtype="submit"value="發(fā)送"name="B1"><inputtype="reset"value="重填"name="B2"></p></form></body></html>這其實(shí)是一個(gè)在基于Web的BBS或CHAT的ASP程序中常用的手法,它將用戶在起始頁(yè)面上所填入的姓名保存在cookie中,這樣后面的程序就可以很容易地調(diào)用該用戶的nick了。2.Cookie的工作原理Cookies將通過(guò)HTTPHeaders來(lái)從服務(wù)端返回到瀏覽器上。服務(wù)端首先在響應(yīng)中利用Set-Cookieheader來(lái)創(chuàng)建一個(gè)Cookie,瀏覽器后面的請(qǐng)求的cookieheader中就會(huì)返回這個(gè)Cookie來(lái)完成瀏覽器的認(rèn)證。假設(shè)創(chuàng)建了一個(gè)名字為UserName的Cookie來(lái)包含訪問(wèn)者的信息,創(chuàng)建Cookie時(shí),Server的Header就象下面(假設(shè)訪問(wèn)者為BillGates):Set-Cookie:UserName=BILL+Gates;path=/;domain=aspsite.com;expires=Tuesday,01-Jan-9900:00:01GMT

這個(gè)Header就在瀏覽器的電腦上的Cookie文件中添加了一條記錄。瀏覽器將名字為UserName的Cookie賦值為BillGates。請(qǐng)注意這個(gè)cookie的值是進(jìn)行了URL-encoded操作的。瀏覽器創(chuàng)建了一個(gè)Cookie后,在每一個(gè)針對(duì)該網(wǎng)站的請(qǐng)求時(shí)都會(huì)在Header中帶著這個(gè)Cookie,也就是每一次滿足該路徑的情況下這個(gè)Cookie都會(huì)有效。不過(guò),對(duì)于其它網(wǎng)站的請(qǐng)求Cookie是絕對(duì)不會(huì)跟著發(fā)送的。瀏覽器會(huì)這樣一直發(fā)送到Cookie過(guò)期為止。CookieHeader如下:cookie:username:Bill+Gates3.在ASP中創(chuàng)建和讀取Cookies當(dāng)利用ASP創(chuàng)建了一個(gè)cookie之后,就可以使用Response對(duì)象的Cookie集合了。可以創(chuàng)建兩種cookie:一種是單值的;另一種可以認(rèn)為是cookie字典類型,即允許多個(gè)鍵值對(duì)的存在。創(chuàng)建單值的相對(duì)簡(jiǎn)單,如下腳本:<%Response.Cookies("Username")="BillGates"Response.Cookies("Username").Expires="Jan1,1999"%>

顯然,這個(gè)腳本將名字為Username的Cookie賦值為BillGates,同時(shí)將過(guò)期時(shí)間限定為1999年1月1日。這里面需要說(shuō)明的是,Expires屬性如果不進(jìn)行賦值,那么默認(rèn)的就是用戶一離開(kāi)網(wǎng)站就過(guò)期。由于這個(gè)例子腳本創(chuàng)建的是Header的部分,那么就必須在ASP的任何輸出語(yǔ)句之前進(jìn)行這個(gè)腳本的操作,或者使用Buffer輸出。前面的腳本是創(chuàng)建一個(gè)Cookie的簡(jiǎn)單示例,只是使用了最常用的Expires屬性,其實(shí)還有許多其他屬性也可以自行設(shè)置,下面是一個(gè)比較完全的例子:<%Response.Cookies("Username")="SteveJobs"Response.Cookies("Username").Expires="Jan1,1999"Response.Cookies("Username").Path="/examples"Response.Cookies("Username").Domain="aspsite.com"Response.Cookies("Username").Secure=True%>

這個(gè)腳本例子和前面的其實(shí)沒(méi)有什么區(qū)別,不過(guò)有三個(gè)附加的屬性需要解釋:

Path屬性是用來(lái)更加嚴(yán)格的限定瀏覽器發(fā)送Cookie,在這個(gè)例子中,只有針對(duì)于/examples目錄的請(qǐng)求的Header中才攜帶Cookie信息,例如/examples/hello.asp以及/examples/chapter16/hello.asp的請(qǐng)求都會(huì)在Header上攜帶Cookie信息,但是如果是瀏覽器對(duì)/hello.asp的請(qǐng)求就不會(huì)攜帶該Cookie信息。Path屬性的默認(rèn)值是該Cookie創(chuàng)建的ASP所在的路徑。(也就是說(shuō),即便不做指定,也不會(huì)跨過(guò)目

錄發(fā)送Cookie)

Domain屬性,限定了Cookie發(fā)送的網(wǎng)站,例子中的aspsite.com說(shuō)明cookie可以被發(fā)送到www.aspsite.com或者beetle.aspsite.com或者yeah.aspsite.com等等,同樣作為默認(rèn)值是該Cookie創(chuàng)建的網(wǎng)站。最后是Secure屬性,當(dāng)該屬性設(shè)為T(mén)rue時(shí),則傳遞中就實(shí)行了加密算法,如果你正在使用安全接口層,那么就可以使用這個(gè)屬性。在一個(gè)ASP中讀取cookie,只需要使用Request對(duì)象的Cookies集合。例如,輸出一個(gè)cookie值,那么腳本如下:<%=Request.Cookies("Username")%>這個(gè)腳本將名字為Username的Cookie值進(jìn)行了輸出,和以前同樣的是,依然可以利用ForEach循環(huán)或者利用Count屬性和For…Next循環(huán)結(jié)合的方式來(lái)將Cookie集合的所有

屬性值顯示出來(lái),下面這個(gè)例子的運(yùn)行結(jié)果應(yīng)當(dāng)無(wú)須解釋了。<%ForEACHthingINRequest.CookiesResponse.write("<BR>"&thing&Request.Cookies(thing))NEXT%>4.創(chuàng)建多個(gè)Cookie要?jiǎng)?chuàng)建多個(gè)Cookie,只需在Response對(duì)象的Cookies集合中簡(jiǎn)單的定義多個(gè)名稱就可以。不過(guò),許多瀏覽器對(duì)一個(gè)指定網(wǎng)站就限定了三到四個(gè)Cookie。

創(chuàng)建多個(gè)Cookie還有一種選擇,就是創(chuàng)建一個(gè)Cookie字典,那么一個(gè)Cookie字典中就可以含有多個(gè)鍵值對(duì),下面是這么一個(gè)字典的例子:<%Response.Cookies("User")("Name")="BillGates"Response.Cookies("User")("Password")="billions"%>

這個(gè)腳本創(chuàng)建了一個(gè)名為User的Cookie字典,其中含有兩個(gè)鍵分別是Name和Password,當(dāng)這個(gè)Cookie字典創(chuàng)建時(shí),請(qǐng)求的Header中是這樣的信息:Set-Cookie:User=Name=Bill+Gates&Password=billions上面的語(yǔ)句創(chuàng)建了一個(gè)名字為User的Cookie,它含有兩個(gè)鍵值對(duì),這意味著所有的鍵和相應(yīng)的值都在一個(gè)大的Cookie中。接受這樣的Cookie值,還可以利用以前的Response對(duì)象的Cookies集合,既可以將其全部顯示,(這樣顯示就是沒(méi)有經(jīng)過(guò)解碼的Header中的源代碼,也就是上面Header中的信息,這樣一般都是用于調(diào)試工作)也可以按每一個(gè)鍵的相應(yīng)名稱顯示相應(yīng)值,如下例:

<%=Request.Cookies("User")%><%=Request.Cookies("User")("Name")%><%=Request.Cookies("User")("Name")%>

利用Cookie技術(shù)傳遞諸如密碼這樣的信息要特別小心,因?yàn)橐话阏f(shuō)來(lái),這種信息是未經(jīng)加密的,當(dāng)然,如果網(wǎng)站有安全接口層技術(shù),也可以進(jìn)行加密傳輸,但是在瀏覽器端該信息還是存放在文本文件中。如果希望知道一個(gè)Cookie是否是一個(gè)Cookie字典,可以用HasKeys屬性,例如下面腳本如果返回值為T(mén)rue,那么就是一個(gè)Cookie字典。<%=Request.Cookies("User").HasKeys%>5.不利用Cookie來(lái)保持信息前面已經(jīng)介紹過(guò)QueryString字段的使用及接收,以及Form的接收。這兩種手段也可以進(jìn)行一些信息保存,最后對(duì)這三種方案進(jìn)行綜合比較。(1)利用QueryString來(lái)保持信息由于可以在連接中添加任何QueryString字段,那么,只要在網(wǎng)站的所有連接中添加一個(gè)保存用戶某種信息的字段,再在各個(gè)程序上進(jìn)行相應(yīng)處理,就可以進(jìn)行模擬跟蹤,如下例:<HTML><HEAD><TITLE>Query字段進(jìn)行信息保留</TITLE></HEAD><BODY><%Username=Server.URLEncode("BillGates")%><AHref="/nextpage.asp?<%=UserName%>">點(diǎn)擊這里</a></BODY></HTML>這個(gè)腳本將BillGates賦值給Username的變量,然后將它通過(guò)QueryString傳遞給nextpage.asp,那么在nextpage.asp中就可以接受,然后繼續(xù)進(jìn)行這個(gè)參數(shù)的傳遞。例如:下面就是nextpage.asp的一個(gè)示例:<HTML><HEAD><TITLE>NextPage</TITLE></HEAD><BODY><%Username=Server.URLEncode("Request.QueryString("Username"))%><AHREF="/thirdpage.asp?<%=Username%>">點(diǎn)擊這里</a></body></html>

這個(gè)腳本的優(yōu)點(diǎn)是適用于所有瀏覽器,但是用這樣的傳遞來(lái)保存信息實(shí)在太麻煩了,所有的連接都要考慮到,每一個(gè)ASP都必須相應(yīng)處理一下,而且用戶很可能“一不小心”就溜出了這種跟蹤之外。另外,修改起來(lái)也過(guò)于麻煩。另一個(gè)缺點(diǎn)是針對(duì)不同的瀏覽器必須考慮長(zhǎng)度限制,同時(shí)安全性沒(méi)有保證。

(2)利用Form的hidden類型進(jìn)行信息傳遞如果確實(shí)需要傳遞大量信息而又不想選用Session變量,那么只有利用Form的Hidden類型。如下例:

<HTML><HEAD><TITLE>Form傳參示例</TITLE></HEAD><BODY><%Username="BillGates"%><FORMMETHOD="Post"Action="/nextpage.asp"><INPUTName="Username"TYPE="HIDDEN"VALUE="<%=Username%>"><inputtype="submit"name="下一頁(yè)"></Form></Body></HTML>

這個(gè)頁(yè)面包括一個(gè)表單,其中有一個(gè)隱含類型名字為Username,同時(shí)賦予Username變量的值。表單上有一個(gè)Submit按鈕,當(dāng)按鈕點(diǎn)擊后,在hiden類型中存放的Username的值將傳遞到下一個(gè)網(wǎng)頁(yè)上,在下一個(gè)網(wǎng)頁(yè)進(jìn)行處理,然后以同樣方式傳遞到另外一個(gè)新的主頁(yè)上,下面是nextpage.asp的例子:<HTML><HEAD><TITLE>下一頁(yè)</TITLE></HEAD><BODY><%Username=Request.Form("Username")%><FORMMETHOD="Post"Action="/thirdpage.asp"><inputname="Username"Type="hidden"Value="<%=Username%>"><inputtype=submitvalue="再下一頁(yè)"></Form></Body></Html>(3)兩種方法的結(jié)合這兩種方法實(shí)現(xiàn)起來(lái)都十分麻煩,但是,如果偏要不用Cookies和Session變量來(lái)傳遞信息,確實(shí)也別無(wú)良策。同時(shí),這兩種方法確實(shí)可以適用于任何瀏覽器。請(qǐng)注意,如果在任意一頁(yè)中沒(méi)有進(jìn)行這種QueryString字段或者h(yuǎn)idden類型的表單的處理,那么這種跟蹤就停止了。一個(gè)明顯的缺點(diǎn)是不管利用QueryString字段還是利用HiddenForm傳遞信息,安全性都是毫無(wú)保證的,這是由于瀏覽器對(duì)信息的接受是在幾乎毫無(wú)屏障的情況下進(jìn)行的。完全可以將這兩種方法結(jié)合起來(lái),而在接受時(shí)可以沒(méi)有任何區(qū)別。這里面補(bǔ)充的是,對(duì)于Response對(duì)象,可以不指定Form集合和QueryString集合來(lái)進(jìn)行接受,這時(shí)系統(tǒng)會(huì)自動(dòng)辨認(rèn)。見(jiàn)下面這個(gè)例子:

<HTML><HEAD><TITLE>下一頁(yè)</TITLE></HEAD><BODY><%Username=Request("Username")%><!注:就是上面這個(gè)腳本,QueryString和hidden的Form都可以正確接收><FormMethod="Post"Action="/nextpage.asp"><inputname="Username"Type="Hidden"Value="<%=Username%>"><inputtype=Submitvalue="下一頁(yè)"></FORM><ahref=/nextpage.asp?<%=ServerURLEncode(Username)%>點(diǎn)擊這里</a></BODY></HTML>在這個(gè)例子中,變量Username被賦值而無(wú)須知道上一頁(yè)是利用的Hiddenform域還是QueryString來(lái)傳遞參數(shù)。在以后編制ASP時(shí),這種Request("Username")形式的簡(jiǎn)易調(diào)用將十分常用。

6.2.4ServerVariables

在瀏覽器中瀏覽網(wǎng)頁(yè)的時(shí)候使用的傳輸協(xié)議是HTTP,在HTTP的標(biāo)題文件中會(huì)記錄一些客戶端的信息,如:客戶的IP地址等等。有時(shí)服務(wù)器端需要根據(jù)不同的客戶端信息做出不同的反應(yīng),這時(shí)候就需要用ServerVariables集合獲取所需信息。語(yǔ)法:Request.ServerVariables(服務(wù)器環(huán)境變量)由于服務(wù)器環(huán)境變量較多,表5-1中僅列出了一些常用的變量。ALL_HTTP客戶端發(fā)送的所有HTTP標(biāo)題文件。CONTENT_LENGTH客戶端發(fā)出內(nèi)容的長(zhǎng)度。CONTENT_TYPE內(nèi)容的數(shù)據(jù)類型。如:“text/html”。同附加信息的查詢一起使用,如HTTP查詢

GET、POST和PUT。LOCAL_ADDR返回接受請(qǐng)求的服務(wù)器地址。如果在綁定多個(gè)IP地址的多宿主機(jī)器上查找請(qǐng)求所使用的地址時(shí),這條變量非常重要。LOGON_USER用戶登錄WindowsNT的帳號(hào)。QUERY_STRING查詢HTTP請(qǐng)求中問(wèn)號(hào)(?)后的信息。

REMOTE_ADDR發(fā)出請(qǐng)求的遠(yuǎn)程主機(jī)(client)的

IP地址。

REMOTE_HOST發(fā)出請(qǐng)求的主機(jī)(client)名稱。如果服務(wù)器無(wú)此信息,它將設(shè)置為空的REMOTE_ADDR變量。REQUEST_METHOD該方法用于提出請(qǐng)求。相當(dāng)于用于HTTP的GET、HEAD、POST等等。SERVER_NAME出現(xiàn)在自引用URL中的服務(wù)器主機(jī)名、DNS或IP地址。SERVER_PORT發(fā)送請(qǐng)求的端口號(hào)。表5-1服務(wù)器環(huán)境變量

可以使用以下腳本打印出所有的服務(wù)器環(huán)境變量。

<TABLE><TR><TD><B>ServerVariable</B></TD><TD><B>Value</B></TD></TR><%ForEachnameInRequest.ServerVariables%><TR><TD><%=name%></TD><TD><%=Request.ServerVariables(name)%><%Next%></TD></TR></TABLE>一個(gè)非常有用的實(shí)例是,可以利用ServerVariables,如REMOTE_ADDR來(lái)規(guī)定來(lái)自哪些IP地址的客戶機(jī)可以訪問(wèn)你的系統(tǒng),以保護(hù)你的頁(yè)面不被某些用戶瀏覽。這段代碼留給讀者完成。

6.3Response對(duì)象Request是獲取客戶端HTTP信息,相反Response對(duì)象用來(lái)控制發(fā)送給用戶的信息,包括直接發(fā)送信息給瀏覽器、重定向?yàn)g覽器到另一個(gè)URL或設(shè)置cookie的值。語(yǔ)法:Response.collection|property|method

6.3.1屬性(1)BufferBuffer屬性指示是否緩沖頁(yè)輸出。當(dāng)緩沖頁(yè)輸出時(shí),只有當(dāng)前頁(yè)的所有服務(wù)器腳本處理完畢或者調(diào)用了Flush或End方法后,服務(wù)器才將響應(yīng)發(fā)送給客戶端瀏覽器,服務(wù)器將輸出發(fā)送給客戶端瀏覽器后就不能再設(shè)置Buffer屬性。因此應(yīng)該在.asp文件的第一行調(diào)用Response.Buffer。(2)CharsetCharset

屬性將字符集名稱附加到Response對(duì)象中content-type標(biāo)題的后面。對(duì)于不包含Response.Charset屬性的ASP頁(yè),content-type標(biāo)題將為:content-type:text/html。

可以在.asp文件中指定content-type標(biāo)題,如:<%Response.Charset="gb2312")%>將產(chǎn)生以下結(jié)果:content-type:text/html;charset=gb2312

注意,無(wú)論字符串表示的字符集是否有效,該功能都會(huì)將其插入content-type標(biāo)題中。且如果某個(gè)頁(yè)包含多個(gè)含有Response.Charset的標(biāo)記,則每個(gè)Response.Charset都將替代前一個(gè)CharsetName。這樣,字符集將被設(shè)置為該頁(yè)中Response.Charset的最后一個(gè)實(shí)例所指定值。(3)ContentTypeContentType屬性指定服務(wù)器響應(yīng)的HTTP內(nèi)容類型。如果未指定ContentType,默認(rèn)為text/html。(4)ExpiresExpires屬性指定了在瀏覽器上緩沖存儲(chǔ)的頁(yè)距過(guò)期還有多少時(shí)間。如果用戶在某個(gè)頁(yè)過(guò)期之前又回到此頁(yè),就會(huì)顯示緩沖區(qū)中的頁(yè)面。如果設(shè)置response.expires=0,則可使緩存的頁(yè)面立即過(guò)期。這是一個(gè)較實(shí)用的屬性,當(dāng)客戶通過(guò)ASP的登陸頁(yè)面進(jìn)入Web站點(diǎn)后,應(yīng)該利用該屬性使登陸頁(yè)面立即過(guò)期,以確保安全。(5)ExpiresAbsolute

與Expires屬性不同ExpiresAbsolute屬性指定緩存于瀏覽器中的頁(yè)面的確切到期日期和時(shí)間。在未到期之前,若用戶返回到該頁(yè),該緩存中的頁(yè)面就顯示。如果未指定時(shí)間,該主頁(yè)在當(dāng)天午夜到期。如果未指定日期,則該主頁(yè)在腳本運(yùn)行當(dāng)天的指定時(shí)間到期。如下示例指定頁(yè)面在1998年12月10日上午9:00分30秒到期。<%Response.ExpiresAbsolute=#Dec12,19989:00:30#%>

6.3.2方法(1)Clear方法可以用Clear方法清除緩沖區(qū)中的所有HTML輸出。但Clear方法只清除響應(yīng)正文而不清除響應(yīng)標(biāo)題??梢杂迷摲椒ㄌ幚礤e(cuò)誤情況。但是如果沒(méi)有將Response.Buffer設(shè)置為T(mén)RUE,則該方法將導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。(2)End方法End方法使Web服務(wù)器停止處理腳本并返回當(dāng)前結(jié)果。文件中剩余的內(nèi)容將不被處理。如果Response.Buffer已設(shè)置為T(mén)RUE,則調(diào)用Response.End將緩沖輸出。

(3)Flush方法Flush方法立即發(fā)送緩沖區(qū)中的輸出。如果沒(méi)有將Response.Buffer設(shè)置為T(mén)RUE,則該方法將導(dǎo)致運(yùn)行時(shí)錯(cuò)誤。(4)Redirect方法Redirect方法使瀏覽器立即重定向到程序指定的URL。這也是一個(gè)經(jīng)常用到的方法,利用此方法,程序員可以根據(jù)客戶的不同響應(yīng),為不同的客戶指定不同的頁(yè)面或根據(jù)不同的情況指定不同的頁(yè)面。一旦使用了

Redirect方法,任何在頁(yè)中顯式設(shè)置的響應(yīng)正文內(nèi)容都將被忽略。然而,此方法不向客戶端發(fā)送該頁(yè)設(shè)置的其它

HTTP標(biāo)題,將產(chǎn)生一個(gè)將重定向

URL作為鏈接包含的自動(dòng)響應(yīng)正文。Redirect方法發(fā)送下列顯式標(biāo)題,其中

URL是傳遞給該方法的值。如:<%Response.redirect("www.edu.cn")%>(5)Write方法Write方法是平時(shí)最常用的方法之一,它是將指定的字符串寫(xiě)到當(dāng)前的HTTP輸出。6.3.3集合Response對(duì)象只有一個(gè)集合——Cookie。Cookies集合設(shè)置cookie的值。若指定的cookie不存在,則創(chuàng)建它。若存在,則設(shè)置新的值并且將舊值刪去。語(yǔ)法:Response.Cookies(cookie)[(key)|.attribute]=value

這里的cookie是指定cookie的名稱。而如果指定了key,則該cookie就是一個(gè)字典。attribute指定cookie自身的有關(guān)信息。attribute參數(shù)可以是下列之一:Domain若被指定,則cookie將被發(fā)送到對(duì)該域的請(qǐng)求中去。Expires指定cookie的過(guò)期日期。為了在會(huì)話結(jié)束后將cookie存儲(chǔ)在客戶端磁盤(pán)上,必須設(shè)置該日期。若此項(xiàng)屬性的設(shè)置未超過(guò)當(dāng)前日期,則在任務(wù)結(jié)束后cookie將到期。HasKeys指定cookie是否包含關(guān)鍵字。Path若被指定,則cookie將只發(fā)送到對(duì)該路徑的請(qǐng)求中。如果未設(shè)置該屬性,則使用應(yīng)用程序的路徑。下面通過(guò)一段程序來(lái)說(shuō)明Request和Response的應(yīng)用。程序sample6-04.asp<%DimuserDimflagDimpwdDimsayResponse.buffer=true'開(kāi)啟緩沖頁(yè)面功能Response.ContentType="text/HTML"Response.Charset="gb2312"user=Request.Form("username")pwd=Request.Form("password")say=Request.QueryString("say")%>

<formmethod="POST"action="sample6-04.asp"><p>用戶名:<inputtype="text"name="username"size="12"><br>

令:<inputtype="password"name="password"size="12"><br><inputtype="submit"value="提交"name="B1"><inputtype="reset"value="取消"name="B2"></p></form><%Ifsay=1thenResponse.Write"歡迎光臨寒舍!"EndIfIfsay>1thenResponse.Write"歡迎再次光臨!"EndIfIfuser="adm"andpwd="adm"Then頁(yè)面輸出EndIf%><%Response.write"<p><ahref='sample6-05.asp?flag="&flag&"'>Web數(shù)據(jù)庫(kù)技術(shù)</a></p>"%>程序

sample6-05.asp:

<%Dimsaysay=Request.QueryString("flag")Response.writesaySelectcasesaycase"1"Response.Redirect"sample6-04.asp?say=1"case"2"Response.Redirect"sample6-04.asp?say=2"case"3"

Response.Redirect"sample6-04.asp?say=3"case"0"Response.Redirect"sample6-04.asp?say=0"EndSelect%>

將這兩個(gè)程序放在有執(zhí)行權(quán)限的

Web虛擬目錄下,并以http方式訪問(wèn)sample6-04.asp。當(dāng)?shù)谝淮卧L問(wèn)sample6-04.asp文件時(shí),頁(yè)面上出現(xiàn)一個(gè)Form并提示輸入用戶名和口令,如果你輸入用戶名:adm;口令:adm,則會(huì)出現(xiàn)如圖6-3的頁(yè)面:圖6-3adm用戶首次訪問(wèn)sample6-04.asp的結(jié)果如果輸入用戶名:guest;口令:guest,則僅出現(xiàn)如圖6-4的頁(yè)面:圖6-4guest用戶首次訪問(wèn)sample6-04.asp的結(jié)果程序分析如下:由于設(shè)置了頁(yè)面緩存,當(dāng)使用guest登陸時(shí),判斷程序自動(dòng)清空其之前所有存儲(chǔ)在緩存中的頁(yè)面,而僅將其后腳本程序執(zhí)行的結(jié)果顯示出來(lái)。第一次sample6-04.asp頁(yè)面時(shí)僅僅顯示一個(gè)Form對(duì)話框,是因?yàn)榇藭r(shí)程序判斷到用戶既非adm,也不是guest和vip,所以執(zhí)行Response.End,立即將存儲(chǔ)在緩存中的Form顯示出來(lái),并停止其后的一切腳本處理,包括純HTML代碼的顯示。無(wú)論是用adm還是guest或vip登陸該頁(yè)面都可以看到一個(gè)超鏈接,該超鏈接指向文件web1.asp。當(dāng)點(diǎn)擊該超鏈接時(shí),sample6-04.asp將變量flag的值作為參數(shù)發(fā)送給sample6-05.asp,而后者則根據(jù)該參數(shù)的值來(lái)做出判斷,并依據(jù)不同情況使用Response.Redirect再?gòu)?qiáng)行返回sample6-04.asp,并也將一個(gè)變量say的值作為參數(shù)發(fā)送給sample6-04.asp。如此一來(lái),sample6-04.asp又會(huì)根據(jù)此參數(shù)來(lái)做出不同的反應(yīng)。6.4Application和Session對(duì)象

在ASP的內(nèi)建對(duì)象中除了用于發(fā)送、接收和處理數(shù)據(jù)的對(duì)象外,還有一些非常實(shí)用和重要的對(duì)象。在同一虛擬目錄及其子目錄下的所有.asp文件構(gòu)成了ASP應(yīng)用程序。使用Application對(duì)象,可以在給定的應(yīng)用程序的所有用戶之間共享信息,并在服務(wù)器運(yùn)行期間持久的保存數(shù)據(jù)。而且,Application對(duì)象還有控制訪問(wèn)應(yīng)用層數(shù)據(jù)的方法和可用于在應(yīng)用程序啟動(dòng)和停止時(shí)觸發(fā)過(guò)程的事件。

6.4.1Application對(duì)象1.屬性雖然Application對(duì)象沒(méi)有內(nèi)置的屬性,但可以使用以下句法設(shè)置用戶定義的屬性,也可稱為集合。Application("屬性/集合名稱")=值使用如下腳本聲明并建立Application對(duì)象的屬性。<%Application("MyVar")="Hello"SetApplication("MyObj")=Server.CreateObject("MyComponent")%>一旦分配了Application對(duì)象的屬性,它就會(huì)持久地存在,直到關(guān)閉Web服務(wù)器服務(wù)使Application停止。由于存儲(chǔ)在Application對(duì)象中的數(shù)值可以被應(yīng)用程序的所有用戶讀取,所以Application對(duì)象的屬性特別適合在應(yīng)用程序的用戶之間傳遞信息。

2.方法Application對(duì)象有兩個(gè)方法,它們都是用于處理多個(gè)用戶對(duì)存儲(chǔ)在Application中的數(shù)據(jù)進(jìn)行寫(xiě)入的問(wèn)題。(1)Lock方法禁止其他客戶修改Application對(duì)象的屬性

Lock方法阻止其他客戶修改存儲(chǔ)在Application對(duì)象中的變量,以確保在同一時(shí)刻僅有一個(gè)客戶可修改和存取Application變量。如果用戶沒(méi)有明確調(diào)用Unlock方法,則服務(wù)器將在.asp文件結(jié)束或超時(shí)后即解除對(duì)Application對(duì)象的鎖定。(2)Unlock方法允許其他客戶修改Application對(duì)象的屬性在上面的例子中,上述例子中,Unlock方法解除對(duì)象的鎖定,使得下一個(gè)客戶端能夠增加NumVisits的值。

3.事件(1)Application_OnStart

Application_OnStart事件在首次創(chuàng)建新的會(huì)話(即Session_OnStart事件)之前發(fā)生。當(dāng)Web服務(wù)器啟動(dòng)并允許對(duì)應(yīng)用程序所包含的文件進(jìn)行請(qǐng)求時(shí)就觸發(fā)Application_OnStart事件。Application_OnStart事件的處理過(guò)程必須寫(xiě)在Global.asa文件之中。Application_OnStart事件的語(yǔ)法如下:<SCRIPTLANGUAGE=ScriptLanguageRUNAT=Server>SubApplication_OnStart…EndSub</SCRIPT>(2)Application_OnEnd

Application_OnEnd事件在應(yīng)用程序退出時(shí)于

Session_OnEnd事件之后發(fā)生,Application_OnEnd事件的處理過(guò)程也必須寫(xiě)在

Global.asa文件之中。使用

Application對(duì)象時(shí)必須注意:

1)不能在Application對(duì)象中存儲(chǔ)ASP內(nèi)建對(duì)象。例如,下面的每一行都返回一個(gè)錯(cuò)誤。

<%SetApplication("var1")=SessionSetApplication("var2")=RequestSetApplication("var3")=ResponseSetApplication("var4")=ServerSetApplication("var5")=ApplicationSetApplication("var6")=ObjectContext%>2)若將一個(gè)數(shù)組存儲(chǔ)在Application對(duì)象中,請(qǐng)不要直接更改存儲(chǔ)在數(shù)組中的元素。例如,下列的腳本無(wú)法運(yùn)行。

<%Application("StoredArray")(3)="newvalue"%>

這是因?yàn)锳pplication對(duì)象是作為集合被實(shí)現(xiàn)的。數(shù)組元素StoredArray(3)未獲得新的賦值。而此值將包含在Application對(duì)象集合中,并將覆蓋此位置以前存儲(chǔ)的任何信息。建議將數(shù)組存儲(chǔ)在Application對(duì)象中時(shí),在檢索或改變數(shù)組中的對(duì)象前獲取數(shù)組的一個(gè)副本。在對(duì)數(shù)組操作時(shí),應(yīng)再將數(shù)組全部存儲(chǔ)在Application對(duì)象中,這樣所做的任何改動(dòng)將被存儲(chǔ)下來(lái)。下面的程序即采用了上述的方法。程序

sample6-07.asp<%dimMyArray()RedimMyArray(5)MyArray(0)="hello"MyArray(1)="someotherstring"Application.LockApplication("StoredArray")=MyArrayApplication.UnlockResponse.Redirect"sample6-08.asp"%>程序sample6-08.asp<%LocalArray=Application("StoredArray")LocalArray(1)="there"Response.WriteLocalArray(0)&LocalArray(1)Application.LockApplication("StoredArray")=LocalArrayApplication.Unlock%>6.4.2Session對(duì)象與Application對(duì)象具有相近作用的另一個(gè)非常實(shí)用的ASP內(nèi)建對(duì)象就是Session??梢允褂肧ession對(duì)象存儲(chǔ)特定的用戶會(huì)話所需的信息。當(dāng)用戶在應(yīng)用程序的頁(yè)之間跳轉(zhuǎn)時(shí),存儲(chǔ)在Session對(duì)象中的變量不會(huì)清除,而用戶在應(yīng)用程序中訪問(wèn)頁(yè)面時(shí),這些變量始終存在。當(dāng)用戶請(qǐng)求來(lái)自應(yīng)用程序的Web頁(yè)時(shí),如果該用戶還沒(méi)有會(huì)話,則Web服務(wù)器將自動(dòng)創(chuàng)建一個(gè)Session對(duì)象。當(dāng)會(huì)話過(guò)期或被放棄后,服務(wù)器將終止該會(huì)話。通過(guò)向客戶程序發(fā)送唯一的Cookie可以管理服務(wù)器上的Session對(duì)象。當(dāng)用戶第一次請(qǐng)求ASP應(yīng)用程序中的某個(gè)頁(yè)面時(shí),ASP要檢查HTTP頭信息,查看是否有在報(bào)文中有名為ASPSESSIONID的Cookie發(fā)送過(guò)來(lái),如果有,則服務(wù)器會(huì)啟動(dòng)新的會(huì)話,并為該會(huì)話生成一個(gè)全局唯一的值,在把這個(gè)值作為新ASPSESSIONIDCookie的值發(fā)送給客戶端,正是使用這種Cookie,可以訪問(wèn)存儲(chǔ)在服務(wù)器上的屬于客戶程序的信息。Session對(duì)象最常見(jiàn)的作用就是存儲(chǔ)用戶的首選項(xiàng)。例如,如果用戶指明不喜歡查看圖形,就可以將該信息存儲(chǔ)在Session對(duì)象中。另外其還經(jīng)常被用在鑒別客戶身份的程序中。要注意的是,會(huì)話狀態(tài)僅在支持cookie的瀏覽器中保留,如果客戶關(guān)閉了Cookie選項(xiàng),Session也就不能發(fā)揮作用了。1.屬性

(1)SessionID屬性

SessionID屬性返回用戶的會(huì)話標(biāo)識(shí)。在創(chuàng)建會(huì)話時(shí),服務(wù)器會(huì)為每一個(gè)會(huì)話生成一個(gè)單獨(dú)的標(biāo)識(shí)。會(huì)話標(biāo)識(shí)以長(zhǎng)整形數(shù)據(jù)類型返回。在很多情況下SessionID可以用于Web頁(yè)面注冊(cè)統(tǒng)計(jì)。

(2)TimeOut屬性Timeout屬性以分鐘為單位為該應(yīng)用程序的Session對(duì)象指定超時(shí)時(shí)限。如果用戶在該超時(shí)時(shí)限之內(nèi)不刷新或請(qǐng)求網(wǎng)頁(yè),則該會(huì)話將終止。

2.方法Session對(duì)象僅有一個(gè)方法,就是Abandon。Abandon方法可以刪除所有存儲(chǔ)在Session對(duì)象中的對(duì)象并釋放這些對(duì)象的源。如果未明確地調(diào)用Abandon方法,一旦會(huì)話超時(shí),服務(wù)器將刪除這些對(duì)象。當(dāng)服務(wù)器處理完當(dāng)前頁(yè)時(shí),釋放會(huì)話狀態(tài)。如:<%Session.Abandon%>3.事件Session對(duì)象有兩個(gè)事件可用于在Session對(duì)象啟動(dòng)和釋放是運(yùn)行過(guò)程。(1)Session_OnStart事件在服務(wù)器創(chuàng)建新會(huì)話時(shí)發(fā)生。服務(wù)器在執(zhí)行請(qǐng)求的頁(yè)之前先處理該腳本。Session_OnStart事件是設(shè)置會(huì)話期變量的最佳時(shí)機(jī),因?yàn)樵谠L問(wèn)任何頁(yè)之前都會(huì)先設(shè)置它們。盡管在Session_OnStart事件包含Redirect或End方法調(diào)用的情況下Session對(duì)象仍會(huì)保持,然而服務(wù)器將停止處理Global.asa文件并觸發(fā)Session_OnStart事件的文件中的腳本。為了確保用戶在打開(kāi)某個(gè)特定的Web頁(yè)時(shí)始終啟動(dòng)一個(gè)會(huì)話,就可以在Session_OnStart事件中調(diào)用Redirect方法。當(dāng)用戶進(jìn)入應(yīng)用程序時(shí),服務(wù)器將為用戶創(chuàng)建一個(gè)會(huì)話并處理Session_OnStart事件腳本??梢詫⒛_本包含在該事件中以便檢查用戶打開(kāi)的頁(yè)是不是啟動(dòng)頁(yè),如果不是,就指示用戶調(diào)用Response.Redirect方法啟動(dòng)網(wǎng)頁(yè)。如:<SCRIPTRUNAT=ServerLanguage=VBScript>SubSession_OnStartstartPage="/MyApp/StartHere.asp"currentPage=Request.ServerVariables("SCRIPT_NAME")ifstrcomp(currentPage,startPage,1)thenResponse.Redirect(startPage)endifEndSub</SCRIPT>

上述程序只能在支持cookie的瀏覽器中運(yùn)行。因?yàn)椴恢С謈ookie的瀏覽器不能返回SessionIDcookie,所以,每當(dāng)用戶請(qǐng)求Web頁(yè)時(shí),服務(wù)器都會(huì)創(chuàng)建一個(gè)新會(huì)話。這樣,對(duì)于每個(gè)請(qǐng)求服務(wù)器都將處理Session_OnStart腳本并將用戶重定向到啟動(dòng)頁(yè)中。(2)Session_OnEnd事件在會(huì)話被放棄或超時(shí)發(fā)生。使用Session對(duì)象需要注意的事項(xiàng)與Application對(duì)象相近,請(qǐng)參照前文。會(huì)話可以通過(guò)以下三種方式啟動(dòng):

一個(gè)新用戶請(qǐng)求訪問(wèn)一個(gè)URL,該URL標(biāo)識(shí)了某個(gè)應(yīng)用程序中的.asp文件,并且該應(yīng)用程序的Global.asa文件包含Session_OnStart過(guò)程。

用戶在Session對(duì)象中存儲(chǔ)了一個(gè)值。

用戶請(qǐng)求了一個(gè)應(yīng)用程序的.asp文件,并且該應(yīng)用程序的Global.asa文件使用<OBJECT>標(biāo)簽創(chuàng)建帶有會(huì)話作用域的對(duì)象的實(shí)例。如果用戶在指定時(shí)間內(nèi)沒(méi)有請(qǐng)求或刷新應(yīng)用程序中的任何頁(yè),會(huì)話將自動(dòng)結(jié)束。這段時(shí)間的默認(rèn)值是20分鐘??梢酝ㄟ^(guò)在“Internet服務(wù)管理器”中設(shè)置“應(yīng)用程序選項(xiàng)”屬性頁(yè)中的“會(huì)話超時(shí)”屬性改變應(yīng)用程序的默認(rèn)超時(shí)限制設(shè)置。應(yīng)依據(jù)Web應(yīng)用程序的要求和服務(wù)器的內(nèi)存空間來(lái)設(shè)置此值。例如,如果希望瀏覽Web應(yīng)用程序的用戶在每一頁(yè)僅停留幾分鐘,就應(yīng)該縮短會(huì)話的默認(rèn)超時(shí)值。過(guò)長(zhǎng)的會(huì)話超時(shí)值將導(dǎo)致打開(kāi)的會(huì)話過(guò)多而耗盡服務(wù)器的內(nèi)存資源。對(duì)于一個(gè)特定的會(huì)話,如果想設(shè)置一個(gè)小于默認(rèn)超時(shí)值的超時(shí)值,可以設(shè)置Session對(duì)象的Timeout屬性。例如,

<%Session.Timeout=5%>將超時(shí)值設(shè)置為5分鐘。當(dāng)然也可以設(shè)置一個(gè)大于默認(rèn)設(shè)置的超時(shí)值,Session.Timeout屬性決定超時(shí)值。還可以通過(guò)Session對(duì)象的Abandon方法顯式結(jié)束一個(gè)會(huì)話。例如,在表格中提供一個(gè)“退出”按鈕,將按鈕的

ACTION參數(shù)設(shè)置為包含下列命令的.asp文件的URL。例如,

<%Session.Abandon%>4.Session的工作原理Session其實(shí)是利用Cookie進(jìn)行信息處理的(參見(jiàn)前面有關(guān)Cookies的介紹)。當(dāng)用戶首先進(jìn)行了請(qǐng)求后,服務(wù)端就在用戶瀏覽器上創(chuàng)建了一個(gè)Cookie,當(dāng)這個(gè)Session結(jié)束時(shí),其實(shí)就是意味著這個(gè)Cookie就過(guò)期了。為這個(gè)用戶創(chuàng)建的Cookie的名稱是ASPSESSIONID。這個(gè)Cookie的唯一目的就是為每一個(gè)用戶提供不同的身份認(rèn)證。如果對(duì)名字是ASPSESSIONID的COOKIE感到好奇,可以利用ServerVariables集合的COOKIEHeader來(lái)接受這個(gè)信息,如下面這個(gè)腳本:<%=Request.ServerVariables("HTTPCOOKIE")%>多次刷新屏幕,顯示結(jié)果依然不變。Session變量自己不會(huì)存在用戶瀏覽器上。不過(guò),ASPSESSIONID這個(gè)cookie需要使用session變量。服務(wù)器使用ASPSESSIONIDcookie來(lái)將特定的用戶和特定的session信息聯(lián)系起來(lái)。沒(méi)有cookie的話,服務(wù)器就不會(huì)了解到每一個(gè)特定用戶在網(wǎng)站中移動(dòng)的信息。利用SessionID變量存儲(chǔ)ASPSESSIONIDcookie和直接對(duì)名為ASPSESSIONID的cookie賦值有很大不同。微軟利用了一個(gè)復(fù)雜的數(shù)學(xué)算法對(duì)SessionID進(jìn)行了加密措施,以防止黑客猜測(cè)出SessionID的值并且依據(jù)這個(gè)獲得不該獲得的身份或權(quán)限??梢杂脙煞N方法屏蔽掉SessionID:一種是將全站進(jìn)行屏蔽;另一種是對(duì)一個(gè)單獨(dú)ASP進(jìn)行相應(yīng)屏蔽。如果想要將整個(gè)站點(diǎn)的Session操作進(jìn)行屏蔽,可以使用“Internet信息服務(wù)→默認(rèn)站點(diǎn)屬性→主目錄→配置→應(yīng)用程序選項(xiàng)→啟用會(huì)話狀況”。取消“啟用會(huì)話狀況”選項(xiàng)的選擇。

還可以在特定的ASP程序的首行加入使之屏蔽的語(yǔ)句來(lái)進(jìn)行這種操作。如:<%EnableSessionState=False%>

由于Session對(duì)象使用了Cookies,那么它的兼容性就受到了限制,例如有些瀏覽器提供了屏蔽Cookie的選項(xiàng)。由于Cookie不能適用于所有瀏覽器,那么在建站時(shí)必須注意,如果你的網(wǎng)站定位于大眾通用,就必須考慮各種不同的用戶情況。

6.5Global.asa文件的使用

在上一節(jié)中介紹了兩個(gè)非常實(shí)用的

ASP內(nèi)建對(duì)象Application和Session的使用方法。由于這兩者的OnStart、OnEnd事件的腳本都必須在Global.asa文件中聲明,因此,本節(jié)將詳細(xì)介紹Global.asa文件的使用方法。Global.asa文件其實(shí)是一個(gè)可選文件,程序編寫(xiě)者可以在該文件中指定事件腳本,并聲明具有會(huì)話和應(yīng)用程序作用域的對(duì)象。該文件的內(nèi)容不是用來(lái)給用戶顯示的,而是用來(lái)存儲(chǔ)事件信息和由應(yīng)用程序全局使用的對(duì)象。該文件的名稱必須是Global.asa且必須存放在應(yīng)用程序的根目錄中。每個(gè)應(yīng)用程序只能有一個(gè)Global.asa文件。

在Global.asa文件中,如果包含的腳本沒(méi)有用<SCRIPT>標(biāo)記封裝,或定義的對(duì)象沒(méi)有會(huì)話或應(yīng)用程序作用域,則服務(wù)器將返回錯(cuò)誤。可以用任何支持腳本的語(yǔ)言編寫(xiě)Global.asa文件中包含的腳本。如果多個(gè)事件使用同一種腳本語(yǔ)言,就可以將它們組織在一組<SCRIPT>標(biāo)記中。在Global.asa文件中聲明的過(guò)程只能從一個(gè)或多個(gè)與Application_OnStart、Application_OnEnd、Session_OnStart和Session_OnEnd事件相關(guān)的腳本中調(diào)用。在基于ASP的應(yīng)用程序的ASP頁(yè)中,它們是不可用的。如果要在應(yīng)用程序之間共享過(guò)程,可在單獨(dú)的文件中聲明這些過(guò)程,然后使用服務(wù)器端包容(SSI)語(yǔ)句將該文件包含在調(diào)用該過(guò)程的ASP程序中。通常,包含文件的擴(kuò)展名應(yīng)為.inc。

下面是一個(gè)很標(biāo)準(zhǔn)的Global.asa文件:

<SCRIPTLANGUAGE="VBScript"RUNAT="Server">SubApplication_OnStartVisitorCountFilename=Server.MapPath("/ex2")+"\VisitCount.txt"SetFileObject=Server.CreateObject("Scripting.FileSystemObject")SetOut=FileObject.OpenTextFile(VisitorCountFilename,1,FALSE,FALSE)Application("visitors")=Out.ReadLineApplication("VisitorCountFilename")=VisitorCountFilenameEndSub'=========================================================SubApplication_OnEndSetFileOutObject=Server.CreateObject("Scripting.FileSystemObject")SetOut=FileOutObject.CreateTextFile(Application("VisitorCountFilename"),TRUE,FALSE)Out.WriteLine(application("visitors"))EndSub'=========================================================SubSession_OnStartSession.Timeout=5Application("visitors")=Application("visitors")+1Session("ID")=Session.SessionIDEndSub</SCRIPT>

在這個(gè)Global.asa程序中,涉及到了ASP的FileAccess組件(有關(guān)ASP組件方面的知識(shí)請(qǐng)查閱有關(guān)資料),它可以提供用于訪問(wèn)文件系統(tǒng)的方法、屬性和集合。在這里,它起到了在服務(wù)器上創(chuàng)建新文件并對(duì)文件進(jìn)行寫(xiě)操作的作用。這其實(shí)是一個(gè)ASP頁(yè)面訪問(wèn)記數(shù)器應(yīng)用程序的Global文件,首先當(dāng)客戶首次訪問(wèn)該應(yīng)用程序的首頁(yè)時(shí),過(guò)程Application_OnStart定義了在服務(wù)器上指定的虛擬目錄下新建一個(gè)VisitCount.txt的文本文件,并將文件的路徑和內(nèi)容保存在應(yīng)用程序級(jí)的變量中。而當(dāng)任何一個(gè)客戶訪問(wèn)ASP應(yīng)用程序中的任何一個(gè)頁(yè)面時(shí),過(guò)程S

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論