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