當你用 ASP 編寫伺服器端應用程式時,必須依靠 ActiveX 組件來強大 Web 應用程式的功能,譬如:你需要串連資料庫,對資料庫進行線上操作等等。
上兩篇中作者給大家介紹了 AD Rotator、 Database Access 等組件的使用方法,今天我們接著來看看其它的一些 ASP 常用組件。
一、 Browser Capabilities 組件眾所周知,並不是所有瀏覽器都支援現今 Internet 技術的方方面面。有一些特性,某些瀏覽器支援而另一些瀏覽器卻不支援,如 : ActiveX 控制項、影像流、動態超文字標記語言、 Flash 以及指令碼程式等。使用 ASP 的 Browser Capabilities 組件,就能夠設計“智能”的 Web 頁,以適合瀏覽器效能的格式呈現內容。 Browser Capabilities 組件能夠建立一個 BrowserType 對象,該對象提供帶有用戶端網路瀏覽器的功能說明的使用者指令碼。該組件之所以能識別客戶瀏覽器的版本等資訊,主要是因為當客戶瀏覽器向伺服器發送頁面請求時,會自動發送一個 User Agent HTTP 標題,該標題是一個聲明瀏覽器及其版本的 ASCII 字串。 Browser Capabilities 組件將 User Agent 映射到在檔案 Browscap.ini 中所註明的瀏覽器 , 並通過 BrowserType 對象的屬性來識別客戶瀏覽器。若該對象在 browscap.ini 檔案中找不到與該標題匹配的項,那麼將使用預設的瀏覽器屬性。若該對象既未找到匹配項且 browscap.ini 檔案中也未指定預設的瀏覽器設定,則它將每個屬性都設為字串 "UNKNOWN"。在預設情況下, browscap.ini 檔案被存放在 WINDOWS\SYSTEM\INERSRV( 如果是 95/98+PWS4) 或 NT\SYSTEM32\INERSRV( 如果是 NT) 目錄中,你可以自己編輯這個文字檔,以添加自己的屬性或者根據最新發行的瀏覽器版本的更新檔案來修改該檔案。請看以下 checkCookie() 過程,使用 BrowserCap 對象的 Cookie 屬性來判斷用戶端瀏覽器是否支援 Cookie,並返回資訊 :
< %
Sub checkCookie()
Set BrowserCap=Server.CreateObject("MSWC.BrowserType")
if BrowserCap.Cookie=True then
response.write "你的瀏覽器支援 Cookie!"
else
response.write "對不起,你所使用的瀏覽器不支援 Cookie!"
end if
end Sub
%>
有關 Browser Capabilities 組件的詳細資料,請參見動態網站設計十八般武藝 --ASP 篇 (2)。
二、 File Access 組件如果你的網齡足夠大的話,你一定見過“恐龍時代”的 CGI 留言簿,那是 WEB 留言簿最早的雛形。那時候在基於 Internet 的 WEB 應用程式中串連伺服器後端資料庫還十分困難,因此留言簿中的曆史資訊並不是同如今一樣儲存在後端資料庫中。那麼這些資料究竟是儲存在哪裡的呢?答案就是“文字檔”, CGI 程式可以將從用戶端接收的資訊寫進一個存放在伺服器端的文字檔中,該檔案可以是 HTML 檔案或 TXT 等檔案,這樣就使得程式員們可以不通過同資料庫連接就可以將客戶資訊儲存下來,但是寫此類 CGI 程式甚是煩瑣,下面列出了一個此類程式的最簡單的樣本 :
#!/usr/local/bin/perl
# Perl Location one your server
print "Content-type: text/plain\n\n";
if($ENV{'REQUEST_METHOD'}eq"POST"){
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
}elsif($ENV{'REQUEST_METHOD'}eq"GET"){
$buffer=$ENV{'QUERY_STIRNG'};
}
@pairs=split(/&/,$buffer);
foreach $pair(@pairs){
($name,$value)=split(/=/,$pair);
$value=~tr/+//;
$value=~s/%([a-f A-F 0-9][a-f A-f 0-9])/pack("C",hex($1))/eg;
$FORM{$name}=$value;}
$file_name="guestbook.txt";#File name
#具體內容
open(FILE,">>$file_name")||die "開啟檔案錯誤";
print FILE "記錄時間":$date \n\n";
print FILE "姓名":$FORM{'name'}";
print FILE "單位":$FORM{'company'}\n";
print FILE "電話":$FORM{'phone'}
print FILE "地址":$FORM{'address'}\n";
print FILE "郵編":$FORM{'zip'}
print FILE "郵件地址":$FORM{'email'}\n";
print FILE "返回意見":$FORM{'content'}
close (FILE)
大家可以感覺到,與 ASP 相比此類 CGI 程式的可讀性和易操作性都較差。那麼你一定想問 ASP 是否也能直接在伺服器上寫檔案呢?答案當然是肯定的。但是聰明的朋友可能會想到,既然 ASP 同 WEB 資料庫的串連如此便捷,我們又何需再將客戶資訊寫在文字檔中呢, ASP 的這個功能豈不是畫蛇添足?的確,對於那些我們常見的留言簿、 BBS 等 WEB 應用程式而言,無論是在程式的執行效率還是易用性上,我們都不可能再用寫文字檔來替代資料庫,但是在某些 WEB 應用領域裡寫文字檔既是一種規範也是一種相對資料庫而較便捷的方法。如果你對 NT 較熟悉的話,你一定知道 NT 具有非常強大的安全機制,它可以將幾乎所有的伺服器操作和串連的資訊自動儲存在一個尾碼名為 .log 的檔案中,其實這種技術也完全可以被運用在 WEB 上,用來記錄一些的客戶登陸資訊。下面的這段程式正是利用 ASP 讀寫文字檔的特性,在一個 WEB BBS 程式中建立自動記錄每個使用者發言記錄的功能。
< %
Set fs = CreateObject("Scripting.FileSystemObject")
ForReading = 1
'以唯讀模式開啟檔案。不能對此檔案進行寫操作。
ForAppending = 8
'開啟檔案並在檔案末尾進行寫操作。
TristateUseDefault = -2
TristateTrue = -1
TristateFalse = 0
'-----------寫入系統log開始--------
servermap=server.MapPath("\bbs\log\")
'映射系統實體路徑
temp=servermap&"\"&year(date)&month(date)&"\"
'擷取系統實體路徑和時間,並以此作為log檔案存放的實體路徑
if Not fs.FolderExists(temp) then
fs.CreateFolder(temp)
end if
'檢測是否存在檔案夾,否則自動建立
dim syslog
dim tempname
tempname=date
syslog=temp&tempname&".log"
'檔案名稱為e:\bbs\log\月份\月日.log
li=user&"&"&Now&"&"&Request.ServerVariables("REMOTE_ADDR")&"&"&tempfile&"&"&letter&"&"&title
'log檔案記錄的格式為:使用者名稱&發信時間&使用者ip&檔案路徑&信區&信件標題
if fs.FileExists(syslog) then
Set ss = fs.OpenTextFile(syslog,ForAppending,true)
else
set ss = fs.CreateTextFile(syslog,ForWriting,false)
end if
'檢測log檔案是否存在,如果存在則追加檔案內容,反之則直接寫檔案
ss.WriteLine(li)
ss.Close
'-----------log檔案寫入結束---------
%>
如果你沒有完全看懂上面的這段程式,就請聽作者慢慢道來。 File Access 組件提供了可用來訪問電腦檔案系統的方法和屬性。我們可以使用 File Access 組件建立 FileSystemObject 對象,以上程式的第一句就是利用 File Access 組件建立了一個名為 fs 的對象執行個體。在對象被建立後,你可以通過它訪問檔案,該對象沒有屬性,它唯一的意義就是建立、開啟或讀寫文字檔。 FileSystemObject 對象有兩種最常用的方法,一種用來建立檔案,另一種是用來開啟並讀寫文字檔。 CreateTextFile 方法獲得你指定的檔案名稱並建立該檔案,它返回一個 TextStream 對象,你可以用該對象在檔案被建立後操作該檔案, CreateTextFile 方法的文法如下 :
Set objTextStream=FileSystemObject.CreateTextFile(Filename,[Overwrite],[Unicode])
下面作者給大家解釋一下 CreateTextFile 方法的參數
1、 Filename 包含檔案路徑名的字串,可以是檔案的全路徑名,包括磁碟機名和目錄名,或者也可以只是檔案名稱,如果只包含檔案名稱的話,檔案將被建立在網站的根目錄下。
2、 Overwrite 布爾量,設定成 False 時可以防止 FileSystemObject 對象在建立一個新檔案時刪除已存在的檔案,該參數是可選的,如果沒有賦值系統預設為 true,具有相同檔案名稱的已有檔案會被刪掉。
3、 Unicode 選擇性參數。布爾值指明是否以 Unicode 或 ASCII 檔案格式建立檔案。如果以 Unicode 檔案格式建立檔案,則該值為 True;如果以 ASCII 檔案格式建立檔案,則該值為 False。如果省略此部分,則假定建立 ASCII 檔案。
在前面的程式中我們用 set ss=fs.CreateTextFile(syslog,ForWriting,false) 來在 log 檔案不存在的情況下建立檔案並對檔案進行寫操作,這裡的“ForWriting”表示寫檔案。
與 CreateTextFile 方法不同, OpenTextFile 方法用來獲得你指定的檔案名稱並開啟該檔案,利用它所帶的參數我們可以對檔案進行各種不同的操作,和 CreateTextFile 方法一樣, OpenTextFile 方法返回一個 TextStream 對象,使得你可以在檔案被開啟後操作該檔案。 OpenTextFile 方法的文法如下 :
Set objTextStream=FileSystemObject.OpenTextFile(Filename,[IOmode],[Create],[Format])
參數說明如下 :
1、 Filename 必須的變數,同 CreateTextFile 的 filename
2、 IOmode 可選的常量,取值為下列兩個常數之一 ForReading 或 ForAppending,如果 mode 為 1,檔案以唯讀方式開啟,如果為 8,則檔案以追加的方式開啟。
3、 Create 可選的布爾量,指定如果你想開啟的檔案不存在是做什麼操作,如果其值為 True,當檔案不存在時就自動建立一個空的檔案。如果為 False,就會在檔案沒找到時產生一個出錯資訊,其預設值是 False,建議將其設為 True,以避免在開啟檔案時檢查是否出錯。
4、 Format 可選值,可以選擇三種 Tristate 值分別指定檔案的格式, -2、 -1、和 0 分別對應於系統預設、 unicode 和 ASCII。
在開啟或建立了文字檔後,就得到一個 TextStream 對象,該對象有一個游標,就好象是在文書處理程式中的游標一樣,指出接下來要敲入的字元將出現的位置,它同時也指出你要讀取的字元的位置。不能通過 CreatObject 來建立一個 TextStream 對象,得到 TextStream 對象的唯一方法是如前所述的用 FileSystemObject 對象開啟一個存在的文字檔或者建立一個新的檔案。
下面列出了 TextStream 對象的屬性和方法
TextStream.AtEndOfLine 唯讀布爾量,當游標在當前行的末尾時,其值為 true,反之則為 false
TextStream.AtEndOfStream 唯讀布爾量,如果游標在流的末尾時,其值為 true,否則為 alse
TextStream.Column 唯讀整數,統計從行首到當前游標位置之間的字元數
TextStream.Line 唯讀整數,指明游標所在行在整個檔案中的行號
TextStream.close() 關閉流以及對應的文字檔
TextStream.read(Num) 指定從游標的當前位置開始從文字檔中讀取一定數目的字元
TextStream.readall() 將整個流讀入一個字串中
TextStream.readline() 將一整行的字元讀入一個字串中
TextStream.write(text) 將一個字串寫入流中
TextStream.writeline() 將一個文本串寫入流中
TextStream.skip(Num) 在流中,將游標的位置移動一定數目的字串長度
TextStream.skiplines() 在流中,將游標移動一定數目的行數
TextStream.writeblank 將一定數目的空行寫入流中
lines(num)
相信大家現在已經可以感覺到 ASP File Access 組件的強大功能了,其實它遠不僅僅可以寫一些 log 檔案,通過它你甚至可以毫不費力的遠程自動更新你的網站,你只要把固定格式的文字檔傳送到遠端的伺服器上,通過 File Access 組件讀取檔案,並自動產生全新 HTML 頁面即可,而不必再辛辛苦苦地一個一個地更新 HTML 檔案。如果你有興趣,你完全可以用 ASP 的 File Access 組件寫一個自己的全自動 HTML 產生器,充分享受維護網站的超前輕鬆感。