5常用对象与组件
在本章开始讨论理论性的知识,不过这些理论性的知识又非得说明
不可,在接下来的实作章节我们都会再把相关的理论提出来解释,
如果我们想马上应用本教材范例的话,先跳过本章也没问题,遇到
问题再回过头来找答案就行了。但是最好还是讨论一下,有个初步
的影响。
5-1 Application 记录对象
▲ Application 对象是用来管理整个应用程序,可提供给客户端用
户共享信息,在实务上会被用来追踪目前使用中的人数及针对特定
用户显示特定数据。
▲利用 Application 对象来记录变量内容,则网页结束执行时其
变量内容仍可保留,也就是说 Application 对象是一个, 静态,
变量,如下所示:( App01.asp):
▲ Application 对象为, 共用信息,,在不同浏览器执行或按重
新整理时,其值是累加的,例如我们重新执行 App01.asp网页,我
们可以清楚地发现,var变量内的值仍然为上一次执行后保留下来
的执行结果,而会产生下图的结果:
▲ Application 对象的生命周期:起始于 PWS/IIS开始运行且有人
开始连接时。终止 PWS/IIS或一定时间内(默认为 20分钟)没人连
接时。与就是说,Application 对象并不是永远存在的!除非我
们将 Application 对象中的数据写录到文件中将其保存起来,在
后续的单元中,我们将会特别介绍文件数据的写录与读取。
▲虽然 Application 对象可以在网页结束后,将其对象内的数据
保留下来,但是,当有两位甚至两位以上的浏览都同时进行网页链
接时,则它们所获得的数据库值将是相同的,进而使我们统计的数
据产生错误;为了避免两位甚至两位以上的浏览者同时进行网页链
接造成 ASP程序执行错误,可以利用 Application 对象的操作方法:
Application,Lock 对象上锁与 Application, Unlock取消对象
上锁,如下所示:( lock,asp)
这样可避免两位浏览者同时浏览网页时,count值加总少加。即程
序执行至,Application,lock” 程序语句后,就把 Application
对象锁上锁,如此一来,Application 对象便不能被其他程序连接
都所调用使用,须等到调用,Application,lock” 的程序连接者
再次调用了,Application,unlock” 取消 Application 对象上锁
后,其它程序连接者才可调用 Application 。
5-2 Session 记录对象
▲ Session对象为记录用户的相关信息,提供用户再次对此网页服
务器要求时作确认,例如用户账号与密码的确认,有 Session对象
的建立,来保留身份认证的结果,则用户不用于每一页网页登录时
都需输入密码作确认。
▲ Session对象与 Application 对象相同,都有是用来记录“变量”
值的,但是 Application 是一对多的; Session对象则是一对一的,
对于所有的连接浏览者而言,他们对于 Application 对象的使用是
“共用”的,但是每个浏览连接者却个别拥有一个“私用”的
Session对象,若将上节 app01.asp例子中的内容 Application改以
Session替代,如下所示:( sess01.asp)
执行结果将会如 App01.asp一样:
虽然在表面上看来,结果是相同的,但是 Session对象现在记录的
变量数据只与目前浏览者有关,与其他的浏览连接者一点关系也没
有,也就是说目前所读取的 Session对象内容是读取目前浏览连接
者“私用”的 Session对象。
▲ Session对象与 Application对象的不同点,Application对象为
共用之信息,而 Session却是个别独立的,比较下两图,不同浏览
器执行 sess01.asp,其值是不累加的,由此可证明 Session对象记
录的变量数据只与目前浏览连接者有关,与其他的浏览连接者一点
关系都没有。
▲ Session对象的生命周期起始于 PWS/IIS浏览器第一次与服务器连
接时。终止于 PWS/IIS浏览器结束执行时或浏览器一段时间没有向
PWS/IIS请求任何网页时。
▲ 当我们利用 Application来作为进站人数的计数器,是利用当有新的浏览连接
者进入时就调用 Application对象,将 Application对象所储存的变量数据值加
一来达到计数的目的。但是,上网者只要按下浏览器上的“重新刷新”按钮后,
你会发现计数器将会再次的自动加一,这似乎不是我们所想要的。单纯的
Application计数器程序代码与执行结果,如下所列:
▲那我们该如何防制连接者按下“重新刷新”按钮使计数器自动加一所产生的错
误呢,我们可以利用具有“私用”特性的 Session 对象来判断浏览连接者是否是
新的连接者,我们可以利用下列判断式先检验一下,如果是新的连接者,则
Session对旬象是没有任何数据的。
如果上面的判断式是成立的(浏览连接者为新连接的,Session 对象内没有任何
的数据),则我们就将 Application对象的记录数据加一,同时将浏览连接者的
Session(“Conn”) 数据值设为,True”,如此一来,当浏览连接者再次按下
“重新刷新”按钮后,因为 If Is Empty(Session(“Conn”))Then 判断式不成
立( Session对象内已有连接记录的数据,则 Application对象的记录数据就不会
再自动加一。使用 Application对象与 Session对象撰写的计数器程序代码与执行
结果,如下所列:
5-3 Cookies记录对象
关于 Cookies记录对象
▲ Application对象与 Cookies对象将信息记录在 Server端,而
Cookies对象会通过浏览器所提供的 Cookies功能,将信息记录在客
户端,也就是说,Cookies对象是储存在浏览器连接者的浏览器之
中。
▲我们可用 Cookies对象的记录来判断某个用户是否曾经进入本网
站。奇怪,虽然 Session对象将信息记录在 Server端,但是它也会
个别启示连接浏览者是否曾经进入本网站啊!但是 Session对象的
生存期限是很短的,当浏览连接者的浏览器在设定时间内(默认为
20分钟)没有向服务器请示任何数据的话,服务器就会将 Session
对象中的数据全数消除,而 Cookies对象是存在于浏览连接者的浏
览器中的,即使浏览者离线了,Cookies对象的数据记录依然存在。
▲ Cookies对象是 Response 对象及 Request对象的属性,用法如下:
Response,cookies入 COOKIES Request,cookies
★ 如何证明 Cookies对象是储存在浏览连接者的浏览器之中?
▲ 撰写一含有 Cookies的网页,如下所示( Cookies01.asp)
执行后会产生却会产生“类型不符合”的错误,如下图:
▲怎会如此呢?原因如下,Application对象及 Session对象其
返回值为 empty而 request,cookies却是返回““(空字符串),
empty可与数值作运算,”“却不可以,解决此一问题可加入一
判断式,如下所示:
▲修改后还是有错误,错误为“已将 HTTP标题写入客户端浏览
器。对任何 HTTP的标题所做的修改必须要在写入页内容之前”。
▲原因为浏览器与服务端交换 Cookies数据的时机需在服务器
尚未下载数据给浏览器之前就进行交换,否则会出现错误,解决
方法为用缓冲区来装下载的数据,完整程序如下所示:
▲现在我们来检验一下:以 IE为例,建立在浏览器中的
Cookies对象将会放置在,\WINDOWS\Temporary Internet Files”
目录中,我们先将目录中的所有数据文件清除干净:
按着启动浏览器,开始浏览 cookies02.asp,此时我们将会发现在
,\WINDOWS\Temporary Internet Files” 目录中多出了 Cookies的
对象文件,这证明了 Cookies对象是存在于浏览连接者的浏览器
(客户端)中无误!
▲ Cookies对象的生命周期起始于浏览器被执行时。终止于浏览器
结束执行时。那如果我们要延长 Cookies对象的生命周期呢?若要
延长 Cookies对象的生命周期我们可另用,Expires” 属性来设置
Cookies的生命周期,Expires表失效,如下所示
经过 expires设置后,your ID的使用期限为 2005/12/31。
5-4 Server信息对象
Server对象允许用户取得服务器提供的各项功能,本单元将介绍
Request对象的 Server Variables方法及 Server对象。
★ Request,Server Variables 方法
▲利用此方法可取得服务器提供的各项功能,其语句如下:
▲环境变量有很多,在此将只介绍较实用的,其他环境变量可参考 PWS/IIS提供
的参考文件。
读取 IP地址的环境变量,LOCAL— ADDR”
读取 Server端的 IP地址,REEMOTE— ADDR” 读取 Client端的 IP地址。
读取附带在网址后面的参数,QUERY— STRING”
亦可以下列方法替代,其结果是相同的。
假设所输入的网址为
http://127.0.0.1/asp/ch01/elemenet.asp?name=kelvin&interest=play
则变量 element=”name=Kelvin&interest=play” 我们可通过 split函数解析
element 变量,如下所示:( element.asp)
★ Server对象
▲ Server,Map Path方法:将网址路径转为真实的文件路径,因为 ASP规定必须
指定文件的真实路径,用法如下:
什么叫做“虚拟路径”?虚拟路径其实就是“网址”,当我们链接至某个网站的
根目录时,我们就会在浏览器的网址输入栏位中输入网站的网址。例如:
http://www.twbts.com/,我就表示我们要链接至该网站的根目录,但是实际对
应到该网站服务器上硬盘根目录却是,\Inetpub\wwwroot”,所以,说穿了“网
址”就是“假”的网站服务器目录,只不过“假”很不好听,因此我们就称之为
“虚拟”!
如果我们所安装的 PWS/IIS网络服务器模拟机制的 WWW根目录(网址
虚拟根目录)为,c:\Inetpub\wwwroot”,我们若使用
Server.MapPath(“/”) 调用语句,则返回的数据值将是
,c:\Inetpub\wwwroot” ;我们若使用 Server.MapPath(“/”) 调
用语句,则返回的数据值将是,c:\Inetpub\wwwroot\test” 。
为何需转换“虚拟路径”为真实的路径呢?因为当我们需要打开文
件或是数据库时,ASP强硬的规定我们必须指定欲打开文件(或数
据库)的“实际路径”之故。
▲对特殊字符进行编码,HTML Encode”
如果我们要在网页中单纯地显示,<b>粗体 </b>” 这些单纯的文字
时,该如何编写我们的 ASP网页呢,如果我们撰写的语句如下图 a所
编写的内容一般,则以浏览器浏览网页时将会获得如图 b的错误答
案:
怎么会这样呢?因为 <b>与 </b>输出至浏览器后都会被解译为 HTML
网页标签了,那怎么办呢,这个时候我们就必须利用 Server.HTML
Encode来进行字符编码,其标准格式为:
Server,HTML Encode(要进行编码的数据 )
以刚刚要被单纯输出的数据为例 Server.HTML Encode(, <b>粗体
</b>” ),经过编码之后所得的答案将是, &It; b&gt;粗体
&It;/b&gt;”,这们一来,当浏览器对网页内容进行解译时,这些
经过编码过的数据浏览器就只会将它们解码回原来的特殊字符而不
会解译为 HTML网页标签了。
执行结果如下图所示:
5-5文件存取组件
5-5-1 File Access对象
File Access组件允许 ASP程序存取网页服务器上的文件,实际上大
部分以文本文件为主,事实上,File Access组件是由 File System
Object对象及 Text Stream对象所组成的。 File System Object对
象负责打开文件或是目录的处理,但若想读取文件内容,则必须配
合 Text Stream对象一起使用。 File Access组件已包含在 IIS4.0中,
因此,不需重新安装此组件就可直接使用。语法如下所示( fs是我
们自定义的一个组件变量名):
Set fs=server,Create Object
(,Scripting.FileSystemObject” )
★ 文件操作的方法
▲ Copy File复制文件,语法如下:
1,source(源文件 ):必须是已存在的文件,否则会产生“找不到
源文件”的错误( err.numer=53)。
2,destination(目的文件 ):文件若已存在,则会被覆盖,若为只
读属性或被锁定的文件,则会产生“没有使用权限”的错误( err,
numer=70)。
3,overwrite(是否覆盖 ):默认值为 true,表示存在的文件将被覆
盖。范例程序代码如下:
▲ Delete File:删除文件,语法如下:
1,Filename(被删除的文件 ):必须为已存在的文件,否则会产生
“找不到源文件”的错误( err.numer=53)。
2,Flag(true or false):默认值为 false,true表可以删除只读属
性设置的文件。若不设为 true,则遇到只读属性文件时将产生“没
有使用权限”的错误( err,numer=70)。范例程序代码如下:
▲ Move File 移动文件或更名,语法如下:
1.Source(源文件):必须是已存在的文件,否则会产生, 找不到
源文件, 的错误( err.numer=53)。
2.Destination (目的文件):必须是不存在的文件,否则会产生
,文件已存在, 的错误 (err.number=58)。
3.若 source 与 destination所在目录相同,则 Move File的功能是
更名,若 source 与 destination所在目录不同,则 Move File的功
能是移动文件。范例程序代码如下:
▲ File Exists检验文件是否存在,语法如下:
文件若存在,则返回值为 true,否则返回 false。
5-5-2 Text Stream 对象
Text Stream 对象为 File System Object对象的子对象,建立的方
法有两种。
★ Open Text File 打开文件
▲ Open Text File所传的参数如下:
▲ Filename(文件名称),IO mode(打开模式):可以有下列三
种设置
▲ Create(是否自动建档):默认为 false,表打开文件
必须是已经存在的文件,若设成 true,则当所要找开的文
件不存在时,File System Object会自动建立新文件。其
中 IO mode与 Create参数可省略。
★ Create Text File 建立新文件
▲ Create Text File所传的参数如下:
Over Write(是否覆写原文件):需建立在文件已存在的
情况下,此参数有效,若设为 true(默认),则原文件会
被覆写,若设为 false,则会出现, 文件已存在, 的错误。
★读取文件的方法
▲ Read Line:从文件中读取一行数据,如下例:
▲ Read(N):从文件中读取 N个字节的数据,如下例:
▲ Read All:读取文件中的所有数据,如下例:
★ 写入文件的方法
▲ Write Line:会在数据后加 vb Cr Lf,才将数据写到文件中。
▲ Write:原原本本将数据写入文件中,如下例:
5-6 网页计数器设计
★ Application 对象计数器与 File Access对象计数器的差异
▲ Application 对象计数器可利用其 Application,Lock对象上锁
与 Application,Unlock取消对象上锁,这两种 Application 对象
的操作方式可避免计数器计次数据非同步更新的错误情形发生。
▲但是 Application 对象的生命周期起始于 PWS/IIS开始动作且有
人开始连接时,终止于 PWS/IIS关闭或一定时间内(默认为 20分钟)
没人连接时。所以 Application 对象并不是永远存在的,这是我们
利用 Application 对象来制作计数器的最大致命伤,试想一下在半
夜的时候上网的人口有多少?万一半夜时超过 20分钟没有人连上我
们的网页,那么我们的计数数据就将被归零而化为过眼云烟了,或
者当我们的服务器关机进行维护时,我们的计数数据同样会被归零
的!
▲ File Access对象计数器是利用文件的存取来记录
计数数据, 也就是说我们的计数器计次数据将会
被储存在一个特定的数据文件中, 计数数据的保
存并不会因时间的改变而消失, 或是因为服务器
进行维护而使计数器计次数据被归零 。
★ 综合 Application对象与 FileAccess对象的优势
为了使我们辛苦累积的浏览人次计数器数据不至
于人间蒸发, 所以我们必须利用 Application 对象
与 File Access对象的优势与特点, 综合运用来设计
我们的计数器:
下面即为综合 Application 对象与 File Access对象来制
作计数器的 ASP计数器程序网页内容:
A,读取计数器数据文件中的计数数据
▲ 当一有新的浏览者链接进入网页开始浏览时就先执行
,Application,Lock” 这行 ASP程序语句, 如此一来, 可
避免两位或两位以上浏览者同时浏览网页时, 计数器的计
数值加总少加 。
▲ 建 立 一 个 名 称 为, counter File” 的 File System
0bject对象, 我们将利用这个对象来建立一个新的文件储
存这个计数次数的变量数据 。
▲ 利用 Server,Map Path将计数器计次数据文件的网址路
径转为真实的文件路径, 使用, readline”方法取得计次
次数数据, 并将取得的计次次数数据放至 Application
(, countnum” ) 变量中 。
▲ 将已取得的计次次数数据加一再回存至, Application
(, countnum” ) 变量中 。
B,将新的计数数据写入到计数器数据文件中
▲ 利用 Server,Map Path将计数器计次数据文件的
网址路径转为真实的文件路径, 以便成为 Create
Text File的参数 。
▲ 使用, writeline” (写入一整行数据到计数器计
次数据文件 )方法将最新的计次次数数据存至计数
器 计 次 数 据 文 件, 其, Application
(, countnum” ), 参数数据为最新的计次次数
结果 。
▲ 调用, Application,Un Lock”这行 ASP程序语句
一取消 Application 对象上锁, 让其他的程序浏览
连接者可以再次调用 Application对象 。
C,将计数结果显示在网页中