ASP編程入門進階(一):安裝配置服務(wù)器
鑒于ASP腳本語言是在服務(wù)器端IIS或PWS中解釋和運行,并可動態(tài)生成普通的HTML網(wǎng)頁,然后再傳送到客戶端供瀏覽的這一特點。我們要在本機上進行調(diào)試,那就要求我們的個人電腦具有服務(wù)器的功能。
IIS為何物?IIS是Internet Information Server的縮寫,它是微軟公司主推的Web服務(wù)器。那PWS呢?它就顯得有些古老了:)早期在WIN98,當(dāng)然現(xiàn)在仍有人采用的操作系統(tǒng),PWS(Personal Web Server)是一般用戶最容易得到的web服務(wù)器: 在win98的安裝盤的Add_on\pws目錄下就可以找到pws的安裝程序。而對于IIS是我們所推薦的,也是大部分朋友在使用的,有必要。1,打開控制面板 IIS服務(wù)器算是安裝OK了,那具體有什么用處?又該如何使用呢?
首先IIS的作用之一就是可以解釋執(zhí)行ASP網(wǎng)頁代碼,并將結(jié)果顯示出來。當(dāng)然就現(xiàn)在而言,你的機器充當(dāng)?shù)募仁欠⻊?wù)器端,又是客戶端,該技術(shù)對你來說是透明的,你不需要也沒必要去研究它的原理,就這樣去理解去應(yīng)用。
那打開你的瀏覽器,隨便IE,NS,TE還是MYIE,只要是能瀏覽網(wǎng)頁的瀏覽器,在其地址欄輸入:localhost/ 查看即可。出現(xiàn)當(dāng)前該窗口就表示已經(jīng)成功了:WEB服務(wù)正在運行這,就行了?你知道下面怎么辦呢?很是沒頭緒,對吧。費盡心思學(xué)到現(xiàn)在,就是看了人家的一個ASP頁面。那我自己做,調(diào)試自己的ASP網(wǎng)頁又該如何呢?首先,你得想好你的ASP文件總要放在一個地方吧。打開“我的電腦”,在E盤下面建立一個“myasp”文件夾,以后所有的ASP文件先暫時放到這里吧。
然后,從“開始”菜單,“程序”—“附件”—打開“記事本”。在里面敲入 <%=now()%> 接著將文件保存到E:\myasp\文件夾里面,并且命名為time.asp一個很簡單的ASP文件就OK了,下面我們怎么辦?一句話:調(diào)試。怎么調(diào)試?還是輸入我們剛才的http://localhost/ ?很顯然是不行的。那這時候是不是難點來了:我該如何調(diào)試我自己定義的一個文件夾里的ASP文件呢?同樣,一句話:用虛擬目錄。那什么是虛擬目錄?又該如何建立一個虛擬目錄呢?
(引一段話:要從主目錄以外的其他目錄中進行發(fā)布,就必須創(chuàng)建虛擬目錄。“虛擬目錄”不包含在主目錄中,但在顯示給客戶瀏覽器時就象位于主目錄中一樣。虛擬目錄有一個“別名”,供 Web 瀏覽器用于訪問此目錄。別名通常要比目錄的路徑名短,便于用戶輸入。使用別名更安全,因為用戶不知道文件是否真的存在于服務(wù)器上,所以便無法使用這些信息來修改文件。)
對初學(xué)者而言不必理會,重在實踐,用多了自然會理解這段話的意思。
大體上就是讓我剛才的myasp文件夾用一個代號來標(biāo)記,比如就標(biāo)記為myasp,那我調(diào)試的時候只要輸入:http://localhost/myasp/time.asp 就可以調(diào)試了。那如何標(biāo)記呢?也就是如何建立一個虛擬目錄呢?從“控制面板”里面打開“管理工具”,彈出的窗口中右鍵“新建”—“虛擬目錄”,彈出“虛擬目錄創(chuàng)建向?qū)А,再下一步,目錄:瀏覽到E:\myasp即可。緊跟一步,訪問的權(quán)限一定要把“讀取”和“運行腳本”打勾。最終點擊“完成”。 那么剩下的就是調(diào)試該time.asp了。在“Internet信息服務(wù)”里面右鍵time.asp,選擇“瀏覽”就可以看到了。就這么簡單,你已經(jīng)ASP入門了。
ASP編程入門進階(二):認(rèn)識表單
說實話,無論是asp,php還是jsp進行網(wǎng)絡(luò)編程的時候,都離不開和用戶的交互。而人機對話的平臺,基本上是靠相應(yīng)的文本、列表框進行輸入,然后通過按鈕提交送至數(shù)據(jù)庫的。所以學(xué)習(xí)網(wǎng)絡(luò)編程就一定要了解這些輸入平臺相關(guān)的東西:表單(form)其基本格式如下:
可以總結(jié)出:表單即包括<form>...</form>之內(nèi)的相關(guān)內(nèi)容。其中內(nèi)部可以分三大類:input,select,textarea
一,首先看<form>內(nèi)部參數(shù)參數(shù)name:用來表示該表單的唯一名稱,方便一個頁面建立多個表單而不混淆,當(dāng)然更是為了接受頁面的確認(rèn)關(guān)系!(shù)action:顯而易見,是表示當(dāng)前表單中所有內(nèi)容將送交某個頁面去處理。處理包括接受信息,數(shù)據(jù)庫比較添加,修改等。參數(shù)method:即表單的提交方法,含兩種方法:post和get。post是傳輸信息內(nèi)容,get是傳輸url值,具體用法將會在下一節(jié)“內(nèi)置對象request”中介紹到。
二,再來看Input相關(guān)Input表示Form表單中的一種輸入對象,其又隨Type類型的不同而分文本輸入框,密碼輸入框,單選/復(fù)選框,提交/重置按鈕等,下面一一介紹。
1,type=text輸入類型是text,這是我們見的最多也是使用最多的,比如登陸輸入用戶名,注冊輸入電話號碼,電子郵件,家庭住址等等。當(dāng)然這也是Input的默認(rèn)類型。
參數(shù)name:同樣是表示的該文本輸入框名稱。參數(shù)size:輸入框的長度大小。參數(shù)maxlength:輸入框中允許輸入字符的最大數(shù)。參數(shù)value:輸入框中的默認(rèn)值特殊參數(shù)readonly:表示該框中只能顯示,不能添加修改。
2,type=password不用我說,一看就明白的密碼輸入框,最大的區(qū)別就是當(dāng)在此輸入框輸入信息時顯示為保密字符。
參數(shù)和“type=text”相類似。
3,type=file當(dāng)你在BBS上傳圖片,在EMAIL中上傳附件時一定少不了的東西:)
提供了一個文件目錄輸入的平臺,參數(shù)有name,size。
4,type=hidden非常值得注意的一個,通常稱為隱藏域:如果一個非常重要的信息需要被提交到下一頁,但又不能或者無法明示的時候。一句話,你在頁面中是看不到hidden在哪里。最有用的是hidden的值。
5,type=button標(biāo)準(zhǔn)的一windows風(fēng)格的按鈕,當(dāng)然要讓按鈕跳轉(zhuǎn)到某個頁面上還需要加入寫JavaScript代碼
6,type=checkbox多選框,常見于注冊時選擇愛好、性格、等信息。參數(shù)有name,value及特別參數(shù)checked(表示默認(rèn)選擇)其實最重要的還是value值,提交到處理頁的也就是value。(附:name值可以不一樣,但不推薦。)
<form name="form1">
a:<input type="checkbox" name="checkit" value="a" checked><br>
b:<input type="checkbox" name="checkit" value="b"><br>
c:<input type="checkbox" name="checkit" value="c"><br></form>
name值可以不一樣,但不推薦<br>
<form name="form1">
a:<input type="checkbox" name="checkit1" value="a" checked><br>
b:<input type="checkbox" name="checkit2" value="b"><br>
c:<input type="checkbox" name="checkit3" value="c"><br> </form>
7,type=radio即單選框,出現(xiàn)在多選一的頁面設(shè)定中。參數(shù)同樣有name,value及特別參數(shù)checked.
不同于checkbox的是,name值一定要相同,否則就不能多選一。當(dāng)然提交到處理頁的也還是value值。
8,type=image比較另類的一個,自己看看效果吧,可以作為提交式圖片
9,type=submit and type=reset分別是“提交”和“重置”兩按鈕
submit主要功能是將Form中所有內(nèi)容進行提交action頁處理,reset則起個快速清空所有填寫內(nèi)容的功能。
Input的Type總結(jié)下來有10個,還是不少的,呵呵
三,接著再來看Select相關(guān)Select主要要來做下拉菜單,跳轉(zhuǎn)菜單,(下拉)列表。
其本身有內(nèi)嵌代碼<option>...</option>,option參數(shù)value值為傳遞被處理的值,option還有參數(shù)selected,表示默認(rèn)被選中。
1,下拉菜單只是菜單式顯示。
2,跳轉(zhuǎn)菜單在下拉菜單基礎(chǔ)上添加JavaScript成為跳轉(zhuǎn)菜單。
[3,下拉列表和下拉菜單最大的區(qū)別就是select多了一個size值,該值并非長度大小,而是列表的上下高度。
當(dāng)然還有更主要的是:菜單只能選一個,而列表可以選多個,該特殊參數(shù)為multiple
四,最后關(guān)注的Textarea可以將Textarea文本區(qū)域理解為擴大化了的文本輸入框。其參數(shù)沒有value,默認(rèn)值設(shè)定在<textarea>...</textarea>之間。其它參數(shù)還有rows,表示文本區(qū)域的行數(shù);參數(shù)cols,表示文本區(qū)域的列數(shù)。
還有參數(shù)warp,當(dāng)warp=off表示該文本區(qū)域中的不自動換行,當(dāng)然不寫默認(rèn)是自動換行的。
最后總結(jié):input根據(jù)type分10類,select從option處又分菜單和列表,textarea有行有列的文本輸入?yún)^(qū)域
ASP編程入門進階(三):接觸腳本程序
有了前面的html中關(guān)于form的強化知識,是不是在想,下面就可以開始ASP之旅呢?未必。
一般系統(tǒng)學(xué)過ASP的編程人員都會切身體會到:在系統(tǒng)學(xué)習(xí)ASP的內(nèi)置對象和內(nèi)置組件之前,學(xué)會腳本語言是至關(guān)重要的。
為什么這么說呢?為什么要學(xué)腳本語言呢?ASP和腳本語言又有什么關(guān)系呢?
首先說說ASP是貴為何物吧。ASP是Microsoft Active Server Pages的簡稱,它是一種服務(wù)器端腳本環(huán)境,可用來創(chuàng)建交互式 Web 頁并建立強大的 Web 應(yīng)用程序。可以表明ASP是一種基于服務(wù)器端的腳本環(huán)境,那就明白ASP為什么需要IIS支持了,因為IIS即為常用的一類web服務(wù)器;那也就明白為什么要學(xué)腳本語言了,因為ASP提供的是一種腳本環(huán)境。
再次需要說明的是,ASP只是一種環(huán)境,而非一種語言。如果真要形象化地說是ASP是網(wǎng)絡(luò)編程語言的話,那也是屬于一個html+腳本+asp提供的內(nèi)置對象及組件的功能強大的混合語言。
所以,學(xué)點腳本非常重要!其實無論是學(xué)腳本語言,還是其它語言,我認(rèn)為首先需要了解的是該語言涵蓋的各類特性,包括:數(shù)據(jù)類型、事件、方法、 對象、屬性、語法等當(dāng)然這都是些空談,正如在大學(xué)課堂上的某計算機語言課一樣,搞純研究性的就是覺得有些索而無味。還是實用些的好,能解決問題的程序才是好程序。當(dāng)然,語言這東西還是要你去好好鉆研的,比如你寫求絕對值的程序,其實一個abs()函數(shù)就搞定了。你以后需要注意的是語言的函數(shù)、語法
目前有兩種主要的腳本語言:VbScript和JavaScript。因為VbScript作為IIS默認(rèn)的服務(wù)器腳本,所以我們所談所學(xué)的基本是圍繞VbScript為腳本的ASP的,當(dāng)然也不排除有的時候使用javascript.
舉一個很簡單的例子:
<script language="vbscript"> <!-- sub button1_onclick
msgbox (" 歡迎使用vbscript! " ) end sub --> </script>
<script language="javascript"> <!-- function b213()
{ alert("歡迎使用javascript!") } --></script> <form>
<input type="button" name="button1" value="vbs"><br>
<input type="button" name="button2" value="js" onclick="b213()"> </form>
vbscript中的Sub 就是一個事件過程。過程名包含兩部分:一部分為按鈕名,即 Button1(從 < INPUT > 標(biāo)記中的 NAME 屬性獲。涣硪徊糠譃槭录,即 OnClick。兩部分由下劃線 (_) 連接。單擊按鈕時,Internet Explorer 查找并運行相應(yīng)的事件過程,即 Button1_OnClick,而MsgBox 就是一個函數(shù),對于它更具體的參數(shù),你就好好看下了。
一時來勁,可能大家都看到網(wǎng)上有種狂惡心的對話框組,原理是什么呢?請看:
在來個下面來看開頁和退頁彈出對話框的原理吧
script language="vbscript"> <!-- sub window_onload()
msgbox"welcome you!"
end sub sub window_onunload()
msgbox"see you late!" end sub --> </script>
開頁顯示“welcome you!”,關(guān)頁顯示“see you late!”
以上只是一個顯示對話框msgbox,當(dāng)然還有書寫對話框inputbox也順便看下吧。
再來看看幾個實用的函數(shù):len():返回字符串長度或者變量的字節(jié)長度
lef():截取一個字符串的前部分內(nèi)容 right():截取一個字符串的后部分內(nèi)容
<script language=vbs>
text="1234567890abcdefgh" i=10
lentext=len(text) lefttext=left(text,i) righttext=right(text,i)
alert ("文本長度是:"&lentext) alert ("文本左取"&i&" 得的是:"&lefttext) alert ("文本右取"&i&" 得的是:"&righttext) </script>
根據(jù)這幾個,經(jīng)?吹降拈L文章后面加“......”的情況就是如下:
還有個比較重要的函數(shù)replace() 在字符串中查找,替代指定的字符串replace(strtobesearched,strsearchfor,strreplacewith)
strtobesearched是字符串; strsearchfor是被查找的子字符串;strreplacewith 是用來替代的子字符串。
下面的一個就是很有用的文字轉(zhuǎn)換程序
這些都是比較現(xiàn)實較好玩的些,玩中學(xué)習(xí)也不錯:)但畢竟我們是要編程的,說到編寫程序,我知道程序結(jié)構(gòu)可以分:
1,順序結(jié)構(gòu):就是最普通的,從上往下,從左往右執(zhí)行的程序
2,選擇結(jié)構(gòu):給你兩個條件,要不這樣(if ... then),要不那樣(else),任君選擇:)
3,循環(huán)結(jié)構(gòu):給你一個最大發(fā)揮的空間,在不超出這個范圍內(nèi)進行活動(循環(huán)),否則自動退出(跳出循環(huán))。
再復(fù)雜的程序也無非是由這三種結(jié)構(gòu)綜合嵌套運用過來的,你說是吧。
順序結(jié)構(gòu)沒多少要說,因為程序執(zhí)行基本都是這方向。
來看看選擇結(jié)構(gòu),當(dāng)然選擇結(jié)構(gòu)也可以嵌套。
<body> hello <script language="vbscript"> <!--dim thishour
thishour=hour(time)
if thishour<=12 then
document.bgcolor="red"
document.fgcolor="black"
document.write("上午好!")
else if thishour<=18 then
document.bgcolor="blue"
document.fgcolor="white"
document.write("下午好!")
else document.bgcolor="green"
document.fgcolor="yellow"
document.write("晚上好!") end if end if --> </script>
本頁的作用是根據(jù)不同時間顯示不同顏色和歡迎信息。
以上程序很簡單吧,只要能認(rèn)識英文就會懂程序(我是這么理解的:)先把現(xiàn)在的小時提交出來:hour(time);
然后和12比較判斷,如果<=12,肯定是上午了,否則就是下午和晚上;否則里面繼續(xù)條件判斷,如果時間再<=18的話,那肯定就是下午了;最后,不用說,瞎子猜猜也知道是晚上了。有關(guān)上一程序中的document.bgcolor就是文檔的背景色,document.fgcolor就是文檔的前景色(文字色),下一程序是動態(tài)改變背景顏色的。<script language="vbscript"><!--
sub setbgcolor(bcolor) document.bgcolor=bcolor
end sub --> </script> <form>
<input type="radio" name="color" onclick=setbgcolor("red")>red<br>
<input type="radio" name="color" onclick=setbgcolor("gray")>gray<br> </form>
有關(guān)條件選擇結(jié)構(gòu)的嵌套再show出一個表單檢測的程序
<html><head><title>abc</title>
<script language="vbscript">
<!-- sub btnsubmit_onclick
if form1.name.value<>"" then
if form1.addr.value<>"" then
if form1.email.value<>"" then
if instr(form1.email.value,"@")<>0 and instr(form1.email.value,".")<>0 then
form1.submit else
alert"email error!"
end if else alert "enter your email!"
form1.elements("email").focus
end if else alert "enter your address!"
form1.elements("addr").focus
end if else msgbox "enter your name please!"
form1.elements("name").focus
end ifend sub --></script> </head> <body>
<form name="form1" method=post action="bug.html">
your name:<input type="text" name="name"><br>
your addr:<input type="text" name="addr"><br>
your email:<input type="text" name="email"><br>
<input type="button" name="btnsubmit" value="submit"></form> </body> </html>
程序是給出來了,但看起來比較難懂,有時程序執(zhí)行時間也比較重要,所以得精簡程序代碼。正所謂:寫程序容易,寫經(jīng)典程序難啊,那上面的程序還可以換種思維方式。改用javascript(注:學(xué)的是編程思想,不要太過計較腳本類型)
<html><head><title>abc</title><script language="javascript"><!-- function form1_onsubmit()
{ if (document.form1.name.value=="")
{ alert("請設(shè)定您的登陸名。")
document.form1.name.focus()
return false } else if(document.form1.addr.value=="")
{ alert("請?zhí)顚懩牡刂贰?quot;)
document.form1.addr.focus() return false } } --> </script> </head> <body>
<form name="form1" onsubmit="return form1_onsubmit()">
your name:<input type="text" name="name"> <br> your addr:<input type="text" name="addr"><br>
<input type="submit" name="submit" value="submit"> </form> </body> html>
最后來看下循環(huán)結(jié)構(gòu)吧:1到500可不是一個一個寫出來的。
當(dāng)然循環(huán)不只可以用for,還可以用do while...loop等。反正程序這東西是代替我們少做了許多重復(fù)單一無聊的事——只要你合理利用程序。應(yīng)該有些成就吧,學(xué)語言,學(xué)編程就是學(xué)語法語義,學(xué)編程架構(gòu)思想。當(dāng)然這要你有扎實的本語言的基礎(chǔ),基礎(chǔ)是什么?你知道哪些函數(shù)嗎?你知道怎么用程序怎么判斷偶數(shù)嗎(包含了運算)?你知道如何進行表單檢測嗎?你知道哪三種程序架構(gòu)嗎?呵呵,把以上的程序吃透,最好再多看看腳本參考手冊,跟我就可以開始ASP的上路了。
ASP基本語法
建立ASP程序 ASP程序是擴展名為.asp的文本文件,其中包括文字,HTML語句,ASP命令及其他腳本語言。 ASP命令必須放在"<%"與"%>"之間。
程序注釋 為了養(yǎng)成良好的編程風(fēng)格外,適度的注釋不可少,ASP提供了兩中注釋方式1、單引號(),在單引號之后的這行文字都視為注釋 2、rem 關(guān)鍵詞,在REM后的文字,視為注釋
賦值語句 ASP中一般變量的賦值語句是 "=", 而對象是用 set 語句來賦值。
條件語句和循環(huán)語句
了解編程語言的朋友一定知道在程序中控制程序流程的語句主要可以分為條件語句和循環(huán)語句,在 VBScript 中可使用以下條件語句: If...Then...Else 語句 和 Select Case 語句
If...Then...Else 語句用于計算條件是否為 True 或 False,并且根據(jù)計算結(jié)果指定要運行的語句。通常,條件是使用比較運算符對值或變量進行比較的表達式,If...Then...Else 語句可以按照需要進行嵌套。
讓我們來創(chuàng)建兩個范例文件:if1.asp 和 if2.asp
將以下語句剪貼到記事簿中,并保存為 if1.asp( 注意:請將程序中“<”后的空格去掉 )
< html> < head> < TITLE>if1.asp< /TITLE> < /head>< body bgcolor="#FFFFFF">
< form action="if2.asp" method=get>
Your First Name< INPUT NAME="FirstName" MaxLength=20>< p>
Your Last Name< INPUT NAME="LastName" MaxLength=20>< p>
< INPUT TYPE=submit>< INPUT TYPE=reset> < /form> < /body> < /html>
將以下語句剪貼到記事簿中,并保存為 if2.asp < html> < head> < TITLE>ifrespond.asp< /TITLE> < /head> < % fname=request.querystring("Firstname")
lname=request.querystring("Lastname")
If fname="George" and lname="Washington" then %>
Hi.You must be the first president!
< % else %> Hi!Nice to Meet You < %end if %> < /body> < /html>
asp1.asp 產(chǎn)生一個文本輸入框,要求用戶輸入姓、名
asp2.asp 則是用 IF 語句判斷用戶輸入的姓名是否為“George Washington”, 并做出相應(yīng)的反饋。在此我們遇到了一個 ASP 的內(nèi)建對象 request,通過使用 request 對象可以訪問任何用 HTTP 請求傳遞的信息,包括從 HTML 表格中用 POST 方法或 GET 方法傳遞的參數(shù)、cookie 和用戶認(rèn)證。而 QueryString 集合檢索 HTTP 查詢字符串中變量的值,HTTP 查詢字符串由問號 (?) 后的值指定。如: http://localhost/if2.asp?Firstname=George&Lastname=Washington
生成值為 "Firstname=George&Lastname=Washington" 的變量名字符串。
If...Then...Else 語句的一種變形允許您從多個條件中選擇,即添加 ElseIf 子句以擴充 If...Then...Else 語句的功能,使您可以控制基于多種可能的程序流程。 我們將 asp2.asp 的程序部分?jǐn)U充如下:
< % fname=lcase(request.querystring("Firstname"))
lname=lcase(request.querystring("Lastname"))
If fname="george" and lname="washington" then %>
Hi.You must be the first president!< p>
< % elseIf fname="ronald" and lname="reagan" then %>
Hi.You must be the actor president!< p>
< % elseIf fname="jimmy" and lname="carter" then %>
Hi.You must be the peanut farmer president!< p>
< % elseIf fname="naoko" or fname="charles" then %>
Hi.Your name reminds me of someone,but I am not sure who!< p>
< % else %> Hi!Nice to Meet You < % end if %>
可以添加任意多個 ElseIf 子句以提供多種選擇。但使用多個 ElseIf 子句經(jīng)常會使程序變得很累贅。在多個條件中進行選擇的更好方法是使用 Select Case 語句。
Select Case 結(jié)構(gòu)提供了 If...Then...ElseIf 結(jié)構(gòu)的一個變通形式,可以從多個語句塊中選擇執(zhí)行其中的一個。Select Case 語句提供的功能與 If...Then...Else 語句類似,但是可以使代碼更加簡練易讀。Select Case 結(jié)構(gòu)在其開始處使用一個只計算一次的簡單測試表達式。表達式的結(jié)果將與結(jié)構(gòu)中每個 Case 的值比較。如果匹配,則執(zhí)行與該 Case 關(guān)聯(lián)的語句塊,我們同樣可以用 Select Case 語句來寫 asp2.asp 文件:
< % fname=lcase(request.querystring("Firstname"))
lname=lcase(request.querystring("Lastname"))
name=fname+lname
Select case name
case "georgewashington"
response.write "Hi.You must be the first president!< p>"
case "ronaldreagan"
response.write "Hi.You must be the actor president!< p>"
case "jimmycarter"
response.write "Hi.You must be the peanut farmer president!< p>"
case "naokocharles"
response.write "Hi.Your name reminds me of someone,but I am not sure who!< p>"
case else response.write "Hi!Nice to Meet You" End Select %>
請注意 Select Case 結(jié)構(gòu)只計算開始處的一個表達式,且只計算一次,而 If...Then...ElseIf 結(jié)構(gòu)計算每個ElseIf 語句的表達式,這些表達式可各不相同。因此僅當(dāng)每個ElseIf 語句計算的表達式都相同時,才以使用 Select Case代替 If...Then...ElseIf 結(jié)構(gòu)。Select Case 語句也是可以是嵌套的,每一層嵌套的Select Case語句必須有與之匹配的End Select 語句。
(四)內(nèi)置對象Request 系統(tǒng)學(xué)習(xí)ASP,就是先從ASP的幾大內(nèi)置對象開始的.asp一般稱有五大對象:Request、Response、Server、Session、Application
當(dāng)然一直還沒有提到的就是,ASP到底是什么樣?我看代碼怎么知道是ASP代碼?很簡單,當(dāng)看到“<%”和“%>”就表明是ASP,并且兩者之間的就是ASP源碼。那為什么要學(xué)對象,對象的作用又是如何的?其實ASP所提供的這些可在腳本中使用的內(nèi)建對象,使用戶更容易收集通過瀏覽器請求發(fā)送的信息、響應(yīng)瀏覽器以及存儲用戶信息,從而使對象開發(fā)者擺脫了很多煩瑣的工作。而Request對象的主要作用就是:在服務(wù)器端接受并得到從客戶端瀏覽器提交或上傳的信息。Request 對象可以訪問任何基于 HTTP 請求傳遞的所有信息,包括從Form表單用 POST方法或 GET 方法傳遞的參數(shù)、cookie 等。
一、Request.form("name") 這是接受上一頁的信息時,常會用到的一種接受方式。Request是ASP對象,form則是Request對象所包含的對象集合(這與HTML頁中的form表單不一樣的),name也就是上一頁表單中的某個文本框、密碼框,或者隱藏域等的名稱。并且還有一點非常重要:上一頁Form表單的遞交方法一定要為Post方法。看下面兩個程序。
1,test1.html(本頁是HTML的,主要提供輸入信息的平臺,將信息提交到ASP頁進行受處理)
<form action="submit1.asp" method="post">
your name:<input tpye="text" name="yourname"><br>
your pwd: <input type="password" name="yourpwd"><br>
<input type="submit" value="submit"></form>
注意method就是post,且提交的頁面action為submit1.asp。
2,submit1.asp(ASP頁面,進行從test1.html接受name="yourname"和name="yourpwd"的兩個值)
your name is:<%=request.form("yourname")%><br>
your pwd is:<%=request.form("yourpwd")%>
通過IIS進行HTTP協(xié)議的頁面調(diào)試,你會發(fā)現(xiàn)兩個頁面進行了關(guān)聯(lián):test1.html中動態(tài)輸入的name和pwd,在submit1.asp頁進行相應(yīng)動態(tài)顯示。這就是接收提取并顯示信息的過程。
3,改進的submit1.asp
<% for each i in request.form%> <%=i%>: <%=request.form(i)%> <br> <%next%>
采用了for循環(huán)語句,將上頁所有的form標(biāo)簽信息進行接受、并顯示。這在上表單頁有很多項目時,非常快捷地出來結(jié)果。
request.form后面的("yourname")或("yourpwd")變成了變量 i,通過for循環(huán)對該form集合進行遍歷提取,這是一種不同于機械地“有幾個就提取幾個”的編程思想,注意掌握。
二,Request.querystring("name")
此時由Request.form變?yōu)镽equest.querystring,最主要的還是上頁表單遞交時,采用的什么方法。當(dāng)采用post就用Request.form,否則當(dāng)采用get時就采用Request.querystring了。
那Request.querystring最大特色在哪里呢?Request.querystring能檢索并接受 HTTP 查詢字符串中變量的值,而HTTP 查詢字符串則是由問號 (?) 后的值指定的。繼續(xù)看一個程序。
1、test2.html(本頁同是HTML的,主要提供輸入信息的,將信息提交到ASP頁進行處理,提交方法是get)
與test1.html最大區(qū)別也就是method="get"。
2、submit2.asp(ASP頁面,從test1.html接受name="yourname"和name="yourpwd"兩個值)
your name is:<%=request.querystring("yourname")%><br>
your pwd is:<%=request.querystring("yourpwd")%>
注意此時的瀏覽器地址欄,文件后面多出了?號,?號后面附有變量名及所被賦的值,當(dāng)然多個變量名之間是用&號進行連接的。而Request.querystring最大的功能就是能將?號后面的這些變量名分開,并且所對應(yīng)的值也一一取出。
剛才說到不同的變量名之間是用&號進行連接,但如果是相同的變量名時,request.querystring到底是提取前一個?后一個?還是兩個一起?用例子說話。
3、query.asp(名稱是query.asp,因為在該頁程序中是反饋給自己。)
<a href="query.asp?bookname=《asp教程》">《asp教程》</a><br>
<a href="query.asp?bookname=《jsp教程》">《jsp教程》</a><br>
<a href="query.asp?bookname=《xsp教程》&bookname=《xml》">《xsp教程》</a><br>
you chosed <%=request.querystring("bookname")%>
很明顯當(dāng)點《xsp教程》時,顯示的是“《xsp教程》,《xml》”,中間自動加了“,”號。
最后仍需要說明的是:request.querystring在分頁程序里面是經(jīng)常用到的。
三、Request.ServerVariables("xxx")即服務(wù)器的環(huán)境變量,該變量包含的內(nèi)容比較多,我們同樣先采用for循環(huán)進行遍歷查看。1、server1.asp <%for each i in request.servervariables%>
<%=i%>: <%=request.servervariables(i)%> <hr> <%Next%>
可以看到一大堆環(huán)境變量,其中還有沒有值的,下面摘取幾個比較常用的。
http_user_agent(客戶端機器的相關(guān)環(huán)境):<%=request.servervariables("http_user_agent")%><br>
http_accept_language(瀏覽語言):<%=request.servervariables("http_accept_language")%><br>
CONTENT_LENGTH(客戶端發(fā)出內(nèi)容的長度):<%=request.servervariables("CONTENT_LENGTH")%><br>
CONTENT_TYPE(內(nèi)容的數(shù)據(jù)類型。如“text/html”。同附加信息 的查詢一起使用,如 HTTP 查詢 GET、POST 和 PUT):<%=request.servervariables("CONTENT_TYPE")%><br>
LOCAL_ADDR(返回接受請求的服務(wù)器地址。如果在綁定多個IP地址的多宿主機器上查找請求所使用的地址時,這條變量非常重要):<%=request.servervariables("LOCAL_ADDR")%><br>
REMOTE_ADDR(發(fā)出請求的遠程主機client的 IP 地址):<%=request.servervariables("REMOTE_ADDR")%><br>
SERVER_NAME(出現(xiàn)在自引用 URL 中的服務(wù)器主機名、DNS 化名 或 IP 地址):<%=request.servervariables("SERVER_NAME")%><br>
SCRIPT_NAME(主機名后面的虛擬地址):<%=request.servervariables("SCRIPT_NAME")%><br>
LOGON_USER(用戶登錄 Windows NT 的帳號):<%=request.servervariables("LOGON_USER")%><br>
SERVER_PORT(發(fā)送請求的端口號):<%=request.servervariables("SERVER_PORT")%>
根據(jù)以上的SERVER_NAME是提取的服務(wù)器主機名,SCRIPT_NAME是提取的虛擬地址,則兩者的結(jié)合再加上http:// 是不是就是個完整的網(wǎng)址呢。
2、server2.asp <%a=request.servervariables("server_name")%>
<%b=request.servervariables("script_name")%> <%="http://"&a&b%>
其中http:// 用引號引起,表示是字符串,a和b分別是對應(yīng)了具體值的變量,在ASP中進行這樣的連接就是采用&號。
根據(jù)這個結(jié)果,我們是不是就可以隨時提取動態(tài)的URL地址了。再來看看query.asp,要求一定要保存為query.asp的,因為如果不是該文件名,程序指向就會出錯。但現(xiàn)在的這個文件就隨便你保存為什么文件,都一樣執(zhí)行。
3、xxx.asp(隨便你保存成什么文件)
<%filepath=request.servervariables("script_name")%>
<a href="<%=filepath%>?bookname=《asp教程》">《asp教程》</a><br>
<a href="<%=filepath%>?bookname=《jsp教程》">《jsp教程》</a><br>
<a href="<%=filepath%>?bookname=《xsp教程》&bookname=《xml》">《xsp教程》</a><br>
you chosed <%=request.querystring("bookname")%>
先將當(dāng)前文件的地址取出并賦值給變量filepath,然后所有的鏈接地址開頭都只要直接引用該變量就OK了。是不是很有用,有點萬能的感覺。
四、Request.Cookies("name")不用我說,Cookie是個很重要的東西,究竟如何,等我們學(xué)完了下面的對象Response后,會有個特別Cookie的專題講座。
以上四則運用,屬于Request對象的所包含的四個對象集合:form、querystring、servervarivables、cookies。當(dāng)然還有個ClientCertificate就不說啦一個ASP內(nèi)置對象除了對象集合外還有對象屬性、對象方法
Request對象的對象屬性只有一個就是TotalBytes(接受的字節(jié)數(shù)),你可將<%=request.totalbytes%>該語句加入到任何一個接受數(shù)據(jù)的ASP頁面中進行顯示了。
Request對象的對象方法也還是一個:BinaryRead 。
說實話,這東東不常用,我也沒用過,呵呵。OK~!有關(guān)Request對象的學(xué)習(xí)就差不多了,最主要是先好好理解三個對象集合,cookies不著急,下節(jié)繼續(xù)學(xué)習(xí)對象Response。
ASP編程入門進階(五):內(nèi)置對象Response
通過對Request對象的學(xué)習(xí),可以了解到,Request對象是服務(wù)器端用來獲取客戶端的信息的。但作為服務(wù)器和客戶端進行交互,是不是還缺少服務(wù)器端向客戶端發(fā)送信息呢?對象Response正是擔(dān)任此責(zé)任。負(fù)責(zé)將信息傳遞給用戶的對象就是Response了,它可動態(tài)地響應(yīng)客戶端的請求,并將動態(tài)生成的響應(yīng)結(jié)果返回給客戶端瀏覽器。
一、Response.write write方法是使用最頻繁的一個了,write就是寫:將指定的字符串寫到當(dāng)前 HTTP 輸出。
1、write.asp <% response.write ("hello,world"&"<br>")
Randomize response.write "任意數(shù)是"&rnd()&"<br>" %>
response.write后面為所顯示的信息,可以用括號包含,也可以直接書寫(注意和response.write之間有空格)。
書寫的字符串信息或者HTML代碼相關(guān),用引號包含;而ASP本身的函數(shù)或變量則不需要,直接用即可。并且無論字符串信息、HTML代碼、函數(shù)還是變量之間進行連接都是采用&號(針對vbscript)
以上遇到一個隨機函數(shù)rnd(),該函數(shù)返回一個小于 1 但大于或等于 0 的值。
需要注意的是在調(diào)用 Rnd 之前,先使用無參數(shù)的 Randomize 語句初始化隨機數(shù)生成器,該生成器具有基于系統(tǒng)計時器的種子。若缺少Randomize,則無法繼續(xù)生成隨機種子。下面一個利用隨機函數(shù)的例子,產(chǎn)生隨機背景顏色效果:
當(dāng)然要產(chǎn)生指定范圍的隨機整數(shù),請使用以下公式:
Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
這里, upperbound 是此范圍的上界,而 lowerbound 是此范圍內(nèi)的下界。
隨機函數(shù)在做考試系統(tǒng)的時候非常有用,當(dāng)然你也可以用來自己搖獎,拿個頭彩也分點我就行了
二、Response.end這是Response常用的一種方法,使 Web 服務(wù)器停止處理腳本并返回當(dāng)前結(jié)果,文件中剩余的內(nèi)容將不被處理。主要放在一頁多功能的ASP頁中,為讓程序運行到此,抑或往下的程序沒必要再執(zhí)行顯示……
2、end.asp <%response.write now()
response.end ’程序執(zhí)行顯示到此結(jié)束 response.write rnd() %>
三、Response.clear
該方法主要作用是清除緩沖區(qū)中的所有 HTML 輸出,但該方法只清除響應(yīng)正文而不清除響應(yīng)標(biāo)題。該方法和end方法似相反,end是到此結(jié)束返回上面的結(jié)果,而clear卻是清除上面的執(zhí)行,然后只返回下面的結(jié)果。
3、clear.asp <%response.write now()
response.clear ’以上程序到此全被清除 response.write rnd()%>
下面通過一個例子來仔細(xì)看看end and clear
4、end2clear.asp <% filepath=request.servervariables("script_name")
user=Request.Form("username")
pwd=Request.Form("password") %>
<form method="POST" action="<%=filepath%>">
name:<input type="text" name="username"><br>
pwd:<input type="password" name="password"><br>
<input type="submit" value="submit">
</form> <% If user="cnbruce" and pwd="cnbruce" Then
response.write "采用clear方法,上面的程序結(jié)果將清除。"
response.clear ’ 清空存儲在緩存中的頁面
Else response.write "采用end方法,下面的程序?qū)⑼_\。"
Response.End ’ 立即停止腳本處理,并將緩存中的頁面輸出 End If %>
如果你只看到“刷新”鏈接就表明clear方法已經(jīng)生效<br>
<a href="<%=filepath%>">刷新</a>
以上程序中,當(dāng)輸入用戶名和密碼同為cnbruce的時候會發(fā)現(xiàn)clear方法的處理結(jié)果,反之是另外一個效果。
四、Response.redirect方法是讓瀏覽器立即重定向到程序指定的URL地址。這在根據(jù)客戶的不同響應(yīng),為不同的客戶指定不同的頁面,或根據(jù)不同的情況指定不同的頁面時,顯得非常重要。該方法是立即生效的,在其后的腳本都不執(zhí)行。
5、redirect.asp <%response.redirect("http://www.cnbruce.com/")%>
以上四則運用屬于Response對象的幾個比較重要的方法:write、end、clear、redirect當(dāng)然方法還有:AddHeader、AppendToLog、BinaryWrite、Flush……
早說過,一個ASP對象除了對象方法外,還有對象屬性,那response對象的屬性有哪些呢?
五、Response.ContentType ContentType 屬性指定服務(wù)器響應(yīng)的 HTTP 內(nèi)容類型。如果未指定 ContentType,默認(rèn)為 text/html。
6、contenttype.asp(非text/html的)
<% Response.ContentType = "text/HTML" %>
<% Response.ContentType = "image/GIF" %>
<% Response.ContentType = "image/JPEG" %>
<% Response.ContentType = "text/plain" %>
<% Response.ContentType = "image/JPEG" %>
六、Response.charsetCharset 屬性將字符集名稱附加到 Response 對象中 content-type 標(biāo)題的后面,用來設(shè)置服務(wù)器響應(yīng)給客戶端的文件字符編碼。
7、charset.asp <% Response.charset = "big5" %>
中文顯示,但采用的big5繁體的編碼,所以看到的是亂碼。當(dāng)然Response.ContentType和Response.charset應(yīng)用得比較少了。直接在head頭部屬性里面添加就OK了。
七、Response.expires 該屬性指定了在瀏覽器上緩沖存儲的頁,距過期還有多少時間。如果用戶在某個頁過期之前又回到此頁,就會顯示緩沖區(qū)中的頁面。但若設(shè)置 response.expires=0,則可使緩存的頁面立即過期。這是一個較實用的屬性,當(dāng)客戶通過 ASP 的登陸頁面進入WEB 站點后,應(yīng)該利用該屬性使登陸頁面立即過期,以確保安全。引用一個經(jīng)典的例子
例8、expires.asp <%
Response.Expires = 0
Response.Expiresabsolute = Now() - 1
Response.AddHeader "pragma","no-cache"
Response.AddHeader "cache-control","private"
Response.CacheControl = "no-cache" %>
八,Response.status設(shè)置服務(wù)器要響應(yīng)的狀態(tài)行的值。Response.status="狀態(tài)描述字符串",字符串可以為一個三位整數(shù)或一串說明文字組成,但必須放在<html>之前。
例9 、status.asp <% Response.Status = "401 Unauthorized" %>
九,Response.buffer 比較重要的一個,值為true or false。該屬性指示是否緩沖頁輸出。
引用:當(dāng)緩沖頁輸出時,只有當(dāng)前頁的所有服務(wù)器腳本處理完畢或者調(diào)用了 Flush 或 End 方法后,服務(wù)器才將響應(yīng)發(fā)送給客戶端瀏覽器,服務(wù)器將輸出發(fā)送給客戶端瀏覽器后就不能再設(shè)置 Buffer 屬性。因此應(yīng)該在 .asp 文件的第一行調(diào)用 Response.Buffer。 Response.buffer=true。
對于Response對象的屬性和方法先到這里,剩下一個數(shù)據(jù)集合,即cookie。繼續(xù)看cookies講座吧。
ASP編程入門進階(六):Cookies講座
什么是 Cookie?Cookie其實是一個標(biāo)簽,經(jīng)?赡苈牭降闹形姆g:小舔餅。當(dāng)你訪問一個需要唯一標(biāo)識你的站址的 WEB 站點時,它會在你的硬盤上留下一個標(biāo)記,下一次你訪問同一個站點時,站點的頁面會查找這個標(biāo)記。
每個 WEB 站點都有自己的標(biāo)記,標(biāo)記的內(nèi)容可以隨時讀取,但只能由該站點的頁面完成。每個站點的Cookie與其他所有站點的Cookie存在同一文件夾中的不同文件內(nèi)(你可以在 win2k Documents and Settings 文件夾下特定用戶的 cookies 文件夾中)。
一個 Cookie 就是一個唯一標(biāo)識客戶的標(biāo)記,Cookie 可以包含在一個對話期或幾個對話期之間某個 WEB 站點的所有頁面共享的信息,使用 Cookie 還可以在頁面之間交換信息。這項功能經(jīng)常被使用在要求認(rèn)證客戶密碼以及電子公告板、WEB 聊天室等 ASP 程序中。
盡管現(xiàn)在聽起來cookie沒有什么激動人心的,但實際上利用它,你能實現(xiàn)許多有意義的功能!比如說:你可以在站點上放置一個調(diào)查問答表,詢問訪問者最喜歡的顏色和字體,然后根據(jù)這些定制用戶的web界面。并且,你還可以保存訪問者的登錄密碼,這樣,當(dāng)訪問者再次訪問這個站點時,不用再輸入密碼進行登錄。
當(dāng)然,cookie也有一些不足。首先,由于利用cookie的功能可以編程實現(xiàn)一些不良企圖,所以大多數(shù)的瀏覽器中都有安全設(shè)定,其中可以設(shè)置是否允許或者接受cookie(IE瀏覽器中“工具”--“Internet選項...”--“安全”--“自定義級別”--“Cookie的使用”;Netscape瀏覽器中“工具”--“Cookie管理器”--“管理貯存的Cookie”即可),因此這就不能保證隨時能使用cookie。再者,訪問者可能有意或者無意地刪除cookie。當(dāng)訪問者的機器遇到“藍屏”死機時,或者重新格式化硬盤、安裝系統(tǒng)后,原來保存的cookie將全部丟失。最后一點,有一些最初始的瀏覽器并不能支持cookie。
◆ 怎樣利用cooklie? 有2種使用cookie的基本方式:
1、將cookie寫入訪問者的計算機(使用 Response 命令)
2、從訪問者的計算機中取回cookie(使用 Request 命令)
◆ 創(chuàng)建cookie的基本語法: Response.Cookies(cookie)[(key)|.attribute]=value
這里的 cookie 是指定 cookie 的名稱。而如果指定了 key,則該 cookie 就是一個字典。(測試一cookie是否為一個字典可用后面代碼顯示布爾值:<%=Request.Cookies("cookiename").HasKeys%>。為true是字典,false則不是。 )
Attribute 指定 cookie 自身的有關(guān)信息。Attribute 參數(shù)可以是下列之一 :
①Domain 若被指定,則 cookie 將被發(fā)送到對該域的請求中去。域?qū)傩员砻鱟ookie由哪個網(wǎng)站產(chǎn)生或者讀取,默認(rèn)情況下,cookie的域?qū)傩栽O(shè)置為產(chǎn)生它的網(wǎng)站,但你也可以根據(jù)需要改變它。(Response.Cookies("CookieName").Domain = "www.mydomain.com")
②Path 為路徑屬性,該屬性可以實現(xiàn)更多的安全要求,通過設(shè)置網(wǎng)站上精確的路徑,就能限制cookie的使用范圍。如果未設(shè)置該屬性,則使用應(yīng)用程序的路徑。(Response.Cookies("CookieName").Path = "/maindir/subdir/path" )
③Expires 指定 cookie 的過期日期。為了在會話結(jié)束后將 cookie 存儲在客戶端磁盤上,或在許多時候,我們希望能更長時間地在訪問者的計算機上保存cookie。必須設(shè)置該日期。若此項屬性的設(shè)置未超過當(dāng)前日期,則在任務(wù)結(jié)束后 cookie 將到期。后面的代碼,就可以設(shè)置cookie的使用到期時間為“2010年1月1日”: Response.Cookies("CookieName").Expires=#January 01, 2010#
后面的代碼,將設(shè)定cookie的過期時間為“cookie的創(chuàng)建時間+365天”:Response.Cookies("CookieName").Expires=Date+365
但最好不要隨便寫 Response.Cookies("CookieName").Expires=Date,這樣頁面之間的調(diào)用時值會為空。執(zhí)行下面的代碼將會在訪問者的計算機中創(chuàng)建一個cookie,名字=VisitorName,值=Ken : Response.Cookies("VisitorName")="Ken"
執(zhí)行下面的代碼將會在訪問者的計算機中創(chuàng)建一個cookie,名字=VisitorName,值=表單中UserName的值
Response.Cookies("VisitorName")=Request.Form("UserName")
你可以擴展下面的代碼成為Cookie子關(guān)鍵值(CookieSubName),即cookie字典的生成。代碼如下:
Response.Cookies("VisitorName")("FirstName")="Ken"
Response.Cookies("VisitorName")("LastName")="Baumbach"
◆ 讀取cookie的基本語法:Request.Cookies(cookie)[(key)|.attribute]
cookie 指定要檢索其值的 cookie。
key 可選參數(shù),用于從 cookie 字典中檢索子關(guān)鍵字的值。
attribe 指定 cookie 自身的有關(guān)信息。如:HasKeys 只讀,指定 cookie 是否包含關(guān)鍵字。
如果客戶端瀏覽器發(fā)送了兩個同名的 cookie,那么 Request.Cookie 將返回其中路徑結(jié)構(gòu)較深的一個。例如,如果有兩個同名的的 cookie,但其中一個的路徑屬性為 /www/ 而另一個為 /www/home/,客戶端瀏覽器同時將兩個 cookie 都發(fā)送到 /www/home/ 目錄中,那么 Request.Cookie 將只返回第二個 cookie。案例分析:
◆ num.asp(通過留在本地磁盤上的cookie記錄一年內(nèi)訪問本站的次數(shù),第一次顯示“首次訪問”,以后顯示“第幾次訪問”)
<% dim num num=request.cookies("visitnum")
if num > "0" then
num=num+1
Response.write "您已是第"&num&"次訪問本站點了。"
Else Response.write "歡迎您首次訪問本站。"
num=1 end if
response.cookies("visitnum")=num
response.cookies("visitnum").expires=date+365 %>
◆ showcookie.asp(從Cookies文件夾中遍歷出瀏覽器所有的Cookie name,以及相關(guān)的字典Cookie的顯示(藍字顯示)) <% For each cookie in Request.Cookies
if Request.cookies(cookie).HasKeys =false then
Response.write cookie & "=" & Request.Cookies(cookie)
Response.write ("<br>") Else
for each key in Request.Cookies(cookie)
Response.write ("<font color=blue>")
Response.write cookie & ".("&key&")" & "=" & Request.Cookies(cookie)(key)
Response.write ("</font><br>") Next end if next %>
◆ check.asp ’首先,設(shè)置頁面。然后,檢查表單變量(在同一個頁面中)。如果表單變量存在,就創(chuàng)建cookie,并設(shè)置到期時間。<%@ LANGUAGE="VBSCRIPT" %> <%
bgcolor = Request.Form("bgcolor")
fgcolor = Request.Form("fgcolor")
pwd = Request.form("pwd")
If bgcolor <>"" or fgcolor <>"" then
Response.cookies("check")("bgcolor") = bgcolor
Response.Cookies("check")("fgcolor") = fgcolor
Response.Cookies("check")("pwd") = pwd
Response.Cookies("check").Expires=#may 01, 2004# End if ’接著,讀取cookie
bgcolor = request.cookies("check")("bgcolor")
fgcolor = request.cookies("check")("fgcolor")
pwd = request.cookies("check")("pwd")
’如果cookie在訪問者的計算機上不存在,就創(chuàng)建一個表單,詢問相關(guān)信息
If bgcolor ="" and fgcolor ="" and pwd="" then %>
<HTML> <HEAD> </HEAD><body><DIV ALIGN="CENTER" >
<Form action="check.asp" method="POST">
Bgcolor: <input type="text" name="bgcolor"><BR>
Fgcolor: <input type="text" name="fgcolor"><BR>
Password:<input type="password" name="pwd"><BR>
<input type="submit" value="Submit"> </Form></DIV></BODY><% End if
’如果cookie已經(jīng)存在,并且bgcolor存在,就跳轉(zhuǎn)到color.asp。
If bgcolor <> "" then Response.Redirect "color.asp" End if %>
◆ color.asp(顯示用戶愛好顏色的頁面特性)
<% bgcolor=request.cookies("check")("bgcolor")
fgcolor=request.cookies("check")("fgcolor")
pwd=request.cookies("check")("pwd") %>
<%response.write("<body bgcolor="&bgcolor&"><font color="&fgcolor&">")%>
你的密碼是: <%response.write(" "&pwd&" ")%>
ASP編程入門進階(七):內(nèi)置對象Server
Server 對象提供對服務(wù)器上的方法和屬性的訪問 , 其大多數(shù)方法和屬性作為實用程序的功能服務(wù)(IIS HELP翻譯)。
有了 Server 對象,你就可以在服務(wù)器上啟動 ActiveX 對象例程,并使用 Active Server 服務(wù)提供象 HTML 和 URL 編碼這樣的函數(shù)。
一、Script.ScriptTimeout在腳本運行超過一段時間之后,即作超時處理。服務(wù)器一般的默認(rèn)腳本運行時間是90秒。
你可以從“Internet信息服務(wù)”中“默認(rèn)Web站點”的屬性彈出框中看出,你也可以自己設(shè)定。
呵呵,上面的可不是,900秒了。
應(yīng)該是“主目錄”標(biāo)簽中的“配置”對話框中,WINXP一樣。
在理解腳本運行時間之前,先來看一個程序,主要功能就是進行計算網(wǎng)頁執(zhí)行時間的。
當(dāng)然對應(yīng)的ASP也就是看到許多站點都有的頁面執(zhí)行時間顯示
1、time.asp <%startime=timer()%>
<a href=#bot>到下面看執(zhí)行的時間</a> <%
for i= 1 to 5000
response.write("<hr width="&int(500+i)&">") next %>
當(dāng)然中間還可以添加其它內(nèi)容。<br> <%endtime=timer()%> <a name=bot></a>
<%=FormatNumber((endtime-startime)*1000,3)%>毫秒
那如果上面的程序變成for i= 1 to 5000000呵呵,是不是機器快反應(yīng)不過來的感覺,那這個就是腳本的執(zhí)行時間了。為了讓程序能很好的執(zhí)行,就該把腳本執(zhí)行時間放長了。怎么放長?
<%Server.ScriptTimeout=110%>
時間的設(shè)定當(dāng)然是比默認(rèn)90秒大的,現(xiàn)在的代碼就是:指定服務(wù)器處理腳本在 110 秒后超時。還有,腳本時間的確定要看自身的程序了,一般情況100秒左右也差不多了,即使能執(zhí)行出來,可能觀看網(wǎng)頁的人早就把它叉叉了。
以上的ScriptTimeout就是Server對象唯一屬性了
二,Server.HtmlEncode HtmlEncode就是Server對象的其中一個方法了。它允許你對特定的字符串進行 HTML 編碼,雖然 HTML 可以顯示大部分你寫入 ASP 文件中的文本,但是當(dāng)你需要實際包含 HTML 標(biāo)記中所使用的字符,就會遇到問題。這是因為,當(dāng)瀏覽器讀到這樣的字符串時,會試圖進行解釋。
還是看一個程序,我想在頁面顯示“ ”這樣的代碼(附: 是空格的代碼)
那么當(dāng)我進行書寫的時候你會發(fā)現(xiàn),瀏覽器已經(jīng)給我解釋了的。
所以,為了要讓一些特殊代碼能夠顯示,就運用該方法了。
2,htmlencode.asp <%Response.write ("這是沒有采用 HTMLEncode 方法的測試。<br> 這里就另起一行,說明代碼被執(zhí)行。 ")%> <hr>
<%Response.write Server.HtmlEncode("這是對 HTMLEncode 方法的測試。<br> 這里應(yīng)該不會另起一行,也就是代碼沒有被執(zhí)行了。 ")%>
這在許多網(wǎng)站,論壇都存在的一些BUG,不信你可以到各論壇試試:敲入 就是沒有,急死你呢:)當(dāng)然HtmlEncode只是其中的一個原因,最主要的還是UBB代碼的轉(zhuǎn)換。不過關(guān)于這點我也已經(jīng)調(diào)試解決了。調(diào)試地址參看 http://www.cnbruce.com/juven/showart.asp
當(dāng)然經(jīng)典論壇不存在這問題,要不你也不會看到效果了。
三,Server.UrlEncode正如 HtmlEncode 方法使客戶可以將字符串翻譯成可接受的 HTML 格式一樣,Server 對象的 UrlEncode 方法則是根據(jù) URL 規(guī)則對字符串進行正確編碼,當(dāng)字符串?dāng)?shù)據(jù)以 URL形式傳遞到服務(wù)器時,在字符串中不允許出現(xiàn)空格,也不允許出現(xiàn)特殊字符。為此,如果你希望在發(fā)送字符串之前進行 URL 編碼,可使用 Server.URLEncode 方法。
為方便起見,我們先看為處理送交,然后處理接受的效果。
3,urlencode.asp <%filepath=request.servervariables("script_name")%>
接受URL中的值(沒有處理接受值,發(fā)現(xiàn)值被解釋了): <%=request.querystring("cnbruce")%>
<form action="<%=filepath%>">
你可以輸入“<hr>”等代碼看看:<input type="text" size="20" name="cnbruce"><input type="submit">
</form>
接受URL中的值(進行了urlencode編碼,不會執(zhí)行): <%=Server.URLEncode(request.querystring("cnbruce"))%>
當(dāng)然你會發(fā)現(xiàn),雖然不執(zhí)行了,但會出現(xiàn)“<”變成了“%3C”,“>”變成了“%3E”,那這就是因為沒有在發(fā)送之前處理。
不過,我們還可以通過Replace函數(shù)將這些特殊代碼再逆轉(zhuǎn)過來。
4,vurlencode.asp <% function tihuan(what)
tihuan=what
if not isnull(what) then
tihuan=replace(tihuan,"%3C","<")
tihuan=replace(tihuan,"%3D","=")
tihuan=replace(tihuan,"%3E",">")
tihuan=replace(tihuan,"%26","&")
tihuan=replace(tihuan,"空格我不知道,呵呵。哪個告訴我下:)"," ")
tihuan=replace(tihuan,"%3B",";")
tihuan=replace(tihuan,"%22",""")
tihuan=replace(tihuan,"%2B","+")
tihuan=replace(tihuan,"%2F","/")
end if end function %>
<%filepath=request.servervariables("script_name")%>
接受URL中的值(沒有處理接受值,發(fā)現(xiàn)值被解釋了): <%=request.querystring("cnbruce")%>
<form action="<%=filepath%>">
你可以輸入“<hr>”等代碼看看:<input type="text" size="20" name="cnbruce"><input type="submit">
</form> 接受URL中的值(進行了urlencode編碼,不會執(zhí)行): <%=tihuan(Server.URLEncode(request.querystring("cnbruce")))%>
呵呵,其實上面我是做的無用功啦,真正應(yīng)該是在發(fā)送之前就該處理下的,不過對學(xué)習(xí)該方法的舉例確是個好方法:)
四,Server.MapPath 相信看過我寫的《DW2ASP系列》的朋友,都卡在這個上了。DW畢竟是入門的好東西,但要系統(tǒng)學(xué)ASP編程,對這個就該好好認(rèn)識了解下。
MapPath方法,具體的就是將指定的相對或虛擬路徑,映射到服務(wù)器上相應(yīng)的物理目錄上。
用法,也就是語法了,如下: Server.MapPath(Path)
Path 指定要映射物理目錄的相對或虛擬路徑。若 Path 以一個正斜杠 (/) 或反斜杠 (\) 開始,則 MapPath 方法返回路徑時將 Path 視為完整的虛擬路徑。若 Path 不是以斜杠開始,則 MapPath 方法返回同本文件中已有的路徑相對的路徑。這里需要注意的是 MapPath 方法不檢查返回的路徑是否正確或在服務(wù)器上是否存在。
當(dāng)然這可以和Request.ServerVariables連起來使用看看。
5,mappath.asp Request.ServerVariables("APPL_PHYSICAL_PATH") : <%=Request.ServerVariables("APPL_PHYSICAL_PATH")%><p>
Request.ServerVariables("PATH_INFO") : <%=Request.ServerVariables("PATH_INFO")%><p>
Request.ServerVariables("SCRIPT_NAME") : <%=Request.ServerVariables("SCRIPT_NAME")%><p>
Request.ServerVariables("URL") : <%=Request.ServerVariables("URL")%><p>
Request.ServerVariables("PATH_TRANSLATED") : <%=Request.ServerVariables("PATH_TRANSLATED")%><hr>
上面都是通過ServerVariables提取得出的值,下面就來運用mapath把一個虛擬地址轉(zhuǎn)變?yōu)閷嶋H的物理地址。<p>
Server.MapPath(Request.ServerVariables("URL")) :<%=Server.MapPath(Request.ServerVariables("URL"))%><p>
或者自己隨便寫個不存在的路徑,同樣能夠執(zhí)行<p>
Server.MapPath("cnbruce.asp") : <%=Server.MapPath("cnbruce.asp")%><p>
再來個“/”的<p> Server.MapPath("/cnbruce.asp") : <%=Server.MapPath("/cnbruce.asp")%><br>
Server.MapPath("\cnbruce.asp") : <%=Server.MapPath("\cnbruce.asp")%><p>
你會發(fā)現(xiàn)物理地址轉(zhuǎn)變到IIS默認(rèn)根目錄下面了。這就是如6to23之類的站點mappath的問題所在。還是虛擬主機好,即使是根,也還是自己站點的默認(rèn)存放節(jié)點根。
注意測試的地址和根目錄下的地址,對應(yīng)的是同一文件夾(這就是虛擬主機),6to23之類是不會相同的。有此些了解,對路徑的處理應(yīng)該要好多了,再返回我的站點,看看我對數(shù)據(jù)庫的mappath路徑的處理方法,相信又是一個理解層次了。
五、Server.CreatObject 這個方法恐怕是 ASP 中最為實用,也是最強勁的功能了。它可用于創(chuàng)建已經(jīng)注冊到服務(wù)器上的 ActiveX 組件實例。這是一個非常重要的特性,因為通過使用 ActiveX 組件能夠使你輕松地擴展 ActiveX 的能力,正是使用了 ActiveX 組件,你可以實現(xiàn)至關(guān)重要的功能,譬如數(shù)據(jù)庫連接、文件訪問、廣告顯示和其他 VBScript 不能提供或不能簡單地依靠單獨使用 ActiveX 所能完成的功能。也正是因為這些組件才使得 ASP 具有了強大的生命力。那今天就主要把Server對象學(xué)習(xí)了下,感覺好象是每個都有用的,重要啊。
還有,需要說明的,如果您從本處轉(zhuǎn)載,發(fā)現(xiàn)和本源件有差錯,比如代碼 、 < 、 >等等,根本就是被執(zhí)行了的。都說明您的站點存在著這些問題。
ASP編程入門進階(八):內(nèi)置對象Session
ASP對象中除了用于發(fā)送(Response)、接收和處理數(shù)據(jù)(requeest)、服務(wù)器訪問(Server)的對象外,還有一些非常實用的標(biāo)記Active Server應(yīng)用程序(Application)和單個用戶信息(Session)的對象。
Session對象 該對象在ASP使用中占相當(dāng)大的比例。由于網(wǎng)頁是一種無狀態(tài)程序,無法得知用戶瀏覽狀態(tài)。在ASP中,通過Session對象來記錄使用者私有的數(shù)據(jù)變量,以作為用戶再次對服務(wù)器提出要求時做確認(rèn),用戶在程序的Web頁面之間跳轉(zhuǎn)時,存在Session對象中的變量將不會消失。這些是很重要的功能,尤其是有會員的系統(tǒng)必須要用到的。像是會員的登入賬號、時間、狀態(tài)以及許許多多該記錄的實時數(shù)據(jù)(如購物系統(tǒng)記錄使用者的購物籃內(nèi)的商品),這些信息屬于各使用者私人所需要,通常開發(fā)者都是使用 Session 記錄處理。
在ASP中的Session是使用Cookies構(gòu)成,服務(wù)器將所有的Session內(nèi)記錄的數(shù)據(jù),以Cookies的方式傳至用戶的瀏覽器。通常一般瀏覽器會將這些Cookies存起來,每當(dāng)使用者點選連結(jié),再次與服務(wù)器做聯(lián)機時,瀏覽器就會把這些Cookies傳回Server供做處理:這即是Session的運作原理。由此可知會話狀態(tài)Session僅在支持cookie的瀏覽器中保留,如果客戶關(guān)閉了Cookie 選項Session也就不能發(fā)揮作用了。
一、Session.SessionID 屬性返回用戶的會話標(biāo)識。在創(chuàng)建會話時,服務(wù)器會為每一個會話生成一個單獨的標(biāo)識,會話標(biāo)識以長整形數(shù)據(jù)類型返回。在很多情況下 SessionID 可以用于 WEB 頁面注冊統(tǒng)計。
利用該屬性可以解決一種對用戶的控制問題。該問題的主要功能就是,針對某個網(wǎng)站的一個模塊,當(dāng)一個會員登錄后正在看此模塊時,另一個人用同樣的會員名登錄,就不能瀏覽這個模塊:也就是說一個會員名同時只能一個人瀏覽此模塊。
通過用會員名(假設(shè)為UserID,唯一)和SessionID來實現(xiàn)了控制。當(dāng)會員登錄時,給這個會員一個Session記錄登錄狀態(tài)如:Session("Status")="Logged",同時把這個會員的Session.SessionID寫入數(shù)據(jù)庫。當(dāng)他要瀏覽此模塊時,先判斷其是否登錄,若已經(jīng)登錄再判斷它的SessionID是否與數(shù)據(jù)庫記錄的相同,如果不同則不能訪問。
這樣,當(dāng)另一個用戶用相同的會員名登錄時,那么數(shù)據(jù)庫中記錄的就是新的SessionID,前者訪問此模塊時就不能通過檢查。這就實現(xiàn)了一個會員名同時只能一個人瀏覽某個模塊。這個功能在一些收費網(wǎng)站有很有特別作用,它防止了一個會員名給多個人瀏覽的問題,為公司保障了利益。
<%=Session.SessionId%> 是單獨生成的唯一ID標(biāo)識,可刷新調(diào)試。
二、Session.TimeOut 該屬性設(shè)置的Session的最大間隔時間。間隔時間是指客戶器端從最近一次向Web服務(wù)器提出要求,到下一次向Web服務(wù)器提出要求的時間?梢岳斫鉃椋喝绻脩粼谠摮瑫r時限之內(nèi)不刷新或請求網(wǎng)頁,則該會話將終止。Timeout 屬性是以分鐘為單位,為該應(yīng)用程序的Session對象指定超時時限的,一般默認(rèn)為20分鐘。這在網(wǎng)吧等公共場所,登錄個人信息頁而忘記關(guān)閉窗口時,顯得比較重要(至少可以把時間設(shè)短些)。
<%=Session.TimeOut=10%>
以上SessionId、TimeOut屬于Session對象的兩個屬性,下面看該對象的一個方法
Session.Abandon 該方法是Session對象的唯一方法,可以清除Session對象,用來消除用戶的Session對象并釋放其所占的資源。當(dāng)然你如果沒有明確調(diào)用Abandon方法,一旦會話超時,服務(wù)器也會將刪除這些對象并釋放資源。
下面就用兩個頁的程序來認(rèn)識Session對象以及Abandon方法的利用。
1,login.asp <%
’提取url中變量loginout的值是否為true,若為真,就執(zhí)行Session.Abandon()。
if Request.QueryString("loginout")="true" then &, nbsp; Session.Abandon()
end if ’只有在當(dāng)點擊了submit按鈕的前提下,再來判斷提取的東西都不為空,則建立Session對象。
submitname=request.form("submit1")
if submitname="submit" then
if Request.Form("name")<>"" and Request.Form("pwd")<>"" then
Session("name")=Request.Form("name")
Session("pw")=Request.Form("pwd")
end if end if %> <%
’如果Session("name")不為空,則顯示它的值,并且做一個到info.asp的鏈接。
if Session("name")<>"" then
response.write("你的name值是:"&Session("name"))
response.write("<br><a href=’info.asp’>顯示你的資料</a>")
else ’否則,即Session("name")為空不存在,則顯示表單用以輸入建立Session的平臺。
%> <form action="login.asp" method="post">
姓名:<input type="text" name="name"><br>
密碼:<input type="password" name="pwd"><br>
<input type="submit" value="submit" name="submit1"></form>
<!--同樣做了一個到info.asp的鏈接。-->
<a href="info.asp">顯示你的資料</a><%end if%>
注意Session("name")為空和不為空的時候,都做了一個到info.asp的鏈接,具體調(diào)試結(jié)果如何,再來看info.asp的內(nèi)容。
2,info.asp <% ’如果session對象值為空則跳轉(zhuǎn)到login.asp
if session("name")="" then
Response.Redirect("login.asp")
’否則就顯示個人信息
Else Response.Write("你的姓名:"&session("name")&"<br>")
Response.Write("你的密碼:"&session("pw")&"<br>")
end if %>
<a href="login.asp">返回</a>
<a href="login.asp?loginout=true">退出</a>
可以看出來,info.asp頁面內(nèi)容的顯示其實是需要條件的。那就是必須得有一個session值的存在,這樣才可以顯示具體的信息。這在登錄系統(tǒng)中運用得比較多。
你可以把login.asp想象成一個登錄窗口,當(dāng)然我的這個比較簡單(只要輸入用名和密碼就生產(chǎn)Session了),實際情況是:判斷輸入的用名和密碼是否和數(shù)據(jù)庫中的用名和密碼吻合,如果正確吻合才生成Session的。然info.asp頁面的作用剛好可以做為一權(quán)限頁面,因為進入該頁需要Session,而Session的產(chǎn)生是確保用名密碼正確的。
所以當(dāng)一開始出現(xiàn)表單窗口時,你點login.asp鏈接是打不開的,只有當(dāng)提交了表單生成了Session后才能進入。這正是登錄系統(tǒng)的精髓所在,Do You Know?:)
四、Session_OnStart Session_OnStart屬于Session對象的一類事件。它是在服務(wù)器創(chuàng)建新會話時發(fā)生的。服務(wù)器在執(zhí)行請求的頁之前先處理該腳本。Session_OnStart 事件是設(shè)置會話期變量的最佳時機,因為在訪問任何頁之前都會先設(shè)置它們。
對象的例程每一次啟動時觸發(fā)Session_OnStart事件,然后運行Session_Onstart事件的處理過程。也就是說,當(dāng)服務(wù)器接收到應(yīng)用程序中的URL的HTTP請求時,觸發(fā)此事件,并建立一個Session對象。
當(dāng)然說到Session_OnStart事件就不能不談到一個文件Global.asa(P.S:我打算把該文件和Chat程序放在一起說的,所以現(xiàn)在先不作過多解釋)
具體用法先透露,寫在Global.asa文件內(nèi)部
<SCRIPT RUNAT=Server Language=VBScript>
.......
Sub Session_OnStart
.......
End Sub
.......
</SCRIPT>
五、Session_OnEnd一看也就知道是Session對象的另一類事件了。當(dāng)調(diào)用Session.Abandon方法時或者在TimeOut的時間內(nèi)沒有刷新,這會觸發(fā)Session_OnEnd事件,然后執(zhí)行里面的腳本。同樣具體用法在后面將寫的Global.asa文件專題中詳細(xì)介紹到,簡單語法如下:<SCRIPT RUNAT=Server Language=VBScript>.......
Sub Session_OnEnd ....... End Sub....... </SCRIPT>
以上就是對Session對象的系統(tǒng)學(xué)習(xí)。
ASP編程入門進階(九):內(nèi)置對象Application
在Web應(yīng)用程序中,當(dāng)一個用戶訪問該應(yīng)用時,Session類型的變量可以供這個用戶在該Web應(yīng)用的所有頁面中共享數(shù)據(jù);如果另一個用戶也同時訪問該Web應(yīng)用,他也擁有自己的Session變量,但兩個用戶之間無法通過Session變量共享信息,而Application類型的變量則可以實現(xiàn)站點多個用戶之間在所有頁面中共享信息?梢岳斫釹ession是局部變量,而Application則為全局變量。
在同一虛擬目錄及其子目錄下的所有 .asp 文件構(gòu)成了 ASP 應(yīng)用程序。我們非但可以使用 Application 對象,在給定的應(yīng)用程序的所有用戶之間共享信息,并在服務(wù)器運行期間持久的保存數(shù)據(jù)。而且,Application 對象還有控制訪問應(yīng)用層數(shù)據(jù)的方法和可用于在應(yīng)用程序啟動和停止時觸發(fā)過程的事件。
一、Application("name")=Value
正如Session("name")=value一樣,Application對象也沒有內(nèi)置的屬性。當(dāng)然用戶可以自定義屬性,該屬性也可稱為集合。
一旦分配了Application對象的屬性,它就會持久地存在,直到關(guān)閉WEB服務(wù)器服務(wù)使得 Application 停止。由于存儲在 Application 對象中的數(shù)值可以被應(yīng)用程序的所有用戶讀取,所以 Application 對象的屬性特別適合在應(yīng)用程序的用戶之間傳遞信息。<% Application("MyName") = "cnbruce" %>
二、Application.Lock方法是禁止其他用戶修改Application對象的屬性,以確保在同一時刻僅有一個客戶可修改和存取 Application 變量。如果用戶沒有明確調(diào)用 Unlock 方法,則服務(wù)器將會在 .asp 文件結(jié)束或超時后即解除對 Application 對象的鎖定。最簡單的就是進行頁面記數(shù)的例子了。
1,num.asp<% Application.Lock
Application("NumVisits") = Application("NumVisits") + 1
Application.Unlock %>
你是本頁的第<%=Application("NumVisits")%>位訪問者
當(dāng)然,若如果你需要記數(shù)的初始值那就該寫個判斷了。
<% if Application("NumVisits")<9999 then
Application("NumVisits")=10000
end if Application.Lock
Application("NumVisits") = Application("NumVisits") + 1
Application.Unlock %>
你是本頁的第<%=Application("NumVisits")%>位訪問者上面的程序,你會發(fā)現(xiàn)每刷新一次,都會記數(shù)累加,如按IP值訪問來記數(shù)的話,則建立一個Session
2,vnum.asp <% if session("visitnum")="" then
Application.Lock Application("NumVisits") = Application("NumVisits") + 1
Application.Unlock session("visitnum")="visited"
end if %>你是本頁的第<%=Application("NumVisits")%>位訪問者
三、Application.Unlock與Lock方法相反,Unlock方法是允許其他用戶修改 Application 對象的屬性?梢钥闯鲈谏厦娴睦又,Unlock方法解除對象的鎖定,使得下一個客戶端能夠增加 NumVisits 的值。當(dāng)然需要注意的是:記數(shù)要確保服務(wù)器不被重啟,因為所以的訪問是數(shù)值是建立在頁面之上的,并未進行保存成文件或保存到數(shù)據(jù)庫這樣的處理。一般當(dāng)服務(wù)器重新啟動就會觸發(fā)Application的事件了。
四、Application_OnEnd事件 在應(yīng)用程序退出時于 Session_OnEnd 事件之后發(fā)生,當(dāng)然Application_OnEnd 事件的處理過程也必須寫在 Global.asa 文件之中。
比如上面的程序中,若服務(wù)器關(guān)機必然會觸發(fā)Application_OnEnd事件,那么該事件就可以進行數(shù)據(jù)保存的工作,已使得下次數(shù)據(jù)的續(xù)沿。當(dāng)然Application_OnEnd 事件在應(yīng)用程序退出時于Session_OnEnd 事件之后發(fā)生
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">.............
Sub Application_OnEnd .............
End Sub .............</SCRIPT>
五、Application_OnStart事件在首次創(chuàng)建新的會話( 即 Session_OnStart 事件 )之前發(fā)生。當(dāng)WEB服務(wù)器啟動并允許對應(yīng)用程序所包含的文件進行請求時就觸發(fā)Application_OnStart事件。
<SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server>.............
Sub Application_OnStart.............End Sub.............</SCRIPT>
所以現(xiàn)在可以將Global.asa內(nèi)部的代碼可以想象
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Application_OnStart.....................End Sub Sub Session_OnStart .....................
End Sub Sub Session_OnEnd ..................... End Sub Sub Application_OnEnd
.....................End Sub </SCRIPT>
具體Global.asa是怎么一回事?且聽下回分解。海
ASP編程入門進階(十):Global.asa文件
我們已經(jīng)知道Application和Session對象的OnStart、OnEnd事件的腳本,都必須是在 Global.asa 文件中聲明的。那究竟Global.asa是什么樣的一個文件?它有何作用?又該如何運用呢?
首先.asa是文件后綴名,它是Active Server Application的首字母縮寫。Global.asa文件可以管理在ASP應(yīng)用中兩個非?量痰膶ο螅篈pplication、Session。它其實是一個可選文件,程序編寫者可以在該文件中指定事件腳本,并聲明具有會話和應(yīng)用程序作用域的對象。該文件的內(nèi)容不是用來給用戶顯示的,而是用來存儲事件信息和由應(yīng)用程序全局使用的對象。該文件必須存放在應(yīng)用程序的根目錄內(nèi)。每個應(yīng)用程序只能有一個Global.asa文件。
關(guān)于Global.asa文件最常見的錯誤概念是它能為一般的使用的函數(shù)和子程序用作書庫。Global.asa文件僅能用于創(chuàng)建對象的引用和俘獲啟動,以及結(jié)束Application對象和Session對象。Global.asa文件主要基于會話級事件被訪問,在以下三種情況下被調(diào)用:
1,當(dāng)Application_OnStart或Application_OnEnd事件被觸發(fā)。
2,當(dāng)Session_OnStart或Session_OnEnd事件被觸發(fā)。
3,當(dāng)引用一個在Global.asa文件里被實例化的對象(Object)。
Global.asa的標(biāo)準(zhǔn)文件格式如下:
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Application_OnStart
’Application_OnStart 當(dāng)任何客戶首次訪問該應(yīng)用程序的首頁時運行
End Sub Sub Session_OnStart
’Session_OnStart 當(dāng)客戶首次運行 ASP 應(yīng)用程序中的任何一個頁面時運行
End Sub Sub Session_OnEnd
’Session_OnEnd 當(dāng)一個客戶的會話超時或退出應(yīng)用程序時運行
End Sub Sub Application_OnEnd
’Application_OnEnd 當(dāng)該站點的 WEB 服務(wù)器關(guān)閉時運行 End Sub </SCRIPT>
一、Session_onStart 先看一個控制用戶進入頁面的代碼:
1、Global.asa(放在被調(diào)試的虛擬目錄的根目錄下面)
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Session_OnStart ’只要是用戶第一次登錄本站,則會跳轉(zhuǎn)到首頁
response.redirect("htp://www.cnbruce.com/") End Sub</SCRIPT>
然后調(diào)試當(dāng)前虛擬目錄下的任何文件,你會發(fā)現(xiàn)所有頁面都跳轉(zhuǎn)向htp://www.cnbruce.com/
通過此“強制進入某頁”的例子,可以想象當(dāng)首頁需要被關(guān)注的時候是非常有必要的。下面就以一個“在線人數(shù)”的例子來繼續(xù)觀察Session_OnStart和Session_OnEnd事件
例2、Global.asa(放在被調(diào)試的虛擬目錄的根目錄下面)
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_onStart ’初始值為0
Application("OnLine") = 0
End Sub Sub Session_onStart ’一個用戶訪問進行記數(shù)加1
Application.Lock Application("OnLine") = Application("OnLine") + 1
Application.Unlock End Sub
Sub Session_OnEnd ’一個用戶進程的結(jié)束,記數(shù)減1 (P.S.如果沒有該事件程序,則執(zhí)行的就是頁面訪問程序了。) Application.Lock
Application("OnLine") = Application("OnLine") - 1
Application.Unlock End Sub </SCRIPT>
例3、online.asp <% if request.querystring("logout")="true" then
session.Abandon() response.end end if %>
當(dāng)前共有<%=Application("OnLine")%>在線
<a href="online.asp?logout=true">退出</a>
你發(fā)現(xiàn)在該頁中只有一個Application("OnLine"),而且還是被顯示引用的。那么其值來自何方?這正是Global.asa文件的關(guān)鍵所在。你可以在本機依次打開各個窗口,進行進行關(guān)閉窗口或退出兩種方法的調(diào)試。
三、繼續(xù)細(xì)化一下上面的程序你會發(fā)現(xiàn):當(dāng)進行“退出”連接后關(guān)閉窗口和直接關(guān)閉窗口效果是不一樣的。因為Session存在時間的緣故,當(dāng)直接進行關(guān)閉窗口,并不能觸發(fā)Session_OnEnd事件,所以該如何實現(xiàn)這個幾乎不可能的想法呢?
大家都知道,當(dāng)網(wǎng)頁進行關(guān)閉的時候可以連帶一個onunload事件,那么該onunload只要能執(zhí)行Session的注銷功能不就我們需要的嗎?廢話少說,將online.asp進行修改
例3、online.asp <% if request.querystring("logout")="true" then
session.Abandon() response.end end if %>
<body onunload=javascript:window.open("exit.asp")>
當(dāng)前共有<%=Application("OnLine")%>在線
<a href="online.asp?logout=true">退出</a>
注意,online.asp進行onunload的時候會打開exit.asp,那只要在exit.asp中再設(shè)置session.Abandon()就OK了。
例4、exit.asp <%session.Abandon()%> <script> self.close() </script>
當(dāng)然,加了段Script腳本,目的是進行Session的注銷以后立即進行關(guān)閉本身。
那現(xiàn)在基本一個在線統(tǒng)計的Web應(yīng)用就可以了。
四、深入研究Global.asa從上面的調(diào)試中,舉一反三的你,一定會提出一個問題:如何控制注冊用戶在線人數(shù)?那下面幾個文件一個一個看:
例5、Global.asa(放在被調(diào)試的虛擬目錄的根目錄下面)
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Application_OnStart
application("online")=0
End Sub Sub Session_OnStart
End Sub Sub Session_OnEnd
if session.contents("pass") then ’判斷是否為登錄用戶的Session_OnEnd
application.lock
application("online")=application("online")-1
application.unlock
end if End Sub Sub Application_OnEnd End Sub</SCRIPT>
注意本Global.asa中的Session_OnStart塊不做任何事件。因為一旦有用戶訪問服務(wù)器而不管用戶是否登錄,都會產(chǎn)生OnStart事件,而現(xiàn)在需要的只是登錄用戶的在線,所以不能在OnStart事件里使Applicaiton("online")加1。又因為不管是否是登錄用戶的會話結(jié)束都會產(chǎn)生OnEnd事件(假如有訪客訪問了服務(wù)器但并不登錄,他的會話結(jié)束后也會產(chǎn)生OnEnd事件),所以在Session_OnEnd事件里用了句if語句來判斷是否為已登錄用戶的OnEnd事件,如果是才將在線人數(shù)減1。
并且值得注意的是:session.contents("pass")的使用,因為在OnEnd事件里禁止使用Session對象,但是可以用Session對象的集合來調(diào)用session變量。也就是說不能直接寫session("pass"),而是需要寫session.contents("pass")。
例6 login.asp <% if request.querystring("logout")="true" then
session.Abandon()
end if submitname=request.form("submit")
if submitname="submit" then
name=request.form("name")
pwd=request.form("pwd")
if name="cnbruce" and pwd="cnrose" then
session("name")=name
session("pass")=true
else response.write "Error Name Or Pwd.<a href=’login.asp’>Back</a>"
response.end end if application.lock
application("online")=application("online")+1
application.unlock %>
當(dāng)前注冊會員<%=application("online")%>人。
<a href="login.asp?logout=true">退出</a>
<%else%> <form action="login.asp" method="post">
<input type="text" name="name"><br>
<input type="password" name="pwd"><br>
<input type="submit" name="submit" value="submit"> <%end if%>
只是簡單地檢測用名是cnbruce,密碼是cnrose的時候,生成一個session("pass")=true,就是放在Global.asa中判斷的。
五,繼續(xù)發(fā)揮想象 想想,再想想。僅統(tǒng)計有多少人在線是不夠的,還要判斷用戶的在線狀態(tài)。
可以想象辦法基本,當(dāng)用戶登錄的時候,在login.asp里將online設(shè)為1(如果有數(shù)據(jù)庫則上傳),但用戶離線時將online設(shè)為0,要完善它,就要修改一下Session_OnEnd事件,在該事件里將online設(shè)為0(同樣將為0的值上傳)……
當(dāng)然,Global.asa遠遠不止這些。不過我們現(xiàn)在先不著急全部掌握,當(dāng)我們接觸到數(shù)據(jù)庫的時候再返回過來看,繼續(xù)研究該文件,相信到那時一定又會感悟到很多。所以,還是先把上面的這些吃透吧:)
ASP編程入門進階(十一):Chat聊天程序
通常的聊天室所采用的程序,也就是Chat程序了,其基本結(jié)構(gòu)原理是不會采用到數(shù)據(jù)庫的。那究竟采用什么技術(shù)呢?我們知道ASP變量當(dāng)中Session變量的作用是記錄單個用戶的信息,并且能跟蹤用戶的行為;Application對象的作用則起的全局變量,可以實現(xiàn)站點多個用戶之間在頁面中共享信息的。那可以想象,在針對當(dāng)前聊天程序中,一個聊天成員即為一個Session變量,聊天成員之間的會話則當(dāng)成Application變量進行共享顯示,以使各成員都能看見。
那下面就采用一很經(jīng)典的實例程序,進行了解和分析。
1,chat.asp <%If Request.ServerVariables("Request_Method")="GET" then%>
<form method="post" action="chat.asp">
<input type="text" name="nick" value="your nick name"><p>
<input type="submit" value="come in"><p>
<input type="hidden" name="log" size="20" value="1"> </form>
<%Response.End Else Response.clear dim talk
If Request.Form("nick")<>"" then Session("nick")=Request.Form("nick") End if %> <form method="post" action="chat.asp" name=form1>
<%=Session("nick")%>說話:
<input type="text" name="talk" size="50"><br>
<input type="submit" value="提交">
<input type="reset" value="取消"></p>
</form> <a href="chat.asp">離開</a><br>
<% If Request.Form("log")<>1 then
If trim(Request.Form("talk"))="" then
talk=Session("nick")&"不說一句話就想來敷衍大家"
Else talk=trim(Request.Form("talk"))
End If Application.lock
Application("show")="來自"&Request.ServerVariables("remote_addr")& "的" &Session("nick")&"在"&time& "的時候說:" &talk& "<br>" &Application("show")
Application.UnLock Response.Write Application("show")
End if %> <%End if%>
簡單解釋:1、<%If Request.ServerVariables("Request_Method")="GET" then%>的作用就是判斷當(dāng)前頁面接受的方式,如果為GET方式則會顯示“要求輸入昵稱”的表單頁。因為頁面的默然接受方式為GET,當(dāng)在URL地址欄直接敲入時,也就是沒有任何信息的時候,就應(yīng)該顯示要求“輸入昵稱”。
2、<input type="hidden" name="log" size="20" value="1">和下面的If Request.Form("log")<>1 then是有關(guān)聯(lián)的:顯然第一次輸入昵稱進入,同樣將log隱藏域發(fā)送。但作為第一次的進入是無任何語句發(fā)言的,所以判斷接受的log值不為1,亦即非首次登錄(表示已經(jīng)登錄)時,執(zhí)行內(nèi)部相關(guān)聊天顯示程序。
3、trim(Request.Form("talk"))="",trim就是個函數(shù)了:刪去字符串前,后的空格。初此,還有rtrim():去掉字符串后的空格;ltrim():去掉字符串前的空格。
4,Application.lock Application("show")="來自"&Request.ServerVariables("remote_addr")& "的" &Session("nick")&"在"&time& "的時候說:" &talk& "<br>" &Application("show")
Application.UnLock提取精華得Application.lock
Application("show")=talk& "<br>" &Application("show") Application.UnLock
可以看到是Application變量的疊加功能,每次Application("show")的值都建立在原有Application變量值的基礎(chǔ)之上,再附加上最新的聊天內(nèi)容:talk變量的值。這樣就保證所有用戶都能看到的共享信息了。未完待敘,就醬紫看先 :)
ASP編程入門進階(十二):ASP技巧累加
一、On Error 語句 作用是:啟用或禁用錯誤處理程序。一般用法如下:
On Error Resume Next On Error GoTo 0
如果在您的代碼中未使用On Error Resume Next語句,所發(fā)生的運行時錯誤將顯示錯誤信息,同時,代碼的執(zhí)行也隨之終止。但當(dāng)你采用它時,就會使程序按照產(chǎn)生錯誤的語句之后的語句繼續(xù)執(zhí)行,或是按照最近一次所調(diào)用的過程(該過程含有 On Error Resume Next 語句)中的語句繼續(xù)運行。這個語句可以不顧運行時錯誤,繼續(xù)執(zhí)行程序,之后您可以在過程內(nèi)部建立錯誤處理例程。在調(diào)用另一個過程時,On Error Resume Next 語句變?yōu)榉腔顒拥。所以,如果希望在例程中進行內(nèi)部錯誤處理,則應(yīng)在每一個調(diào)用的例程中執(zhí)行 On Error Resume Next 語句。
如果您已啟用 On Error Resume Next 錯誤處理程序,則可使用On Error GoTo 0禁用錯誤處理程序。
[附注:要在代碼中生成運行時錯誤,請用Err對象的Raise方法。
這樣的情況經(jīng)常在調(diào)試程序的時候看見,比如分別調(diào)試下面兩程序則會顯示。
1,err1.asp <%Err.Raise 6%> 技術(shù)信息(用于支持人員) 錯誤類型:Microsoft VBScript 運行時錯誤 (0x800A0006) 溢出
2,err2.asp <%cnbruce.com%> 調(diào)試的時候也就是 技術(shù)信息(用于支持人員)
錯誤類型:Microsoft VBScript 運行時錯誤 (0x800A01A8) 缺少對象: ’cnbruce’
但當(dāng)你在首行添加了On Error Resume Next之后,發(fā)現(xiàn)不報錯提示,表明內(nèi)部錯誤處理完成。但進行下列程序的時候發(fā)現(xiàn)
3,err3.asp <% On Error Resume Next
cnbruce.com
On Error GoTo 0 cnbruce.com%>
這時運用了On Error GoTo 0,則會顯示出錯信息,只不過不是第三行,而是第五行的cnbruce.com錯誤對象了。通過上面幾個例子,相信你對此語句應(yīng)該有所領(lǐng)悟了。接著再看。
二,Option Explicit 語句 該語句的作用是:強制要求顯式聲明腳本中的所有變量。
所謂的顯式聲明,就是要使用 Dim、Private、Public 或 ReDim 語句聲明所有變量。如果在程序中試圖使用未經(jīng)聲明的變量名,則會出現(xiàn)錯誤。用該語句可以避免拼錯已存在的變量名稱。對于作用范圍不清楚的變量,使用此語句也可避免發(fā)生混淆。當(dāng)然,如果要使用 Option Explicit,該語句必須出現(xiàn)在腳本的任何其他語句之前。
4、err4.asp <% Option Explicit ’ 強制顯示聲明變量。
Dim MyVar ’聲明變量。
MyVar = 10 ’聲明變量不產(chǎn)生錯誤。
MyInt = 10 ’未聲明變量產(chǎn)生錯誤。
response.write(MyInt) %>
報錯信息如下: 技術(shù)信息(用于支持人員)
錯誤類型: Microsoft VBScript 運行時錯誤 (0x800A01F4) 變量未定義: ’MyInt’
再加一句:ASP中對VBScript提供了強勁的支持,能夠無縫集成VBScript的函數(shù)、方法,這樣給擴展ASP的現(xiàn)有功能提供了很大便利。由于ASP中已經(jīng)模糊了變量類型的概念,所以,在進行ASP與VBScript交互的過程中,很多程序員也慣于不聲明VBScript的變量,以后注意,這樣加重了服務(wù)器的解析負(fù)擔(dān),進而影響服務(wù)器的響應(yīng)請求速度。鑒于此,我們可以象在VB中強制用戶進行變量聲明一樣在VBScript中強制用戶進行變量聲明。實現(xiàn)方法就是:在ASP程序行首放置<% option explicit%>。實踐也證明,ASP文件中使用“Option Explicit”可以使得程序出錯機會降到最少,并且會大大提升整體性能。另外,聲明的變量有個順序的技巧,要么以編譯時間,要么以運行時間。聲明的變量都按此順序引用。
ASP編程入門進階(十三):ASP組件Ad/ContentRotator
ASP的強大不僅僅局限于接受和顯示的交互,更多的是運用ActiveX 組件進行更強大的Web應(yīng)用。那究竟ActiveX組件為何物?它又是如何運作的呢?其實ActiveX Server Components(ActiveX 服務(wù)器組件)是一個存在于 WEB 服務(wù)器上的文件,該文件包含執(zhí)行某項或一組任務(wù)的代碼,組件可以執(zhí)行公用任務(wù),這樣就不必自己去創(chuàng)建執(zhí)行這些任務(wù)的代碼。很形象的一句話:運用組件直接采用別人經(jīng)典的功能強大的程序。只不過這程序已被封裝了的。
那具體ActiveX組件是如何產(chǎn)生、如何得來的呢?一般由下面三個路徑獲得:
1,安裝完IIS服務(wù)器以后,自帶的一些內(nèi)置組件,如Database Access數(shù)據(jù)庫連接組件。
2,從第三方開發(fā)者處獲得可選的組件,或者免費或者收費的,如一些上傳組件(當(dāng)然現(xiàn)在有無組件上傳)。
3,如果你是一位Web程序開發(fā)者,可以使用Visual Basic 、Java 、Visual C++ 、COBOL等程序設(shè)計語言來編寫你所需要的ActiveX Server Component。這也就是所謂的ASP進行COM(Component Object Model)、COM+開發(fā)了。
當(dāng)然無論是第三方還是自行開發(fā),在使用之前都必須要進行系統(tǒng)的注冊。不過這些都是后話。我們現(xiàn)在需要的,是盡快先把ASP自帶的一些組件搞懂吧!〔贿^在使用內(nèi)置組件之前,先用一個程序檢測一下自己機器中的組件支持情況。引用一段網(wǎng)上流行的“阿江ASP探針”,將下列代碼保存為asp文件進行調(diào)試查看。
1,objcheck.asp <%Option Explicit %> <% Dim filename
filename=Request.ServerVariables("SCRIPT_NAME")
Dim ObjTotest(14,4)
ObjTotest(0,0) = "MSWC.AdRotator"
ObjTotest(0,1) = "廣告輪顯組件"
ObjTotest(1,0) = "MSWC.ContentRotator"
ObjTotest(1,1) = "內(nèi)容輪顯組件"
ObjTotest(2,0) = "MSWC.BrowserType"
ObjTotest(2,1) = "瀏覽器類型顯示組件"
ObjTotest(3,0) = "MSWC.NextLink"
ObjTotest(4,0) = "MSWC.Tools"
ObjTotest(5,0) = "MSWC.Status"
ObjTotest(6,0) = "MSWC.Counters"
ObjTotest(7,0) = "MSWC.IISLog"
ObjTotest(8,0) = "MSWC.PermissionChecker"
ObjTotest(9,0) = "Microsoft.XMLDom"
ObjTotest(10,0) = "IISSample.ContentRotator"
ObjTotest(11,0) = "IISSample.PageCounter"
ObjTotest(12,0) = "Scripting.FileSystemObject"
ObjTotest(13,0) = "adodb.connection"
public IsObj,VerObj,TestObj
dim i for i=0 to 13
on error resume next
IsObj=false
VerObj=""
TestObj=""
set TestObj=server.CreateObject(ObjTotest(i,0))
If IsObject(TestObj) then
IsObj = True
VerObj = TestObj.version
if VerObj="" or isnull(VerObj) then VerObj=TestObj.about
end if ObjTotest(i,2)=IsObj
ObjTotest(i,3)=VerObj
Next sub ObjTest(strObj)
on error resume next
IsObj=false
VerObj=""
TestObj=""
set TestObj=server.CreateObject (strObj)
If IsObject(TestObj) then
IsObj = True
VerObj = TestObj.version
if VerObj="" or isnull(VerObj) then VerObj=TestObj.about
end if End sub %>
<title>Object Check</title><table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#cccccc" width=80%>
<tr align=center><td width=40%>組 件 名 稱</td><td width=40%>相 關(guān) 信 息</td></tr> <%For i=0 to 13%>
<tr> <td> <%=ObjTotest(i,0) & " <font color=#888888>" & ObjTotest(i,1)%></font></td>
<td>
<% If Not ObjTotest(i,2) Then
Response.Write "<font color=red>不支持</font>"
Else Response.Write "支持," & left(ObjTotest(i,3),22)
End If%></td> </tr> <%next%> </table>
<FORM action=<%=filename%> method=post>
<input type=text name="classname" size=40>
<INPUT type=submit value=" 確 定 ">
</FORM> <% Dim strClass
strClass = Trim(Request.Form("classname"))
If strClass <> "" then
Response.Write "<br>您指定的組件的檢查結(jié)果:"
Dim Verobj1
ObjTest(strClass)
If Not IsObj then
Response.Write "<br><font color=red>很遺憾,該服務(wù)器不支持 " & strclass & " 組件!</font>" Else if VerObj="" or isnull(VerObj) then
Verobj1="無法取得該組件版本"
Else Verobj1="該組件版本是:" & VerObj
End If Response.Write "<br><font class=fonts>恭喜!該服務(wù)器支持 " & strclass & " 組件。" & verobj1 & "</font>" End If End if %>
如果你可以運行該ASP文件,也就是說你擁有IIS的WEB服務(wù)了。既然有IIS,不出意外,我們今天要學(xué)的組件AdRotator相信應(yīng)該也是支持的。
P.S.一般微軟自帶的大多是MSWC開頭。
廣告輪顯組件AdRotator組件,其功能相當(dāng)于在網(wǎng)站上建立了一個符合廣告領(lǐng)域標(biāo)準(zhǔn)功能的廣告系統(tǒng)。它具有每次訪問ASP頁面時,在頁面上顯示不同的廣告內(nèi)容;跟蹤特定廣告顯示次數(shù)的能力以及跟蹤客戶端在廣告上單擊次數(shù)的能力。
AD Rotator 組件的工作原理是通過讀取 AD Rotator 計劃文件來完成的,該文件包括與要顯示圖象文件的地點有關(guān)的信息,以及每個圖象的不同屬性。下面就是一個標(biāo)準(zhǔn)的 AD Rotator 計劃文件。
一、類型為txt文本 ,命名為myadrot.txt
redirect gourl.asp
width 88 height 31 border 1 *
http://www.cnbruce.com/images/logo.gif
http://www.cnbruce.com/ CN-Bruce 10
http://www.it365cn.com/images/logo.gif
http://www.it365cn.com It365cn 10
http://www.blueidea.com/images/logo.gif
http://www.blueidea.com Blue!dea 10
代碼的前四行包含了廣告的全局設(shè)置:
1,Redirect 指出廣告將成為其熱連接的URL。但其并非直接跳轉(zhuǎn)的URL,它包含了兩個參數(shù)的查詢字符串:特定廣告主頁的URL和圖象文件的URL。這些值從而可在gourl.asp文件中進行提取,并且與此同時gourl.asp還可以進行其他的處理工作,比如跟蹤單擊廣告的次數(shù)、跳轉(zhuǎn)到接受的的廣告主頁等。
2,width、height、border不用說一看就知道是連接圖片的寬、高以及邊框線大小。
“*”號表示了分隔符,以及“*”號下面的每四行為一個單位進行描述每個廣告的細(xì)節(jié)。其中分別代表:
1,每個廣告的描述包含圖象文件的URL
2,廣告對象的主頁URL(如果廣告客戶沒有主頁,則該行為一個連字符“-”,指出該廣告沒有鏈接)
3,圖象的替代文字
4,及指定該頁與其他頁交替顯示頻率的數(shù)值。
該文件是用戶自創(chuàng)建的文件。它通常用來解析由AdRotator對象發(fā)送的查詢字符串的腳本,并將用戶重定向到與用戶所點擊的廣告所相關(guān)的URL。那具體怎么應(yīng)用該定向文件呢?
二、adrotator.asp文件 最主要的是連接myadrot.txt文件,并且執(zhí)行myadrot.txt文件中的信息內(nèi)容。很簡單,兩行代碼。
<%set myad=Server.CreateObject("MSWC.adrotator")%>
<%=myad.getadvertisement("myadrot.txt")%>
“<%set myad=Server.CreateObject("MSWC.adrotator")%>”學(xué)過Server對象,相信還記得該對象強大的一個方法,那就是CreateObject。他可用于創(chuàng)建已經(jīng)注冊到服務(wù)器上的ActiveX組件實例。那這就表示引用組件MSWC.adrotator了。
“<%=myad.getadvertisement("myadrot.txt")%>”Ad Rotator組件支持的唯一方法也就是GetAdvertisement了,它只有一個參數(shù):AdRotator計劃文件的名稱。注意指向文件的路徑是當(dāng)前虛擬目錄的相對路徑,物理路徑是不允許的。也就是說當(dāng)前的adrotator.asp和myadrot.txt是在同一目錄下了。然后進行執(zhí)行該ASP文件,多次刷新,會發(fā)現(xiàn)每次的廣告確實是在輪顯著的。這時再注意點擊圖片的超級連接地址。比如:
gourl.asp?url=http://www.cnbruce.com/&image=http://www.cnbruce.com/images/logo.gif 很明顯我們還需要建立gourl.asp,并且將url參數(shù)的值進行提取,再接著跳轉(zhuǎn)到該url地址上。
三、gourl.asp 該頁主要功能是提取url參數(shù)值,跳轉(zhuǎn)到廣告主頁。代碼如下:
<%whaturl=request.querystring("url")%>
<%response.redirect whaturl%>
功能很簡單就完成。當(dāng)然,剛才也說了,這個頁還可以做其它一些事件:跟蹤客戶端在廣告上單擊次數(shù),比如將接受過來的相同的url地址進行記數(shù)的累加,就能顯示出該網(wǎng)站廣告的點擊次數(shù),然后和相應(yīng)廣告商拿取相應(yīng)的費用什么的……呵呵,在早期都要求需要實際點擊率的,現(xiàn)在好象不管,只要廣告掛那兒就行-_-!
不過,總的說來,這個組件的功能就是這樣。你有多個廣告商,并且是按比例單獨顯示,還需要計算實際點擊率的時候,用Ad Rotator組件是最好不過。那也就是說視情況而定了。
最后再說下,該組件的實現(xiàn)需要三個文件:重定向文件、引用文件、處理轉(zhuǎn)向文件。
Content Rotator組件正如Ad Rotator為廣告輪顯,Content Rotator組件則為內(nèi)容輪顯。
該組件就像一個簡化了的Ad Rotator組件,所以其工作原理亦為:通過讀取計劃文件來完成的網(wǎng)頁內(nèi)容的顯示。該計劃文件也就是:內(nèi)容調(diào)度文件(Content Schedule File)。
一,類型為txt文本 ,命名為context.txt
%% 3 //后面是注釋
<color=red>ASP編程入門進階</color>
%% 4 //下面顯示表格
<table><tr><td>www.cnbruce.com</td></tr></table>
%% 5 <A HREF="http://www.cnbruce.com">CN-Bruce</A>
該文件的結(jié)構(gòu)比Ad Rotator的調(diào)度文件簡單,僅需提供要使用的各個文本字符串的列表,由前面加兩個百分號(%%)的語句行說明。為了設(shè)置每個條目的比率(決定它出現(xiàn)在返回頁面中的頻率),在雙百分號的后面添加了一個數(shù)字。如果其后跟雙斜杠(//)就表示為添加的注釋。接著就是通過ASP頁面將這些信息按規(guī)定完整顯示。
二、showcontext.asp <% Set MyContent = Server.CreateObject("MSWC.ContentRotator")
Content = MyContent.ChooseContent("context.txt") Response.Write Content %>
"Set MyContent = Server.CreateObject("MSWC.ContentRotator")",先建立和Content Rotator組件的聯(lián)系。
"Content = MyContent.ChooseContent("context.txt")",表示采用Content Rotator組件的方法:ChooseContent,并且賦值給變量Content,到最后輸出顯示結(jié)果。
三、showall.asp以上頁面內(nèi)容個顯示是通過Content Rotator組件的ChooseContent方法實現(xiàn)的。此外,該組件還有一方法:GetAllContent。示例如下:
<% Set MyContent = Server.CreateObject("MSWC.ContentRotator")
Content = MyContent.GetAllContent("context.txt")
Response.Write Content %>
運行結(jié)果會發(fā)現(xiàn)context.txt所有內(nèi)容被解釋執(zhí)行,并且分類之間會自動添加了<hr>水平線。
當(dāng)然這個方法可以用在隨機圖片之類的特效頁面上。
ASP編程入門進階(十四):Browser & Linking 組件
一、Browser Capabilities組件該組件最主要的作用是:提取識別客戶端瀏覽器的版本信息。其原理是這樣的:當(dāng)客戶端瀏覽器向服務(wù)器發(fā)送頁面請求時,同時會自動發(fā)送一個User Agent HTTP標(biāo)題,而該標(biāo)題是一個聲明瀏覽器及其版本的 ASCII 字符串。而Browser Capabilities組件就將User Agent映射到在文件Browscap.ini中所注明的瀏覽器 , 并通過BrowserType對象的屬性來識別客戶瀏覽器。若該對象在 browscap.ini 文件中找不到與該標(biāo)題匹配的項,那么將使用默認(rèn)的瀏覽器屬性。若該對象既未找到匹配項且 browscap.ini 文件中也未指定默認(rèn)的瀏覽器設(shè)置,則它將每個屬性都設(shè)為字符串 "UNKNOWN"。
默認(rèn)情況下,browscap.ini文件被存放在 WINDOWS \ SYSTEM \ INERSRV( 如果是95/98+PWS4) 或 NT\SYSTEM32\INERSRV( 如果是 NT) 目錄中,你可以自己編輯這個文本文件,以添加自己的屬性或者根據(jù)最新發(fā)布的瀏覽器版本的更新文件來修改該文件。
可以得出結(jié)論,Browser Capabilities組件也就是提取某個文件中的內(nèi)容,然后比較得出顯示。具體該如何應(yīng)用呢?
1、btinfo.asp <%set bc=server.CreateObject("mswc.browsertype")%>
瀏覽器名稱是browser:<%=bc.browser%><br>
瀏覽器版本是version:<%=bc.version%> <br>
瀏覽器主版本是majorver:<%=bc.majorver%> <br>
瀏覽器輔版本是minorver:<%=bc.minorver%> <br>
瀏覽器的運行平臺是platform:<%=bc.platform%> <br>
很顯然“<%set bc=server.CreateObject("mswc.browsertype")%> ”就是進行的瀏覽器組件的建立,以下諸如“bc.browser”之類即為顯示瀏覽器的具體某個特性了。
2,btif.asp <%set bc=server.CreateObject("mswc.browsertype")%>
<%if bc.frames=true then%>
瀏覽器支持多窗口(frames)顯示
<%else%> 瀏覽器不支持多窗口(frames)顯示
<%end if%> <br> <%if bc.backgroundsounds=true then%>
瀏覽器可以播放背景音樂(backgroundsounds)
<%else%> 瀏覽器不能播放背景音樂(backgroundsounds)
<%end if%> <br> <%if bc.tables=true then%>
瀏覽器支持表格(tables)顯示
<%else%> 瀏覽器不支持表格(tables)顯示
<%end if%> <br> <%if bc.beta=true then%>
你的瀏覽器是一測試版(beta) <%else%> 你的瀏覽器是一正式版
<%end if%> <br> <%if bc.activexcotrols=true then %>
瀏覽器支持active控制 <%else%>
瀏覽器不支持active控制 <%end if%> <br>
<%if bc.cookies=true then%> 瀏覽器支持cookie功能 <%else%>
瀏覽器不支持cookie功能 <%end if%> <br>
<%if bc.vbscript=true then%>
瀏覽器支持vbscript <%else%> 瀏覽器不支持vbscript
<%end if%> <br> <%if bc.jscript=true then%> 瀏覽器支持jscript
<%else%> 瀏覽器不支持jscript <%end if%>
該代碼則是檢測當(dāng)前瀏覽器對各類網(wǎng)頁技術(shù)的支持情況,下面就可以根據(jù)某特定情況做相應(yīng)變動。
3、fram.asp<%set bc=server.CreateObject("mswc.browsertype")
if bc.frames then %> <frameset rows="*,*">
<frame src="http://www.google.com">
<frame src="http://www.baidu.com"> </framest> <%else%>
你的瀏覽器不支持框架 <%end if%>
很簡單的意思:如果當(dāng)前瀏覽器支持框架則進行frameset的顯示,否則提示“你的瀏覽器不支持框架”,當(dāng)然,需要提醒你的:不要過分依賴該組件,因為其只是提取browscap.ini里的值,而該值隨時可以被客戶修改,或者記錄過時,不能真實反映到瀏覽器的情況,所以要慎用。
二、Content Linking組件 曾經(jīng)用DW做網(wǎng)頁都有這樣一個煩惱:新做了頁面,其它所有相關(guān)的頁都要重新再做一次超級鏈接。一次也就罷了,多了多了不禁覺得無用功做了不少。試想如果能有一個專門的文件來負(fù)責(zé)頁面的連接那該多好。Content Linking 組件也就應(yīng)運而生了。它非但可以使你在這些頁面中建立一個目錄表,而且還可以在它們中間建立動態(tài)連接,并自動生成和更新目錄表及先前和后續(xù)的 Web 頁的導(dǎo)航鏈接。
使用該組件,首先需要編寫一個目錄文件,也就是網(wǎng)頁網(wǎng)址的順序列表文件,它是一個文本文件,可以自由命名。其次,編寫一個ASP文件,根據(jù)目錄文件提供的信息自動生成帶超鏈的目錄頁。如果需要在每一頁上假如“向前或向后翻頁”的超鏈,就再編寫一個能自動生成翻頁超鏈的包含文件,可使用inc為擴展名,例如"Nlink.inc"。以后,在組內(nèi)每一頁中包含它。
1,link.txt文件 redirect.asp?url=http://www.cnbruce.com/ cnbruce.com
redirect.asp?url=http://www.blueidea.com/ blueidea.com
redirect.asp?url=http://www.it365cn.com/ it365cn.com
該目錄文件的網(wǎng)址就是連接網(wǎng)址,文本就是連接文本了,需要注意的是中間采用Tab鍵進行分隔。
2,link.asp文件 <%Set objNextLink = Server.CreateObject("MSWC.Nextlink")%>
<% intCount = objNextLink.GetListCount("link.txt")
For i = 1 To intCount %>
<a href="<%=objNextLink.GetNthURL("link.txt", i) %>">
<%=objNextLink.GetNthDescription("link.txt", i) %>
</a><br><%Next%>
“Set objNextLink = Server.CreateObject("MSWC.Nextlink")”建立Nextlink組件的連接
“objNextLink.GetListCount("link.txt")”提取link.txt文件中的列表數(shù)目
“objNextLink.GetNthURL("link.txt",i)”提取link.txt文件中第i行文本的連接網(wǎng)址
“objNextLink.GetNthDescription("link.txt",i)”提取link.txt文件中第i行文本的連接文本
3,redirect.asp文件,就是轉(zhuǎn)向文件。
<% Response.Clear Response.Redirect Request.QueryString("url") %>
呵呵,是不是覺得還沒用到“上一頁”、“下一頁”的功能。再來~!
4,link1.txt 1.asp ASP編程入門進階(一) 2.asp ASP編程入門進階(二)
3.asp ASP編程入門進階(三) 4.asp ASP編程入門進階
主要功能是設(shè)置文本和連接
5,link1.inc <%Set Nextlink=Server.CreateObject("MSWC.NextLink")
Response.write "當(dāng)前文章索引號為" & NextLink.GetListIndex("link1.txt") & "<br>"
Response.write "上一章的標(biāo)題:" & NextLink.GetPreviousDescription("link1.txt") & "<br>" Response.write "下一章的標(biāo)題:" & NextLink.GetNextDescription("link1.txt") & "<br>" count = NextLink.GetListCount("link1.txt")
Response.write "<a href="""&NextLink.GetNthUrl("link1.txt",1)&"""&>"&"第一章"&"</a> " Response.write "<a href="""&NextLink.GetPreviousUrl("link1.txt")&"""&>"&"上一章"&"</a> "
Response.write "<a href="""&NextLink.GetNextUrl("link1.txt")&"""&>"&"下一章"&"</a> "
Response.write "<a href="""&NextLink.GetNthUrl ("link1.txt",count)&"""&>"&"最后一章"&"</a><br>" %>
GetListCount(目標(biāo)文件名) 顯示組件中包含的連接的文件數(shù)目。
GetListIndex(目標(biāo)文件名) 顯示當(dāng)前頁在這些連接文件中的前后位置索引值。
GetNextDescription(目標(biāo)文件名) 顯示連接文件中下一個的描述。
GetNextURL(目標(biāo)文件名) 顯示連接文件中的下一個文件的URL地址。
GetNthDescription(目標(biāo)文件名, N) 顯示連接文件中第N個網(wǎng)頁的描述。
GetNthURL(目標(biāo)文件名, N) 顯示連接文件中第N個網(wǎng)頁的文件URL地址。
GetPreviousDescription(目標(biāo)文件名) 顯示連接文件中前一個文件的描述。
GetPreviousURL(目標(biāo)文件名) 顯示連接文件中前一個文件的URL地址。
6,1.asp,2.asp,3.asp,4.asp
<!--#include file="link1.inc"--><br>
以下是具體內(nèi)容,這就是一個很簡單的分頁程序了。當(dāng)然接著的后面會有些更詳細(xì)更復(fù)雜的分頁,慢慢來吧,呵呵。
ASP編程入門進階(十五):計數(shù)器組件Counters
該組件用于創(chuàng)建一個或多個計數(shù)器,這些計數(shù)器用于跟蹤某一網(wǎng)頁或某一網(wǎng)站訪問次數(shù)的信息。你只能創(chuàng)建一個計數(shù)器組件,但該組件可以有多于一個的計數(shù)器。一旦創(chuàng)建了計數(shù)器,它將一直持續(xù)下去直到被刪除為止。計數(shù)器不會在一個事件比如訪問一頁時自動增加。你必須使用Set和Increment方法人工的設(shè)置或增長計數(shù)器。
計數(shù)器不受作用域限制。一旦創(chuàng)建了一個計數(shù)器,那么站點上的任何頁都可以檢索和控制它的值。
一、Counters.Set & Counters.Get Counters.Set主要用來設(shè)置記數(shù)初始值,Counters.Get則是用來提取記數(shù)的值。
1,counts_set.asp <% Set Counters=server.createobject("MSWC.Counters")
Counters.Set "cnbruce",10
Counters.set "it365cn",20
Counters.set "blueidea",30 %>
共有<%= Counters.Get("cnbruce") %>次訪問 cnbruce.com 網(wǎng)站 <br>
共有<%= Counters.Get("it365cn") %>次訪問 it365cn.com 網(wǎng)站 <br>
共有<%= Counters.Get("blueidea") %>次訪問 blueidea.com 網(wǎng)站 <br>
用法很簡單,首先“Counters=server.createobject("MSWC.Counters")”表示建立了一Counters組件的連接;Counters.Set "cnbruce",10表示記數(shù)了名為“cnbruce”的初始值10;Counters.Get("cnbruce")就表示提取名為“cnbruce”的記數(shù)值了。
二、Counters.Increment該方法的功能是:記數(shù)每次加一。在上例中你刷新頁面,記數(shù)是不會添加的,所以現(xiàn)在換用Increment方法。
2,counts_inc.asp <% Set Counters=server.createobject("MSWC.Counters") %>
共有<%= Counters.Increment("cnbruce") %>次訪問 cnbruce.com 網(wǎng)站 <br>
共有<%= Counters.Increment("it365cn") %>次訪問 it365cn.com 網(wǎng)站 <br>
共有<%= Counters.Increment("blueidea") %>次訪問 blueidea.com 網(wǎng)站 <br>
基本代碼相似,主要就是Counters.Increment的功能累加1。
根據(jù)累加可以做個簡單的投票系統(tǒng)了。
3,vote.asp <% set Counters=server.createobject("MSWC.Counters")
vote = Request.QueryString("site")
Counters.Increment(vote) %>
Vote for your Favorite Site:
<FORM NAME="Voting for Sites" METHOD="GET" ACTION="vote.asp">
<input type="RADIO" NAME="site" VALUE="cnbruce">cnbruce
<input type="RADIO" NAME="site" VALUE="it365cn">it365cn
<input type="RADIO" NAME="site" VALUE="blueidea">blueidea
<BR><INPUT TYPE="SUBMIT" VALUE="Submit Vote">
</FORM> Current Vote Tally:<BR>
Cnbruce: <% =Counters.Get("cnbruce") %><BR>
It365cn: <% = Counters.Get("it365cn") %><BR>
Blueidea: <% = Counters.Get("blueidea") %><BR>
功能是選擇某單選按鈕后提交,其對應(yīng)的記數(shù)值則Counters.Increment
三、Counters.Remove該對象則是起的記數(shù)清空的作用了。
4,remove.asp <% set Counters=server.createobject("MSWC.Counters")
vote = Request.QueryString("site")
clear = Request.QueryString("clear")
Counters.Increment(vote)
If Not clear="" Then
Counters.Remove("cnbruce")
Counters.Remove("it365cn")
Counters.Remove("blueidea")
End If %> Vote for your Favorite Site:
<FORM NAME="Voting for Sites" METHOD="GET" ACTION="remove.asp">
<input type="RADIO" NAME="site" VALUE="cnbruce">cnbruce
<input type="RADIO" NAME="site" VALUE="it365cn">it356cn
<input type="RADIO" NAME="site" VALUE="blueidea">blueidea
<BR><INPUT TYPE="SUBMIT" VALUE="Submit Vote"> </FORM>
Current Vote Tally:<BR>
Cnbruce: <% =Counters.Get("cnbruce") %><BR>
It365cn: <% = Counters.Get("it365cn") %><BR>
Blueidea: <% = Counters.Get("blueidea") %>
<FORM NAME="Clear Counters" METHOD="GET" ACTION="remove.asp">
<BR><INPUT TYPE="SUBMIT" VALUE="Clear the Counters" NAME="clear"> </FORM>
通過今天的接觸可以總結(jié)出,一個簡單的記數(shù)系統(tǒng)已經(jīng)有兩種方法:使用Application對象、使用Counters組件。但更多的還有采用FSO,或者是需要數(shù)據(jù)庫的就是后話慢慢談了。
在我們使用ASP組件時候還要注意一些東西:
當(dāng)我們使用服務(wù)器組件創(chuàng)建對象時,一般有兩種方法。比較常用的方法是用SERVER對象的CreateObject() 方法,象這樣: SET NextLink = Server.CreateObject("MSWC.NextLink")
這種方法很好用,但是還有一種方法更節(jié)省系統(tǒng)資源。因為當(dāng)你用Server.CreateObject()方法創(chuàng)建對象時,對象立即被加載,同時系統(tǒng)為這個對象分配好內(nèi)存和其它資源。
第二種創(chuàng)建對象的方法是利用HTML的<OBJECT>標(biāo)記,語法是這樣的:
<OBJECT Runat=Sever ID=NextLink ProgID="MSWC.NextLink" ></OBJECT>
利用<OBJECT>標(biāo)記創(chuàng)建對象時,你要創(chuàng)建的對象不被馬上加載,而是等到這個對象的方法或?qū)傩缘谝淮伪灰脮r才加載。這樣,我們就會節(jié)省一些資源。雖然不是很多,但是當(dāng)你的系統(tǒng)每天要承受近百萬次的點擊時,這對節(jié)省服務(wù)器資源就很有幫助了。(Pine譯注)如其所言:我們的Counters則可以放于global.asa中
<OBJECT RUNAT=Server SCOPE=Application ID=Counter PROGID="MSWC.Counters"></OBJECT>
ASP編程入門進階(十六):FSO組件之驅(qū)動器操作
FSO,正如UFO般令人激動、令人神往,當(dāng)然更多的亦是讓人歡喜讓人憂。君不見某空間服務(wù)商廣告:100MB空間只要60RMB/年,支持?jǐn)?shù)據(jù)庫,支持什么什么……一問不支持FSO,立馬泄氣。那FSO究竟是什么東西,它的力量又是如何巨大,其操作的原理又是怎的怎的呢?這次來個徹底的理解。
首先,F(xiàn)SO是FileSystemObject的簡稱。當(dāng)然也就是我們的俗稱FSO組件了,該組件可以用來處理驅(qū)動器、文件夾以及文件。它可以檢測并顯示出系統(tǒng)驅(qū)動器的信息分配情況;還能夠創(chuàng)建、改變、移動和刪除文件夾,并能探測一些給定的文件夾是否存在,若存在,還能提取出該文件夾的信息,如名稱、被創(chuàng)建或最后一次修改的日期,等。FSO還使得對文件的處理變得很容易。
一、fso.GetDrive 正如其它組件的建立一樣,F(xiàn)SO的引用也必須建立連接。
Set fso=Server.CreateObject("Scripting.FileSystemObject")
注意CreateObject的內(nèi)部再也不是MSWC了,而是Scripting。
那下面就可以通過fso來處理驅(qū)動器了。比如fso.GetDriveName提取驅(qū)動器名,fso.GetDrive同樣提取標(biāo)準(zhǔn)驅(qū)動器名。比如:
1,fso.asp <%Set fso=Server.CreateObject("Scripting.FileSystemObject")%>
<%=fso.GetDriveName("d:")%><br>
<%=fso.GetDrive("d:")%>
你會發(fā)現(xiàn)GetDriveName("d:")就是“d:”,而GetDrive("d:")則為標(biāo)準(zhǔn)的“D:”,所以我們一般這樣寫fso.GetDrive(fso.GetDriveName(drvPath))來提取某個具體的驅(qū)動盤。
二、drv.GetInfo 提取該驅(qū)動盤的具體信息。
2,drv.asp<% Set fso=Server.CreateObject("Scripting.FileSystemObject")
Set drv=fso.GetDrive(fso.GetDriveName("d:")) %>&n, bsp;
該盤的空間大小:<%=drv.TotalSize%><br>
該盤的剩余空間大小:<%=drv.FreeSpace%>
以上只是提取的D盤驅(qū)動器的信息,來個通用的函數(shù),繼續(xù)分別測試自己的驅(qū)動吧。
3,drvinfo.asp <% Function ShowDriveInfo(drvPath)
Dim fso, drv, s
Set fso = CreateObject("Scripting.FileSystemObject")
Set drv = fso.GetDrive(fso.GetDriveName(drvPath))
s = "驅(qū)動盤" & drv & "的卷標(biāo)是:"
s = s & drv.VolumeName & "<br>"
s = s & "總計空間:" & drv.TotalSize & "<br>"
s = s & "剩余空間:" & drv.FreeSpace & "<br>"
s = s & "文件類型:" & drv.DriveType & "<br>"
s = s & "文件系統(tǒng):" & drv.FileSystem
Response.Write s End Function %> <%
on error resume next
whatpath=request.form("path")
if whatpath<>"" then
ShowDriveInfo(whatpath)
end if%> <form action="drvinfo.asp" method="post">
<input name="path"> <input type="submit"> </form>
其中的drv.TotalSize和drv.FreeSpace返回的是字節(jié)數(shù),我們可以用FormatNumber()函數(shù)處理下。比如FormatNumber(Drive.TotalSize/1024,0)得到一眼就知磁盤多少G的值。
還有一個文件類型:drv.DriveType最多的時候是顯示數(shù)值“2”,其實“2”就表示的“硬盤驅(qū)動器”,“1”表示“軟盤驅(qū)動器”,“4”表示“光盤驅(qū)動器”……下面就用一個程序遍歷顯示自己機器上所有驅(qū)動器的信息
4,showall.asp <% Function tran(Driver) Select Case Driver
Case 0: tran="設(shè)備無法識別" Case 1: tran="軟盤驅(qū)動器" Case 2: tran="硬盤驅(qū)動器" Case 3: tran="網(wǎng)絡(luò)硬盤驅(qū)動器" Case 4: tran="光盤驅(qū)動器" Case 5: tran="RAM虛擬磁盤" End Select End Function
set fso=Server.CreateObject("Scripting.FileSystemObject")%>
<table border=1 width="100%"><tr>
<td>盤符</td> <td>類型</td> <td>卷標(biāo)</td> <td>總計大小</td> <td>可用空間</td> <td>文件系統(tǒng)</td>
<td>序列號</td> <td>是否可用</td> <td>路徑</td> </tr> <%
on error resume next For each drv in fso.Drives Response.Write "<tr>"
Response.Write "<td>" & drv.DriveLetter & "</td>"
Response.write "<td>" & tran(drv.DriveType) & "</td>"
Response.write "<td>" & drv.VolumeName & "</td>"
Response.write "<td>" & FormatNumber(drv.TotalSize / 1024, 0)& "</td>"
Response.write "<td>" & FormatNumber(drv.Availablespace / 1024, 0) & "</td>"
Response.write "<td>" & drv.FileSystem & "</td>"
Response.write "<td>" & drv.SerialNumber & "</td>"
Response.write "<td>" & drv.IsReady & "</td>"
Response.write "<td>" & drv.Path & "</td>" Response.Write "</tr>"Next set fs=nothing %> </table>
是不是很神氣?那你可以對自己的機器調(diào)試,然后上傳到自己的空間去調(diào)試,你會發(fā)現(xiàn)服務(wù)商會你進行了些設(shè)置:)
當(dāng)然更神的還在后面面,比如對文件夾,對文件的操作(包括添加、修改和刪除)。ps:你對驅(qū)動器是不能輕易添加刪除的:)
ASP編程入門進階(十七):FSO組件之文件夾操作
操作完驅(qū)動器,接著就是來操作文件夾了。其中包括:提取文件夾信息、創(chuàng)建文件夾、刪除文件夾、復(fù)制文件夾、移動文件夾等。下面就具體來看。
一、fso.GetFolder一看就明白,是提取文件夾了。那具體是提取哪個文件夾呢?后面肯定要跟一個文件夾的路徑。提取出來了再來顯示該文件夾相關(guān)信息呢?是不是有要具體提取下去。所以,看程序:1,getfldr.asp <% Set fso = CreateObject("Scripting.FileSystemObject")
Set fldr = fso.GetFolder("c:\Program Files")
Response.Write "父文件夾名字是:" & fldr & "<br>"
If fldr.IsRootFolder = True Then
Response.Write "該文件夾是一根文件夾" & "<br>"
Else Response.Write "該文件夾不是根文件夾" & "<br>"
End If Response.Write "驅(qū)動器名字是:" & fldr.Drive & "<br>" %>
首先建立FSO組件的連接是必不可少的啦,然后Set fldr = fso.GetFolder("c:\Program Files")設(shè)定fldr對象被賦值,以作下面程序的引用。
fldr.IsRootFolder即為判斷該文件夾是否為一根文件夾,值為布爾值(true or false);fldr.Drive則顯示該文件夾所在的驅(qū)動器號了。
二、fso.CreateFolder
下面比較讓人激動的是通過ASP建立文件夾了,你可以在你的權(quán)力范圍內(nèi)任意位置建立任意文件夾。
2,creatfldr.asp <% Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateFolder ("c:\cnbruce")
Response.Write "文件夾名為" & fso.GetBaseName("c:\cnbruce")%>
執(zhí)行程序,應(yīng)該發(fā)現(xiàn)C盤多出了cnbruce文件夾,fso.GetBaseName則是提取文件夾名。
三、fso.DeleteFolder 通過ASP可以建立了文件夾,則同樣可以刪除文件夾。
3,delfldr.asp <% Set fso = CreateObject("Scripting.FileSystemObject")
fso.DeleteFolder("c:\cnbruce")
Response.Write "文件夾已刪除"%>
發(fā)現(xiàn)剛建立的cnbruce文件夾確實已被刪除。那下面就采用一個通用程序來靈活應(yīng)變下。
4,mainflr.asp <% Sub CreateAFolder(file) Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateFolder(file)
response.write "已經(jīng)建立了"&file
End Sub Sub DeleteAFolder(file)
Dim fso Set fso = CreateObject("Scripting.FileSystemObject")
fso.DeleteFolder(file)
response.write "已經(jīng)刪除了"&file
End Sub %> <% subname=request.form("submit")
create=request.form("create")
del=request.form("del")
if subname<>"" then if create<>"" then
call CreateAFolder(""&create&"")
end if if del<>"" then
call DeleteAFolder(""&del&"")
end if end if %>
<form action="mainflr.asp" method="post">
<input name="create">
<input type="submit" value="建立" name="submit">
</form> <hr> <form action="mainflr.asp" method="post">
<input name="del"> <input type="submit" value="刪除" name="submit"> </form>
需要注意的是:刪除并不會提示“確認(rèn)要放入回收站”這項。這點你需要謹(jǐn)慎處理,特別是對你的系統(tǒng)文件夾。
四、fso.MoveFolder主要作用是進行文件夾的移動,相當(dāng)于剪切粘貼動作。
5,movefldr.asp<% Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateFolder ("c:\cnbruce")
fso.MoveFolder "c:\cnbruce", "C:\Program Files\"
%> <a href="C:\Program Files\">查看cnbruce文件夾有沒有移動過來</a>
格式:fso.MoveFolder "被移動的文件夾","移動到的文件夾"
本程序先是在C盤下建立了cnbruce文件夾,然后將其移動到C:\Program Files\文件夾下面。
不過同樣需要注意的是你的系統(tǒng)文件夾不能亂移動。
五、fso.CopyFolder主要作用:將文件夾從某位置復(fù)制到另一位置。
6,copyfldr.asp <% Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFolder "c:\Program Files\cnbruce", "c:\" %>
<a href="C:\">查看cnbruce文件夾有沒有復(fù)制過來</a>
該程序是建立在上一movefldr.asp的執(zhí)行結(jié)果基礎(chǔ)之上來完成復(fù)制到C盤根目錄下的。當(dāng)然,其拷貝也是將該文件夾包括里面所以子文件夾和文件統(tǒng)統(tǒng)拷貝。
到最后再試著將c:\Program Files\cnbruce和c:\cnbruce兩個文件夾進行刪除掉吧。
不過,繼續(xù)提醒你:不要寫錯了,比如寫成c:\Program Files,那你就慘了:這叫玩命,學(xué)ASP玩出心跳出來了。
對文件夾的操作差不多了,是不是感到用處比較大?不過還要注意注意正規(guī)合理利用該組件。然后接下來就是更微妙的:FSO對文件的操作。
ASP編程入門進階(十八):FSO組件之文件操作(上)
FSO中除了可以對驅(qū)動器、文件夾的操作以外,功能最強大的就是對文件的操作了。它可以用來記數(shù)、內(nèi)容管理、搜索還可生成動態(tài)HTML頁面等等。
一、fso.OpenTextFile無需多說,fso.OpenTextFile就是打開某個文件了,一般情況之下是打開的txt文本文件。所以首先我們先建立一個txt文件,然后通過FSO來讀取其中的內(nèi)容。
1,info.txt name:cnbruce sex:male
建立了該文件,下面再做個ASP頁面,當(dāng)然最好兩個文件是在同一目錄下。
2,opentxt.asp <% whichfile=server.mappath("info.txt")
Set fso = CreateObject("Scripting.FileSystemObject")
Set txt = fso.OpenTextFile(whichfile,1)
rline = txt.ReadLine
rline = rline & "<br>" & txt.ReadLine
Response.Write rline txt.Close %>
需要注意:無論是通過FSO打開驅(qū)動器、打開文件夾、打開文件,以及以后要接觸到的打開數(shù)據(jù)庫,都只能是打開絕對物理路徑地址。但一般情況是上傳到空間服務(wù)商那,不能很直接地了解到自己文件的所在位置,所以強烈推薦使用server.mappath方法:平臺移植性強,適用性強。
CreateObject("Scripting.FileSystemObject")建立了FSO組件的連接,fso.OpenTextFile(whichfile,1)打開了info.txt該文件。參數(shù)“1”表示“ForReading:以只讀方式打開文件。不能寫這個文件!保渌有參數(shù)“2”表示“ForWriting:以寫方式打開文件”,參數(shù)“8”表示“ForAppending:打開文件并從文件末尾開始寫”。打開了該文件,接下來是不是要顯示文件中的內(nèi)容?那就通過txt.ReadLine方法讀取文本中的一整行,如果需要繼續(xù)讀取下一行,則繼續(xù)使用txt.ReadLine方法。當(dāng)然初此還有其它的讀取方法,比如txt.Read(7)讀取指定數(shù)量的字符,txt.ReadAll返回文本中的全部內(nèi)容。
二、fso.CreateTextFile 如fso.CreateFolder建立文件夾般,fso.CreateTextFile則是建立文件了。
3,creattxt.asp <% whichfile=server.mappath("info.txt")
Set fso = CreateObject("Scripting.FileSystemObject")
Set MyFile = fso.CreateTextFile(whichfile,True)
MyFile.WriteLine("My Name Is CN-Bruce")
MyFile.WriteLine("My Sex Is Male")
MyFile.Close %> <a href="opentxt.asp">查看內(nèi)容</a>
本次建立的文件是上一info.txt文件,fso.CreateTextFile(whichfile,True)其中的參數(shù)true即表示能覆蓋已有文件。建立后需要向里面添加數(shù)據(jù)就采用“MyFile.WriteLine”了。
那現(xiàn)在就可以建立一個簡單的文本記數(shù)器了,還記得以前的記數(shù)嗎?
1,通過application、session、global.asa進行記數(shù);
2,通過Counter組件進行記數(shù)。但兩者都有通病,就是不能保存,如果服務(wù)器重新啟動后,是不是所有記數(shù)全部清空了呢:)那現(xiàn)在就可以使用文本來記錄數(shù)據(jù)了,即使重啟,下次提取的也還是該文件。
試驗:文本計數(shù)器首先建立一記數(shù)的文本文件counter.txt,設(shè)定初始值為“1”
4,counter.txt 1 接著是記數(shù)的ASP文件,功能是顯示文本的記數(shù),本做加1的記數(shù),然后還要將新的記數(shù)寫入文本文件。
5,txtcount.asp <% whichfile=server.mappath("counter.txt")
’打開文件并將其值讀取,最后關(guān)閉連接釋放資源
set fso=createobject("Scripting.FileSystemObject")
set openfile=fso.opentextfile(whichfile,1)
visitors=openfile.readline
openfile.close ’頁面顯示記數(shù)內(nèi)容并做加1運算
response.write "您是本頁的第"&visitors&"位訪客"
visitors=visitors+1 ’將新的數(shù)值添加寫入到文本,最后關(guān)閉所有連接釋放資源
set creatfile=fso.createtextfile(whichfile)
creatfile.writeLine(visitors) creatfile.close set fso=nothing %>
那根據(jù)這個可以繼續(xù)地擴展內(nèi)容:比如讓記數(shù)用數(shù)字圖片顯示。當(dāng)然前提就是你需要0-9的10張記數(shù)圖片,并將此圖片放于img文件夾中。下為一增強的txtcount.asp內(nèi)容代碼
<% whichfile=server.mappath("counter.txt")
set fso=createobject("Scripting.FileSystemObject")
set openfile=fso.opentextfile(whichfile,1)
visitors=openfile.readline
openfile.close
CountLen=len(visitors)
response.write "您是本頁的第"
for i=1 to 6-countLen ’表示最大值999999
response.write "<img src=img/0.gif></img>"
next for i=1 to countlen
response.write "<img src=img/" & mid(visitors,i,1) & ".gif></img>"
next response.write "位訪客"
visitors=visitors+1
set creatfile=fso.createtextfile(whichfile)
creatfile.writeLine(visitors)
creatfile.close set fso=nothing %>
本程序中采用的是mid函數(shù),該函數(shù)的作用是返回某字符串中從第幾位字符開始的幾個字符。格式即為:Mid(string,start,length)
ASP編程入門進階(十八):FSO組件之文件操作(中)
學(xué)會了FSO提取文件值,也學(xué)會了將信息輸入到文件中,那下面就再來應(yīng)用一下。不知道你有沒有這樣的習(xí)慣:看到一個文件,不自覺的右鍵選擇用記事本打開。呵呵,幾乎沒有哪個文件是不可以的。所以現(xiàn)在,可以默認(rèn)所有文件都是文本,只是后綴名不同而已;那么也就是說,現(xiàn)在可以提取任一文件的內(nèi)容信息。OK,就來想象一下:提取一個文件的路徑(采用file按鈕進行查找定位),將該路徑文件打開,并讀取所有行,顯示讀取的信息
一、viewcode.asp <% Function ShowCode(filename)
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set cnrs = fso.OpenTextFile(filename, 1)
While Not cnrs.AtEndOfStream
rsline = cnrs.ReadLine
rsline = server.HTMLEncode(rsline)
Response.Write(rsline & "<br>")
Wend end Function %>
<form action="viewcode.asp" method="post">
輸入文件名<input type="file" name="filename">
<input type="submit" value="查看源程序">
</form> <% file=request.form("filename")
response.write (file & "源程序如下<hr>")
If trim(file)<> "" then Call ShowCode(file) End If %>
以上程序調(diào)試時,可以選擇html,asp頁面,也可以打開任一應(yīng)用程序等。定義的ShowCode函數(shù),主要作用是打開、讀取并顯示文件中所有信息內(nèi)容。注意添加了server.HTMLEncode(rsline),針對含有標(biāo)準(zhǔn)HTML代碼的文件。顯示文件中所有行即用一條件循環(huán)進行遍歷顯示了。
While Not cnrs.AtEndOfStream ... Wend
接著,下面的這個例題具體就涉及open方法的問題了,還記得?正常情況之下打開文件是采用fso.OpenTextFile("c:\testfile.txt",1),參數(shù)1的作用是:以只讀模式打開文件。不能對此文件進行寫操作。如果現(xiàn)在已經(jīng)存在一文件,需要進行追加寫入,則該怎么辦呢?簡單,參數(shù)為8即可。
這有什么用呢?呵呵,亞瑪遜的網(wǎng)絡(luò)故事接龍就是如此:能接龍就需要首先要顯示原有故事,然后自己添加故事寫入文件。這其中的寫入文件最講究的就是追加寫入了。所以下面就可以實現(xiàn)。story.asp
<% If not request.Form("NextLine")="" then
Set fso=Server.CreateObject("Scripting.FileSystemobject")
textfile1=Server.MapPath("story.txt")
set cnrs=fso.OpenTextFile(textfile1,8)
cnrs.WriteLine(Request.Form("NextLine")) cnrs.Close end if %>
故事如下: <% Set fso=Server.CreateObject("Scripting.FileSystemObject")
textfile1=Server.MapPath("story.txt")
set cnrs=fso.OpenTextFile(textfile1,1)
while not cnrs.AtEndOfStream
Response.Write " " & cnrs.ReadLine
Wend cnrs.close %> <hr>
<form method="post" action="story.asp">
請輸入這個故事的新行:<input name="NextLine" type="text" size="70">
<input type="submit" value="提交"> </form>
整個就是一很簡單的讀取信息和加入信息的混合利用,相信有了前面的基礎(chǔ)看懂應(yīng)該不成問題。當(dāng)然還缺少個story.txt文件,里面寫好故事開頭就可以了。再下面,繼續(xù)來,該側(cè)重點主要就是練習(xí)一些函數(shù)的使用技巧了。
1、instr函數(shù):返回某字符串在另一字符串中第一次出現(xiàn)的位置。
比如現(xiàn)在查找字母“A”在字符串“A110B121C119D1861”中第一次出現(xiàn)的位置,則可以
同樣字母“B”的位置也就能確定,F(xiàn)在就來最關(guān)鍵的:提前字母“A”和“B”中間的值“110”。還記得mid函數(shù)嗎?mid函數(shù)的主要作用是:從字符串中返回指定數(shù)目的字符。比如現(xiàn)在的“110”則應(yīng)該是從字符串的第2位取得3個單位的值。
但設(shè)想一下:如果不是“110”,而是“1100”,那是不是要提取4位……這樣就顯出程序的不夠完美。所以繼續(xù)思考:所提取的值,永遠是在字母“A”后面的,且值也永遠是在字母“A”和“B”之間的,那么只要分別提取出“A”、“B”的位置,則中間數(shù)值的起始位應(yīng)是字母“A”位+1,中間數(shù)值的長度應(yīng)是字母“B”位-字母“A”位-1那么現(xiàn)在就可以讓程序完美起來:
OK,那么現(xiàn)在你也就完全可以把字母“B”、“C”、“D”后面的值一一提取了。
當(dāng)然需要注意的就是“D”后面有幾位怎么取呢?采用字符串總長度-字母D所在位置數(shù)就可以了。
<script language=vbs>
my_string = "A110B121C119D1861"
a_num = instr(my_string,"A")
b_num = instr(my_string,"B")
c_num = instr(my_string,"C")
d_num = instr(my_string,"D")
total_num = len(my_string)
a_value = mid(my_string,a_num+1,b_num-a_num-1)
b_value = mid(my_string,b_num+1,c_num-b_num-1)
c_value = mid(my_string,c_num+1,d_num-c_num-1)
d_value = mid(my_string,d_num+1,total_num-d_num)
alert(a_value) alert(b_value) alert(c_value) alert(d_value) </script>
到現(xiàn)在,你也許確實學(xué)到了不少,但也許會提出疑問:這個放在FSO文件操作里有什么作用呢?那下面才是我們的正題:用FSO進行簡單的文本投票。
投票頁面首要的就是顯示各類項目的投票數(shù),并相應(yīng)賦于某個變量。然后判斷本次投票的選相,相對應(yīng)地將投票數(shù)值加1,完畢后再將所有值繼續(xù)寫入文本。
1,一個HTML表單頁website.html 以做投票點擊的平臺。
2,接受表單頁值的result.asp
<% whichfile=server.mappath("site.txt")
set fso=createobject("Scripting.FileSystemObject")
set thisfile=fso.opentextfile(whichfile)
my_string=thisfile.readline
a_num = instr(my_string,"A")
b_num = instr(my_string,"B")
c_num = instr(my_string,"C")
d_num = instr(my_string,"D")
total_num = len(my_string)
a_value = mid(my_string,a_num+1,b_num-a_num-1)
b_value = mid(my_string,b_num+1,c_num-b_num-1)
c_value = mid(my_string,c_num+1,d_num-c_num-1)
d_value = mid(my_string,d_num+1,total_num-d_num)
select case request.form("website")
case "A": a_value=a_value+1
case "B": b_value=b_value+1
case "C": c_value=c_value+1
case "D": d_value=d_value+1
end select
mynew_string="A" & cstr(a_value) & "B" & cstr(b_value) & "C" & cstr(c_value) & "D" & cstr(d_value)
set newfile=fso.createtextfile(whichfile)
newfile.writeLine(mynew_string)
newfile.close set fso=nothing
%> 當(dāng)前投票:<br> cnbruce.com:<%=a_value%><br>
blueidea.com:<%=b_value%><br>
it356cn.com:<%=c_value%><br>
5d.cn:<%=d_value%><br> <a href="website.html">返回繼續(xù)</a>
有了上面函數(shù)的基礎(chǔ),看這個應(yīng)該不是很難的
3,最后不要忘了的記數(shù)文件site.txt
格式:A1B1C1D1 OK,三個文件就可以勝任一個很簡單的投票系統(tǒng)了,如果要加強,需要細(xì)化的則結(jié)合以前的知識吧,比如投過一次后設(shè)置session或者cookies,當(dāng)再次投票時候判斷如果session或者cookies存在則不允許,也就是簡單的投票防作假手段了……當(dāng)然更多的還是要自己去想去實踐了。
ASP編程入門進階(十八):FSO組件之文件操作(下)
一,fso.GetFile 提取文件相應(yīng)的 File 對象
1,getfile.asp <% whichfile=Server.MapPath("cnbruce.txt")
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.CreateTextFile(whichfile,true)
f1.Write ("This is a test.My Name is cnbruce.")
f1.Close Set f2 = fso.GetFile(whichfile)
s = "文件名稱:" & f2.name & "<br>"
s = s & "文件短路徑名:" & f2.shortPath & "<br>"
s = s & "文件物理地址:" & f2.Path & "<br>"
s = s & "文件屬性:" & f2.Attributes & "<br>"
s = s & "文件大。 " & f2.size & "<br>"
s = s & "文件類型: " & f2.type & "<br>"
s = s & "文件創(chuàng)建時間: " & f2.DateCreated & "<br>"
s = s & "最近訪問時間: " & f2.DateLastAccessed & "<br>"
s = s & "最近修改時間: " & f2.DateLastModified response.write(s) %>
其效果正如右鍵某文件,看到的具體屬性信息。
其中Attributes返回的數(shù)值“32”表示:(Archive)上次備份后已更改的文件?勺x寫。
其它值附錄如下:
Normal 0 普通文件。 沒有設(shè)置任何屬性。
ReadOnly 1 只讀文件。 可讀寫。
Hidden 2 隱藏文件。 可讀寫。
System 4 系統(tǒng)文件。 可讀寫。
Directory 16 文件夾或目錄。 只讀。
Archive 32 上次備份后已更改的文件。 可讀寫。
Alias 1024 鏈接或快捷方式。 只讀。
Compressed 2048 壓縮文件。 只讀。
二,file.move文件將指定的文件或文件夾從某位置移動到另一位置。其實該方法仍然屬于fso.GetFile后的一個應(yīng)用。
2,movefile.asp <% whichfile=Server.MapPath("cnbruce.txt")
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.CreateTextFile(whichfile,true)
f1.Write ("This is a test.My Name is cnbruce.")
f1.Close Set f2 = fso.GetFile(whichfile)
f2.Move "C:\"
%> <a href="C:\">查看下有沒有</a>
簡單的剪切粘貼的功能實現(xiàn)。
三,F(xiàn)ile.Copy 同樣屬于fso.GetFile后的一個應(yīng)用。就只是單純地拷貝文件到某位置。
3,copyfile.asp <%
whichfile=Server.MapPath("cnbruce.txt")
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.CreateTextFile(whichfile,true)
f1.Write ("This is a test.My Name is cnbruce.")
f1.Close Set f2 = fso.GetFile(whichfile)
f2.Copy "D:\"
%> <a href="D:\">查看下有沒有</a>
和本ASP頁面同在目錄下的cnbruce.txt文件依然存在。
四,file.Delete很顯然,就是直接刪除文件了。
4,delfile.asp <% whichfile=Server.MapPath("cnbruce.txt")
Set fso = CreateObject("Scripting.FileSystemObject")
Set f1 = fso.CreateTextFile(whichfile,true)
f1.Write ("This is a test.My Name is cnbruce.")
f1.Close Set f2 = fso.GetFile(whichfile)
f2.move "d:\" Set f3 = fso.GetFile("d:\cnbruce.txt")
f3.delete %> <a href="d:\">查看下是沒有該文件的</a>
當(dāng)然FSO還沒有結(jié)束,比如上傳文件,ASP轉(zhuǎn)HTML等都需要用到FSO。更精彩的依然是在后面。
ASP編程入門進階(十九):ASP技巧累加(二)
嚴(yán)格控制Session可以將不需要Session的內(nèi)容(比如幫助畫面,訪問者區(qū)域,等等)移動到關(guān)閉Session的獨立ASP應(yīng)用程序中。在基礎(chǔ)頁面上,可以給ASP一個指示,讓它不需要使用Session。將下面的代碼直接加入到ASP頁面的頭部:<%@EnableSessionState=False%>
在Web服務(wù)器上緩存經(jīng)常使用的數(shù)據(jù) 典型的情況是:ASP頁面從后臺存儲中取回數(shù)據(jù),然后以超文本標(biāo)記語言(HTML)的形式形成結(jié)果。不管數(shù)據(jù)庫的速度如何,從內(nèi)存中取回數(shù)據(jù)要比從后臺存儲設(shè)備中快得多。從本地硬盤讀取數(shù)據(jù)通常也非?臁K,提高性能可以通過緩存服務(wù)器上的數(shù)據(jù)來實現(xiàn),無論是將數(shù)據(jù)緩存在內(nèi)存中,或者本地硬盤中。緩存是經(jīng)典的“空間換時間”的折中方式。如果緩存得恰當(dāng),就可以看到顯著的性能提升。為了讓緩存有效,必須保證緩存數(shù)據(jù)是經(jīng)常要重用的,而且也是計算起來繁瑣的。裝滿陳舊數(shù)據(jù)的緩存是對內(nèi)存的浪費。
不經(jīng)常改變的數(shù)據(jù)是緩存的較好對象,因為不需要隨時考慮這些數(shù)據(jù)更新后的同步操作。組合框、參考表格、DHTML代碼、擴展標(biāo)記語言串、菜單以及站點配置變量(包括數(shù)據(jù)源名字,Internet協(xié)議地址IP以及Web路徑)都是很好的緩存對象。注意:要緩存數(shù)據(jù)表達式而不是數(shù)據(jù)本身。如果一個ASP頁面經(jīng)常變化并且很費力去緩存(比如整個產(chǎn)品目錄),就要考慮預(yù)產(chǎn)生HTML,而不是每次發(fā)生請求時再描述它。
在Application或Session對象中緩存經(jīng)常使用的數(shù)據(jù)ASP中的Application和Session對象是在內(nèi)存中緩存數(shù)據(jù)的便利容器。你可以將數(shù)據(jù)賦值給Application和Session對象,這些數(shù)據(jù)在HTTP調(diào)用期間將一直保持在內(nèi)存中。Session中的數(shù)據(jù)是為每一個用戶服務(wù)的,Application中的數(shù)據(jù)是所有用戶共享的。
何時需要在Application和Session中裝入數(shù)據(jù)?通常,當(dāng)應(yīng)用程序啟動或者會話開始時,數(shù)據(jù)就被裝入了。為了在這時裝入數(shù)據(jù),在Application OnStart()或者Session OnStart()中分別添加適當(dāng)?shù)拇a。這些函數(shù)位于文件Global.asa中,如果原來不存在,就添加上。也可以在數(shù)據(jù)首次需要的時候調(diào)入,在ASP頁面中添加代碼,檢查數(shù)據(jù)是否存在,如果沒有發(fā)現(xiàn),就調(diào)入它。這里有一個例子,它代表了被稱為“l(fā)azy evalution”的經(jīng)典性能處理技術(shù):直到需要,再去計算。
拷貝經(jīng)常使用的數(shù)據(jù)到腳本變量中在ASP中存取COM對象時,應(yīng)該拷貝經(jīng)常使用的對象數(shù)據(jù)到腳本變量中,這樣就減少了對COM對象的方法調(diào)用。這些調(diào)用要比存取腳本變量相對來說費時費力。當(dāng)存取Collection和Dictionary對象時,使用這項技巧也減少了昂貴的查找操作。通常,如果要不止一次地存取對象數(shù)據(jù),就應(yīng)將數(shù)據(jù)放入腳本變量中,對象數(shù)據(jù)主要也就是Request變量(表單和查詢字符串變量)。比如,站點要傳遞一個叫做UserID的查詢字符串變量,假設(shè)它將在一個特殊頁面被引用12次,那么不需要調(diào)用Request("UserID")12次,只要在ASP頁面的頭部分配給UserID一個變量,然后在頁面中使用它,這樣做就節(jié)省了11次COM方法的調(diào)用。
在任何可能時使用Server.Transfer,而不要用Response.Redirect
Response.Redirect告訴瀏覽器請求另一個不同的頁面,這常常用于引導(dǎo)用戶到登錄頁面或者出錯處理頁面。由于重定向強迫了一個新頁面請求,結(jié)果是瀏覽器必須要與Web服務(wù)器循環(huán)2次,并且Web服務(wù)器必須處理一個額外的請求。Server.Transfer執(zhí)行在同一服務(wù)器上的頁面?zhèn)鬏敚@將避免額外的瀏覽器-Web服務(wù)器的數(shù)據(jù)循環(huán),形成良好的系統(tǒng)性能,對于用戶也有較好的響應(yīng)時間。當(dāng)然Server.Transfer只支持相對路徑(即站內(nèi)使用)。
ASP編程入門進階(二十):ADO組件之顯示數(shù)據(jù)記錄
學(xué)習(xí)ASP的萬里長征就快到終點了:等把ASP的ADO組件搞定。當(dāng)然這也是最重要的一步,幾乎前面所有的學(xué)習(xí)都是為了這個最終的目的。OK,下面就來詳細(xì)系統(tǒng)地來一一掌握,步步為營,各個擊破。
一,擁有數(shù)據(jù)庫可以這么說:靜態(tài)頁面和動態(tài)頁面最大的區(qū)別就是采用了數(shù)據(jù)庫。其中運用操作數(shù)據(jù)庫主要是對數(shù)據(jù)庫內(nèi)容進行:顯示、插入、修改、更新、查詢和刪除。這些方法當(dāng)然也不是一口就能吃出來的,要慢慢感受咀嚼、理解消化。當(dāng)然首先很重要的便是先擁有數(shù)據(jù)庫了。
一般而言,我們所說的數(shù)據(jù)庫其實就是一個數(shù)據(jù)庫文件,該文件是由一些數(shù)據(jù)庫管理系統(tǒng)(DBMS)建立生成的。目前一般的DBMS也就是常用常聽說的ACCESS,SQLSERVER,MYSQL,ORACLE。當(dāng)然一般個人站點,小型企業(yè)采用ACCESS完全足夠;稍微大些的就采用同樣是Microsoft公司的SQL SERVER或者是MYSQL,值得注意的是MYSQL一般是和另外一種網(wǎng)絡(luò)編程語言PHP完美結(jié)合的。當(dāng)然更大型的就采用ORACLE了。呵呵,曾經(jīng)在學(xué)習(xí)PB時還運用到SYBASE數(shù)據(jù)庫,UNIX系統(tǒng)的Informix數(shù)據(jù)庫……DBMS簡直是多如牛毛-_-!話說過來,目前我們就直接使用ACCESS了:1,使用簡單;2,入門掌握容易;3,實在沒有比這個更適合初學(xué)的了。一切還得從實際操作開始。
1、打開ACCESS數(shù)據(jù)庫,選擇新建數(shù)據(jù)庫,將其命名為cnbruce.mdb,并保存到一專門文件夾database中
2、在新建的數(shù)據(jù)庫容器中雙擊“使用設(shè)計器創(chuàng)建表”,彈出的表1窗口中字段名稱輸入“cn_id”,數(shù)據(jù)類型選擇“自動編號”,并選擇上方工具欄中的鑰匙按鈕,將該字段設(shè)為主鍵。繼續(xù)輸入字段“cn_title”,數(shù)據(jù)類型選擇“文本”;NEXT輸入字段“cn_content”,數(shù)據(jù)類型選擇“備注”;
PS:備注和一般類型文本最大的區(qū)別就是備注允許插入的字段值相對要多些,這在插入一些較長文章的時候尤其重要。
仍然輸入字段“cn_author”,數(shù)據(jù)類型選擇“文本”;并且切換到下面“常規(guī)”中的“允許空字符串”選擇“是”。
PS:這表面允許cn_author字段的值可以是空的,這在當(dāng)提交表單,某些信息不填寫但要正確插入數(shù)據(jù)庫時,顯得很重要。
最后輸入字段“cn_time”,數(shù)據(jù)類型選擇“日期/時間”,繼續(xù)切換到“常規(guī)”中的“默認(rèn)值”輸入“now()”函數(shù),末了,我們將“表1”另存為“cnartile”
3,雙擊打開cnartile表,填寫第一行:“cn_title”輸入“test”,“cn_content”輸入“this is a test”,“cn_author”輸入“cnbruce”,時間已經(jīng)自動添加。完成!關(guān)閉表,關(guān)閉數(shù)據(jù)庫。
二,建立數(shù)據(jù)庫連接OK,數(shù)據(jù)庫已經(jīng)建立完畢,并且已經(jīng)填寫了一行信息內(nèi)容。那么現(xiàn)在需要的就是同過ASP將該行信息顯示出來。要想顯示,首先還是需要ASP與該數(shù)據(jù)庫文件建立連接,具體怎么建立?往下看。
1,conn.asp:主要起的是連接并打開某數(shù)據(jù)庫文件的功能。該文件建議單獨存在,并且位置是和存放數(shù)據(jù)庫的文件夾database處與同一物理層次。
<% db_path = "database/cnbruce.mdb"
Set conn= Server.CreateObject("ADODB.Connection")
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(db_path) conn.Open connstr %>
db_path = "database/cnbruce.mdb",不用說,就是將數(shù)據(jù)庫的相對路徑賦到一個變量上,以方便下面繼續(xù)調(diào)用。
Set conn= Server.CreateObject("ADODB.Connection"),和其它建立組件一樣,建立了一個ADO連接,并用一對象conn來接受。
connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(db_path),很顯然就是連接字符串了,其包括打開數(shù)據(jù)庫的驅(qū)動方法OLEDB,和打開和哪個數(shù)據(jù)庫的連接(即數(shù)據(jù)庫的路徑)。
需要再次提醒的是:無論是FSO對文件、文件夾的操作還是ADO對數(shù)據(jù)庫的操作,對被操作文件的取得都是獲得的絕對的物理地址,一般情況之下,采用Server.MapPath方法相對較好。
conn.Open connstr最后對象conn通過連接字符串connstr打開了數(shù)據(jù)庫的連接。
三,顯示數(shù)據(jù)庫內(nèi)容 建立了數(shù)據(jù)庫,建立了和數(shù)據(jù)庫的連接,下面水到渠成地就是將數(shù)據(jù)庫中的內(nèi)容通過ASP顯示出來。
2,showit.asp <!--#include file="conn.asp" -->
<% Set rs = Server.CreateObject ("ADODB.Recordset")
sql = "Select * from cnarticle"
rs.Open sql,conn,1,1 %> <%
if rs.EOF and rs.BOF then
response.write ("暫時還沒有文章")
else Do Until rs.EOF
response.write("文章標(biāo)題是:"& rs("cn_title"))
response.write("<br>文章作者是:"& rs("cn_author"))
response.write("<br>文章加入時間是:"& rs("cn_time"))
response.write("<br>文章內(nèi)容是:"& rs("cn_content"))
response.write("<hr>") rs.MoveNext Loop end if %> <%
rs.close Set rs = Nothing conn.close set conn=Nothing %>
簡單調(diào)試本頁,不出任何意外,相信一定能將數(shù)據(jù)庫中的信息顯示出來了。 下面就來具體一個一個解釋來理解沒行的含義:
1,<!--#include file="conn.asp" --> 沒有任何爭議,主要是調(diào)用conn.asp的所起的功效,這在解釋conn.asp文件的時候已經(jīng)明白。
2,Set rs = Server.CreateObject ("ADODB.Recordset") ADO組件除了Connection連接以外,還有Recordset綁定記錄集(相信用過DW做ASP的人現(xiàn)在開始有些重回故里的感覺了)當(dāng)然 rs 可以形象地想象成數(shù)據(jù)庫表中的某一行。
3,sql = "Select * from cnarticle" 標(biāo)準(zhǔn)的SQL結(jié)構(gòu)化查詢語言。很簡單:建立了數(shù)據(jù)庫連接,也綁定了記錄集,那具體需要哪些信息呢?也就是要篩選一些記錄集合了,不過當(dāng)前采用的是無任何條件,即可以提取所有。
4,rs.Open sql,conn,1,1 真正地打開通向數(shù)據(jù)庫中記錄集的大門,具體有關(guān)后面的參數(shù)可以從如下網(wǎng)址中獲得。
5,if rs.EOF and rs.BOF then 該語句里面涉及到了rs.EOF 和 rs.BOF 以及兩者的邏輯運算 and 。rs.EOF 表示到達數(shù)據(jù)庫表中的最后一行,rs.BOF 表示到達數(shù)據(jù)庫表中的第一行。整個語句可以理解為,如果當(dāng)前數(shù)據(jù)庫中的最后一行就是數(shù)據(jù)庫表中第一行,那么可以肯定:當(dāng)前數(shù)據(jù)庫表中沒有任何數(shù)據(jù)。
6,Do Until rs.EOF ...
rs.MoveNext Loop
主要就是一個DO LOOP 循環(huán)語句了,其中循環(huán)的結(jié)束條件為:直到rs.EOF,即值得數(shù)據(jù)庫表的最后一行。那么在這些條件滿足的許可之內(nèi),就是來顯示具體的信息了。
每次循環(huán)只能顯示數(shù)據(jù)庫表中的一行,如果要繼續(xù)讀取下行,那么 rs.MoveNext 功能真是如此。
7,rs("cn_title")等等 主要就是具體顯示記錄集中的哪個特定字段的信息值了。很是簡單。
8,最后不要忘了釋放資源空間關(guān)閉記錄集連接,關(guān)閉數(shù)據(jù)庫連接。
四一些特殊條件 有沒有注意到,數(shù)據(jù)庫表信息的顯示一般是按照時間的先后排列的,也就經(jīng)常提到的按時間的升序排列。需要注意:按時間升序,并不一定每個數(shù)據(jù)庫表中都要有一個時間/日期類型的字段,只要存在一個自動編號的字段就可以了。因為該字段是永不重復(fù),并且是依次增大的。因此,按時間升序其實就是按自動編號中號碼數(shù)值的增加來進行排序的。
當(dāng)然,問題的關(guān)鍵來了,那就是要按照時間的降序排列,即始終從最新的內(nèi)容開始顯示。那具體需要哪些手術(shù)呢?很簡單,將連接字符串稍做修改。
由 sql = "Select * from cnarticle" 添加修改為
sql = "Select * from cnarticle order by cn_id desc"
其中 order by cn_id 即通過cn_id字段,desc 即降序了。
2,有是時候,只需要提取最前或者最新的幾條信息,那這個又具體如何操作呢?同樣還是連接字符串的修改由 sql = "Select * from cnarticle order by cn_id desc" 添加修改為
sql = "Select top 3 * from cnarticle order by cn_id desc"
其中 top 3 就表示提取最新的三條信息內(nèi)容了。
That’s All. 現(xiàn)在一個文章系統(tǒng)、新聞系統(tǒng)或者留言本顯示部分的精華內(nèi)容你已不費吹灰之力搞定。留下你的是:文章的格式可能顯示不對勁,比如回車、空格都不顯示了,那么你就還要學(xué)會處理接受的數(shù)據(jù)庫表的值(在ASP的幾個練習(xí)中提到的);文章不能老是打開數(shù)據(jù)庫輸入信息啊,那么你就要繼續(xù)學(xué)會如何用ASP插入數(shù)據(jù)到庫表;再有就是文章多了,一個頁面看是不是很麻煩?那么你還要學(xué)會分頁技術(shù)……
要搞的太多了,后面我會詳細(xì)道來:)
ASP編程入門進階(二十):ADO組件之插入數(shù)據(jù)記錄
簡單的顯示記錄已經(jīng)掌握,現(xiàn)在需要的就是通過ASP將信息內(nèi)容插入到數(shù)據(jù)庫中。
一、擁有數(shù)據(jù)庫cnbruce.mdb
本數(shù)據(jù)庫的作用就是用來被插入數(shù)據(jù)的,可以直接采用上節(jié)中已經(jīng)建立的cnbruce.mdb文件,當(dāng)然連接打開數(shù)據(jù)庫的文件conn.asp也就順利引用了。
二、建立輸入插入信息的頁面平臺addit.html
本頁的主要作用是:顯示一些文本輸入框以用來提供輸入信息內(nèi)容提交數(shù)據(jù)庫。
1,addit.html
本頁其實很簡單,就是通過submit按鈕將表單的信息內(nèi)容提交到addit.asp頁面去處理。
三、建立處理接受數(shù)據(jù)并插入數(shù)據(jù)庫表的頁面程序addit.asp
2,addit.asp <!--#include file="conn.asp" --> <%
whattitle=request.form("title")
whoauthor=request.form("author")
whatcontent=request.form("content") %> <%
Set rs = Server.CreateObject ("ADODB.Recordset")
sql = "Select * from cnarticle"
rs.Open sql,conn,3,2 %> <% rs.addnew
rs("cn_title")=whattitle rs("cn_author")=whoauthor rs("cn_content")=whatcontent
rs.update %> 文章添加成功,<a href="showit.asp">瀏覽</a> <% rs.close
Set rs = Nothing conn.close set conn=Nothing %>恩,接著就是來具體分析一下。
1,<!--#include file="conn.asp" --> 不用說,凡是要和數(shù)據(jù)庫有聯(lián)系的都要運用到該連接文件。
2,whattitle=request.form("title")之類 就是將上頁表單中接受過來的值賦到一變量上,方便下面程序的調(diào)用。
3,rs.Open sql,conn,3,2 注意參數(shù)和顯示數(shù)據(jù)庫時采用的參數(shù)的不同。
4,rs.addnew 很簡單也很顯眼的一個聲明:新建一個數(shù)據(jù)庫記錄集行。
5,rs("cn_title")=whattitle之類 即將接受的表單值對應(yīng)到相關(guān)字段中。
6,rs.update 只是值和數(shù)據(jù)庫字段的對應(yīng),完了后還要將對應(yīng)的值上傳提交到數(shù)據(jù)庫表中去。
7,插入后可以跳轉(zhuǎn)到showit.asp查看 需要說明,以后的ASP例題可能都是建立在前幾節(jié)內(nèi)容的基礎(chǔ)之上完成的。
8,釋放資源 是規(guī)矩,不要忘記。
那么,現(xiàn)在插入并顯示數(shù)據(jù)庫記錄,對你來說完全是小菜一碟了。大體框架搭建完畢,下面就是具體的細(xì)化了。其中包括:客戶端的表單檢測,防止用戶信息輸入的遺漏;當(dāng)然最好還是要加上服務(wù)器端的表單檢測,由于客戶端的某些原因(比如自行設(shè)計提交非檢測的頁面)基于安全考慮,一切還是依服務(wù)器端所接受信息為準(zhǔn)。那下面就繼續(xù)細(xì)化應(yīng)用下了。
1,客戶端檢測 其實就是通過簡單的腳本檢測,這在初學(xué)ASP提到腳本的時候說到,下面將再次重復(fù)。加強的addit.html
<script laguage="javascript">
<!-- function form1_onsubmit()
{ if (document.form1.title.value=="")
{ alert("請輸入文章標(biāo)題")
document.form1.title.focus()
return false }
else if(document.form1.content.value=="")
{ alert("請輸入文章內(nèi)容")
document.form1.content.focus()
return false } } --> </script>
<form action="addit.asp" method="post" name="form1" onsubmit="return form1_onsubmit()">
Title:<input type="text" name="title"><br>
Author:<input type="text" name="author"><br>
Content:<br>
<textarea name="content" rows="8" cols="30"></textarea><br>
<input type="submit" value="Add">
<input type="reset" value="Reset">
</form>
2,服務(wù)器端檢測 有人也許會問,既然有了客戶端的檢測,那還有多個服務(wù)器端的檢測呢?原因很簡單,比如仿照HTML表單提交頁,自行設(shè)計一張去除了表單檢測的頁面。當(dāng)點擊提交,并且沒有任何信息時,到達服務(wù)器端如沒有任何防御則肯定會造成數(shù)據(jù)插入的失敗。
加強的addit.asp <!--#include file="conn.asp" -->
<% whattitle=trim(request.form("title"))
whoauthor=trim(request.form("author"))
whatcontent=trim(request.form("content")) %>
<%if whattitle="" then%>
<script language=vbs>
alert("請輸入文章標(biāo)題")
history.go(-1)</script> <%end if%>
<%if whatcontent="" then%>
<script language=vbs>
alert("請輸入文章標(biāo)題")
history.go(-1) </script> <%end if%> <%
Set rs = Server.CreateObject ("ADODB.Recordset")
sql = "Select * from cnarticle"
rs.Open sql,conn,3,2 %> <%
rs.addnew
rs("cn_title")=whattitle
rs("cn_author")=whoauthor
rs("cn_content")=whatcontent
rs.update %>
文章添加成功,<a href="showit.asp">瀏覽</a>
<% rs.close Set rs = Nothing conn.close set conn=Nothing %>
可以看出,就是添加了如下類似的判斷!<%if whattitle="" then%>
<script language=vbs>alert("請輸入文章標(biāo)題") history.go(-1) </script> <%end if%>
很簡單,如果接受過來的信息為空,則彈出警告框,并且確認(rèn)后返回到上頁即addit.html了。當(dāng)然cn_author沒有設(shè)置檢測,因為當(dāng)初設(shè)計該字段的接受值是允許為空的。
OK,總結(jié)一下,插入記錄主要就是 rs.addnew rs("cn_title")=whattitle ... rs.update
很簡單,先聲明addnew,然后一一對應(yīng),再提交插入數(shù)據(jù)庫。這是一種插入數(shù)據(jù)庫的方法,下面來接觸了解一下另外一種。需要注意,結(jié)構(gòu)化的查詢語言也就是SQL語句能夠完成一些比較苛刻的數(shù)據(jù)庫操作。當(dāng)然,對于諸如提取、插入信息之流就更不在話下了。所以下面采用的插入記錄的方法就是直接采用SQL語法完成。
修改了的addit.asp
<!--#include file="conn.asp" --> <%
whattitle=request.form("title")
whoauthor=request.form("author")
whatcontent=request.form("content") %> <%
sql = "insert into cnarticle(cn_title,cn_author,cn_content) values(’ "&whattitle&" ’,’ "&whoauthor&" ’,’ "&whatcontent&" ’)"
conn.Execute(sql) %>
文章添加成功,<a href="showit.asp">瀏覽</a>
<% conn.close set conn=Nothing %>
本程序中,你會發(fā)現(xiàn)只要一行的SQL語句,不需要建立Rescord記錄集行,不需要聲明addnew,不要執(zhí)行update。直接通過conn.Execute(sql)來完成。
當(dāng)然應(yīng)用此種方法,若必填字段接受值為空時,同樣能夠插入記錄。這和采用第一種會報
Microsoft JET Database Engine 錯誤 ’80040e21’
字段 ’xxx.xxx’ 不能是零長度的字符串。 具有很大的容錯性。是程序的可讀性還是方法的簡便高效率就任君選擇了。
ASP編程入門進階(二十一):ADO組件之分頁程序
應(yīng)該來說,學(xué)會了如何插入記錄,如何顯示記錄,那么現(xiàn)在簡單的完整的文章系統(tǒng)、新聞系統(tǒng)和留言系統(tǒng)不成問題。那接著下面的問題就是:隨著信息內(nèi)容的不段增加,單獨通過一張頁面顯示所有信息是不行也是很不理性的。所以,解決的辦法就是采用分頁技術(shù)。
1,rs.RecordCount 很顯然,RecordCount就是用來顯示數(shù)據(jù)庫表中一共多少條記錄的,也可以形象地說表中一共有多少行。經(jīng)常用在分頁中就是一共有N篇文章等總計的信息顯示。
2,rs.PageSize
rs.PageSize也就是一頁的大小,也就表示一張ASP頁可以顯示記錄的條數(shù)。值是自己定義的,比如經(jīng)常看到的每頁顯示N篇文章之類的信息。
3,rs.AbsolutePage 和 rs.pagecount 說到分頁,一定不能不提到 rs.AbsolutePage 。記錄集的AbsolutePage屬性最主要的作用就是決定著當(dāng)前顯示的是第幾頁。它的值是有依據(jù)的,指定了rs.PageSize,那么rs.pagecount的信息值就是rs.RecordCount和rs.PageSize整除結(jié)果。比如:總信息記錄rs.RecordCount共20條,每頁顯示條數(shù)rs.PageSize設(shè)為5條,那么頁數(shù)rs.pagecount數(shù)就是20/5=4頁次,而rs.AbsolutePage則就只能是第1頁,第2頁……第4頁。
說到現(xiàn)在,弄個具體程序來調(diào)試一下。繼續(xù)對showit.asp進行修改如下:
<!--#include file="conn.asp" -->
<% Set rs = Server.CreateObject ("ADODB.Recordset")
sql = "Select * from cnarticle order by cn_id desc"
rs.Open sql,conn,1,1
%> <% page=request.querystring("page") ’page值為接受值
rs.PageSize = 2 ’每頁顯示記錄數(shù)
rs.AbsolutePage = Page ’顯示當(dāng)前頁等于接收的頁數(shù) %> <%
For i = 1 to rs.PageSize ’利用for next 循環(huán)依次讀出當(dāng)前頁的記錄
if rs.EOF then Exit For end if
response.write("<br>文章內(nèi)容是:"& rs("cn_content"))
rs.MoveNext next%> <%
rs.close Set rs = Nothing conn.close set conn=nothing %>
HERE,你調(diào)試的前提就是數(shù)據(jù)庫中的記錄相對要大于4條,這樣測試效果才明顯;還有測試的方法就是在showit.asp后面添加?page=1或者?page=2等調(diào)試觀察網(wǎng)頁顯示效果。
其實,說到底,顯示數(shù)據(jù)庫內(nèi)容就是 <% For i = 1 to rs.PageSize
if rs.EOF then Exit For end if
response.write("<br>文章內(nèi)容是:"& rs("cn_content")) rs.MoveNext next%>
起的作用,但想象一下:該程序應(yīng)該都只能顯示出2條信息(一直不變的2條信息)。但為什么加上?page=1和?page=2會顯示不同的結(jié)果呢?……那絕對就是rs.AbsolutePage的作用了。這個搞清楚,相信分頁的整體架構(gòu)就有點眉目了。
<!--#include file="conn.asp" --> <%
Set rs = Server.CreateObject ("ADODB.Recordset")
sql = "Select * from cnarticle"
rs.Open sql,conn,1,1 %>
<%filepath=request.servervariables("path_info")%>
<% page=request.querystring("page") ’page值為接受值
rs.PageSize = 2 ’每頁顯示記錄數(shù)
if Not IsEmpty(page) then ’如果page已經(jīng)初始化...
if Not IsNumeric(page) then ’判斷page值是否為數(shù)字
page=1 else Page = cint(page) ’接收page并化為數(shù)字型賦給page變量
end if if Page > rs.PageCount then ’如果接收的頁數(shù)大于總頁數(shù)
rs.AbsolutePage = rs.PageCount ’設(shè)置當(dāng)前顯示頁等于最后頁
elseif Page <= 0 then ’如果page小于等于0
rs.AbsolutePage = 1 ’設(shè)置當(dāng)前顯示頁等于第一頁
else rs.AbsolutePage = Page ’如果大于零,顯示當(dāng)前頁等于接收的頁數(shù)
end if else rs.AbsolutePage=1
end if Page = rs.AbsolutePage%> <%
For i = 1 to rs.PageSize ’利用for next 循環(huán)依次讀出當(dāng)前頁的記錄
if rs.EOF then Exit For end if
response.write("文章標(biāo)題是:"& rs("cn_title"))
response.write("<br>文章作者是:"& rs("cn_author"))
response.write("<br>文章加入時間是:"& rs("cn_time"))
response.write("<br>文章內(nèi)容是:"& rs("cn_content"))
response.write("<hr>") rs.MoveNext Next %>
<form action="<%=filepath%>" method="get">
<!--首先保證總頁數(shù)不為1、不為0-->
<%if rs.pagecount<>1 and rs.pagecount<>0 then%>
<!--如果當(dāng)前頁數(shù)大于1,無論何時都應(yīng)顯示首頁和上一頁的連接-->
<%if page>1 then%> [<a Href="<%=filepath%>?Page=<% = 1%>">首頁</a>]
[<a Href="<%=filepath%>?Page=<% = page -1 %>">上一頁</a>]
<!--如果當(dāng)前頁數(shù)大于1并且小于總頁面數(shù)時,顯示出尾頁和下一頁的連接-->
<%if page<rs.pagecount then %>
[<a Href="<%=filepath%>?Page=<% = page + 1%>">下一頁</a>]
[<a Href="<%=filepath%>?Page=<% = rs.PageCount%>">尾頁</a>]
<!--如果當(dāng)前頁數(shù)大于1并且仍大于或等于總頁面數(shù)時,不顯示出尾頁和下一頁的連接--> <%else%> [下一頁] [尾頁]
<%end if%> <!--否則,當(dāng)前頁數(shù)不大于1,則只顯示尾頁和下一頁的連接-->
<%else%> [首頁] [上一頁]
[<a Href="<%=filepath%>?Page=<% = page + 1%>">下一頁</a>]
[<a Href="<%=filepath%>?Page=<% = rs.PageCount%>">尾頁</a>]
<%end if %> <!--最終,總頁數(shù)若為1、為0則沒有任何連接-->
<%else%> [首頁] [上一頁] [下一頁] [尾頁]
<%end if%> [頁次:<font clor=red><b><%=page%></b></font>/<%=rs.PageCount%>]
[共<%=rs.RecordCount%>篇 <font color=red><b><%=rs.PageSize%></b></font>篇/頁]
轉(zhuǎn)到<input name="page" size=5 value="<%=page%>">頁
<input type="submit" value="Enter">
</form> <% rs.close Set rs = Nothing conn.close set conn=Nothing %>
長長的分頁代碼,搞懂是真不易,平臺引用起來還需要修改也是比較麻煩。能做成一個函數(shù),下次調(diào)用起來就很方便了。
<% function pagination(pagecount,pagesize,page,resultcount)
Dim query, a, x, temp
action = "http://" & Request.ServerVariables("HTTP_HOST") & Request.ServerVariables("SCRIPT_NAME")
query = Split(Request.ServerVariables("QUERY_STRING"), "&")
For Each x In query a = Split(x, "=")
If StrComp(a(0), "page", vbTextCompare) <> 0 Then
temp = temp & a(0) & "=" & a(1) & "&"
End If Next
Response.Write("<form method=get onsubmit=""document.location = ’" & action & "?" & temp & "Page=’+this.page.value;return false;"">")
if page<=1 then Response.Write ("[首頁] [上一頁] ")
else Response.Write("[<a href=" & action & "?" & temp & "Page=1>首頁</a>] ")
Response.Write("[<a href=" & action & "?" & temp & "Page=" & (Page-1) & ">上一頁</a>] ")
end if if page>=pagecount then
Response.Write ("[下一頁] [尾頁]")
else &nbs, p; Response.Write("[<a href=" & action & "?" & temp & "Page=" & (Page+1) & ">下一頁</a>] ")
Response.Write("[<a href=" & action & "?" & temp & "Page=" & pagecount & ">尾頁</a>]")
end if Response.Write("[頁次:<font color=red>" & page & "</font>/" & pageCount)
Response.Write("] [共" & resultcount & "條 <font color=red>"& pagesize & "</font>條/頁]")
Response.Write(" 轉(zhuǎn)到" & "<input name=page size=4 value=" & page & ">" & "頁<input type=submit value=go>") End function %>
如要引用,則可以:<%call pagination(rs.PageCount,rs.pagesize,page,rs.RecordCount) %>
(完) |