<p>其它的ASP常用组件</p>
<p>当你用 ASP 编写服务器端应用程序时,必须依靠 ActiveX 组件来强大 Web 应用程序的功能,譬如:你需要连接数据库,对数据库进行在线操作等等。</p>
<p> 上两篇中作者给大家介绍了 AD Rotator、 Database Access 等组件的使用方法,今天我们接着来看看其它的一些 ASP 常用组件。</p>
<p> 一、 Browser Capabilities 组件众所周知,并不是所有浏览器都支持现今 Internet 技术的方方面面。有一些特性,某些浏览器支持而另一些浏览器却不支持,如 : ActiveX 控件、影像流、动态 HTML、 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,并返回信息 :</p>
<p>< %<br />
Sub checkCookie()<br />
Set BrowserCap=Server.CreateObject("MSWC.BrowserType")<br />
if BrowserCap.Cookie=True then<br />
response.write "你的浏览器支持 Cookie!"<br />
else<br />
response.write "对不起,你所使用的浏览器不支持 Cookie!"<br />
end if<br />
end Sub<br />
%></p>
<p> 有关 Browser Capabilities 组件的详细信息,请参见动态网站设计十八般武艺 --ASP 篇 (2)。</p>
<p> 二、 File Access 组件如果你的网龄足够大的话,你一定见过“恐龙时代”的 CGI 留言簿,那是 WEB 留言簿最早的雏形。那时候在基于 Internet 的 WEB 应用程序中连接服务器后端数据库还十分困难,因此留言簿中的历史信息并不是同如今一样存储在后端数据库中。那么这些数据究竟是保存在哪里的呢?答案就是“文本文件”, CGI 程序可以将从客户端接收的信息写进一个存放在服务器端的文本文件中,该文件可以是 HTML 文件或 TXT 等文件,这样就使得程序员们可以不通过同数据库连接就可以将客户信息保存下来,但是写此类 CGI 程序甚是烦琐,下面列出了一个此类程序的最简单的样本 :</p>
<p>#!/usr/local/bin/perl<br />
# Perl Location one your server<br />
print "Content-type: text/plain\n\n";<br />
if($ENV{'REQUEST_METHOD'}eq"POST"){<br />
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});<br />
}elsif($ENV{'REQUEST_METHOD'}eq"GET"){<br />
$buffer=$ENV{'QUERY_STIRNG'}; <br />
}<br />
@pairs=split(/&/,$buffer);<br />
foreach $pair(@pairs){<br />
($name,$value)=split(/=/,$pair);<br />
$value=~tr/+//;<br />
$value=~s/%([a-f A-F 0-9][a-f A-f 0-9])/pack("C",hex($1))/eg;<br />
$FORM{$name}=$value;}<br />
$file_name="guestbook.txt";#File name<br />
#具体内容<br />
open(FILE,">>$file_name")||die "打开文件错误";<br />
print FILE "记录时间":$date \n\n";<br />
print FILE "姓名":$FORM{'name'}";<br />
print FILE "单位":$FORM{'company'}\n";<br />
print FILE "电话":$FORM{'phone'}<br />
print FILE "地址":$FORM{'address'}\n";<br />
print FILE "邮编":$FORM{'zip'}<br />
print FILE "邮件地址":$FORM{'email'}\n";<br />
print FILE "返回意见":$FORM{'content'}<br />
close (FILE)</p>
<p> 大家可以感觉到,与 ASP 相比此类 CGI 程序的可读性和易操作性都较差。那么你一定想问 ASP 是否也能直接在服务器上写文件呢?答案当然是肯定的。但是聪明的朋友可能会想到,既然 ASP 同 WEB 数据库的连接如此便捷,我们又何需再将客户信息写在文本文件中呢, ASP 的这个功能岂不是画蛇添足?的确,对于那些我们常见的留言簿、 BBS 等 WEB 应用程序而言,无论是在程序的执行效率还是易用性上,我们都不可能再用写文本文件来替代数据库,但是在某些 WEB 应用领域里写文本文件既是一种规范也是一种相对数据库而较便捷的方法。如果你对 NT 较熟悉的话,你一定知道 NT 具有非常强大的安全机制,它可以将几乎所有的服务器操作和连接的信息自动保存在一个后缀名为 .log 的文件中,其实这种技术也完全可以被运用在 WEB 上,用来记录一些的客户登陆信息。下面的这段程序正是利用 ASP 读写文本文件的特性,在一个 WEB BBS 程序中创建自动记录每个用户发言记录的功能。</p>
<p>< %<br />
Set fs = CreateObject("Scripting.FileSystemObject")<br />
ForReading = 1<br />
'以只读模式打开文件。不能对此文件进行写操作。<br />
ForAppending = 8<br />
'打开文件并在文件末尾进行写操作。<br />
TristateUseDefault = -2<br />
TristateTrue = -1<br />
TristateFalse = 0</p>
<p>'-----------写入系统log开始--------<br />
servermap=server.MapPath("\bbs\log\")<br />
'映射系统物理路径<br />
temp=servermap&"\"&year(date)&month(date)&"\"<br />
'获取系统物理路径和时间,并以此作为log文件存放的物理路径<br />
if Not fs.FolderExists(temp) then<br />
fs.CreateFolder(temp)<br />
end if<br />
'检测是否存在文件夹,否则自动创建<br />
dim syslog<br />
dim tempname<br />
tempname=date<br />
syslog=temp&tempname&".log" <br />
'文件名为e:\bbs\log\月份\月日.log<br />
li=user&"&"&Now&"&"&Request.ServerVariables("REMOTE_ADDR")&"&"&tempfile&"&"&letter&"&"&title<br />
'log文件记录的格式为:用户名&发信时间&用户ip&文件路径&信区&信件标题<br />
if fs.FileExists(syslog) then<br />
Set ss = fs.OpenTextFile(syslog,ForAppending,true)<br />
else<br />
set ss = fs.CreateTextFile(syslog,ForWriting,false)<br />
end if<br />
'检测log文件是否存在,如果存在则追加文件内容,反之则直接写文件<br />
ss.WriteLine(li)<br />
ss.Close<br />
'-----------log文件写入结束---------<br />
%></p>
<p> 如果你没有完全看懂上面的这段程序,就请听作者慢慢道来。 File Access 组件提供了可用来访问计算机文件系统的方法和属性。我们可以使用 File Access 组件创建 FileSystemObject 对象,以上程序的第一句就是利用 File Access 组件创建了一个名为 fs 的对象实例。在对象被创建后,你可以通过它访问文件,该对象没有属性,它唯一的意义就是创建、打开或读写文本文件。 FileSystemObject 对象有两种最常用的方法,一种用来创建文件,另一种是用来打开并读写文本文件。 CreateTextFile 方法获得你指定的文件名并创建该文件,它返回一个 TextStream 对象,你可以用该对象在文件被创建后操作该文件, CreateTextFile 方法的语法如下 :<br />
Set objTextStream=FileSystemObject.CreateTextFile(Filename,[Overwrite],[Unicode])</p>
<p> 下面作者给大家解释一下 CreateTextFile 方法的参数</p>
<p> 1、 Filename 包含文件路径名的字符串,可以是文件的全路径名,包括驱动器名和目录名,或者也可以只是文件名,如果只包含文件名的话,文件将被创建在站点的根目录下。</p>
<p> 2、 Overwrite 布尔量,设置成 False 时可以防止 FileSystemObject 对象在创建一个新文件时删除已存在的文件,该参数是可选的,如果没有赋值系统默认为 true,具有相同文件名的已有文件会被删掉。</p>
<p> 3、 Unicode 可选参数。布尔值指明是否以 Unicode 或 ASCII 文件格式创建文件。如果以 Unicode 文件格式创建文件,则该值为 True;如果以 ASCII 文件格式创建文件,则该值为 False。如果省略此部分,则假定创建 ASCII 文件。</p>
<p> 在前面的程序中我们用 set ss=fs.CreateTextFile(syslog,ForWriting,false) 来在 log 文件不存在的情况下创建文件并对文件进行写操作,这里的“ForWriting”表示写文件。</p>
<p> 与 CreateTextFile 方法不同, OpenTextFile 方法用来获得你指定的文件名并打开该文件,利用它所带的参数我们可以对文件进行各种不同的操作,和 CreateTextFile 方法一样, OpenTextFile 方法返回一个 TextStream 对象,使得你可以在文件被打开后操作该文件。 OpenTextFile 方法的语法如下 :<br />
Set objTextStream=FileSystemObject.OpenTextFile(Filename,[IOmode],[Create],[Format])</p>
<p> 参数说明如下 :</p>
<p> 1、 Filename 必须的变量,同 CreateTextFile 的 filename</p>
<p> 2、 IOmode 可选的常量,取值为下列两个常数之一 ForReading 或 ForAppending,如果 mode 为 1,文件以只读方式打开,如果为 8,则文件以追加的方式打开。</p>
<p> 3、 Create 可选的布尔量,指定如果你想打开的文件不存在是做什么操作,如果其值为 True,当文件不存在时就自动创建一个空的文件。如果为 False,就会在文件没找到时产生一个出错信息,其默认值是 False,建议将其设为 True,以避免在打开文件时检查是否出错。<br />
4、 Format 可选值,可以选择三种 Tristate 值分别指定文件的格式, -2、 -1、和 0 分别对应于系统缺省、 unicode 和 ASCII。</p>
<p> 在打开或创建了文本文件后,就得到一个 TextStream 对象,该对象有一个光标,就好象是在字处理程序中的光标一样,指出接下来要敲入的字符将出现的位置,它同时也指出你要读取的字符的位置。不能通过 CreatObject 来创建一个 TextStream 对象,得到 TextStream 对象的唯一方法是如前所述的用 FileSystemObject 对象打开一个存在的文本文件或者创建一个新的文件。<br />
下面列出了 TextStream 对象的属性和方法</p>
<p> TextStream.AtEndOfLine 只读布尔量,当光标在当前行的末尾时,其值为 true,反之则为 false</p>
<p> TextStream.AtEndOfStream 只读布尔量,如果光标在流的末尾时,其值为 true,否则为 false</p>
<p> TextStream.Column 只读的整数,统计从行首到当前光标位置之间的字符数</p>
<p> TextStream.Line 只读的整数,指明光标所在行在整个文件中的行号</p>
<p> TextStream.close() 关闭流以及对应的文本文件</p>
<p> TextStream.read(Num) 指定从光标的当前位置开始从文本文件中读取一定数目的字符</p>
<p> TextStream.readall() 将整个流读入一个字符串中</p>
<p> TextStream.readline() 将一整行的字符读入一个字符串中</p>
<p> TextStream.write(text) 将一个字符串写入流中</p>
<p> TextStream.writeline() 将一个文本串写入流中</p>
<p> TextStream.skip(Num) 在流中,将光标的位置移动一定数目的字符串长度</p>
<p> TextStream.skiplines() 在流中,将光标移动一定数目的行数</p>
<p> TextStream.writeblank 将一定数目的空行写入流中</p>
<p> lines(num)</p>
<p> 相信大家现在已经可以感觉到 ASP File Access 组件的强大功能了,其实它远不仅仅可以写一些 log 文件,通过它你甚至可以毫不费力的远程自动更新你的网站,你只要把固定格式的文本文件传送到远端的服务器上,通过 File Access 组件读取文件,并自动生成全新 HTML 页面即可,而不必再辛辛苦苦地一个一个地更新 HTML 文件。如果你有兴趣,你完全可以用 ASP 的 File Access 组件写一个自己的全自动 HTML 生成器,充分享受维护网站的超前轻松感。</p>