第2章A S P的内嵌对象
本章要点:理解A S P的内嵌对象并会使用它们。
通过上面的介绍,我们对A S P已经有了一个基本的了解,如果你想编写A S P应用程序首先应
该掌握一种脚本语言,如V B S c r i p t,并且熟练掌握A S P的各种内嵌对象和A c t i v e X组件。这些对
象以及组件都可以用来拓展A S P应用程序的功能,实际上,只要掌握了内嵌对象和A c t i v e X组件,
你就可以编写功能强大的A S P应用程序。
一个对象是典型的具有方法、属性或者集合的东西,其中对象的方法决定了我们可以用这
个对象做什么事情。对象的属性可以读取,它描述对象状态或者设置对象状态。对象的集合包
含了很多和对象有关系的键和值的配对。
举一个日常的例子,本书是一个对象,这个对象包含的方法决定了你可以怎样处理它(即
使用它),比如说,去读它,把它送人作为礼物,用它当作敲门的工具,只要你愿意,甚至可以
把它撕得粉碎。对象的属性即这本书的页数,作者是谁。对象的集合包含了许多键和值的配对,
对书而言,每一页的页码就是键,那么值就是对应于页码的这页的内容。
A S P的内嵌对象和A c t i v e X组件十分类似,不过,当你使用A S P时,两者之间还是存在着明
显的差异。首先,一个组件可能包含不只一个对象,其次,在你使用组件之前,将要明确地创
建一个实例。
下面是对每一种内嵌对象的快速浏览:
• A p p l i c a t i o n对象:A p p l i c a t i o n对象用来存储一个应用中所有用户共享的信息。例如,可以
利用A p p l i c a t i o n对象在站点的不同用户间传递信息。
• R e q u e s t对象: R e q u e s t对象可以用来访问所有从浏览器到服务器间的信息,因此,可以利
用R e q u e s t对象来接受用户在H T M L页的窗体中的信息。
• R e s p o n s e对象:R e s p o n s e对象用来将信息发送回浏览器。可以利用R e s p o n s e对象将脚本语
言结果输出到浏览器上。
• S e r v e r对象:S e r v e r对象提供你运用许多服务器端的应用函数。例如,你可以利用S e r v e r对
象来控制脚本语言在超过时限前的运行时间。也可以利用S e r v e r对象来创建其他对象的实
例。
• S e s s i o n对象: S e s s i o n对象用来存储一些普通用户在滞留期间的信息,可以用S e s s i o n对象
来存储一个用户在访问你的站点时滞留时间。
• O b j e c t C o n t e x t对象: O b j e c t C o n t e x t对象可以用来控制A S P的执行。这种执行过程由
Microsoft Transaction Server(MTS)来进行管理。
内嵌对象不同于正常的对象。在利用内嵌对象的脚本时,不需要首先创建一个它的实例。
在整个网站应用中内嵌对象的所有方法、集合以及属性都是自动可访问的。
2.1 Response和Request 对象
Response 对象可以输出信息到客户端。包括直接发送信息给浏览器、重定向浏览器到另一
个URL 或设置cookie 的值。下面例子演示了该对象的使用方法:
< h t m l >
Buffer Example< b o d y >
< %
FOR i=1 to 500
R e s p o n s e . W r i t e ( i & " < B R > " )
N E X T
% >
< / b o d y >
< / h t m l >
在A S P中引用对象的方法的语法是“对象名.方法名”,如上面脚本中用的R e s p o n s e . Wr i t e ( i &
“< B R >”)语句,其含义为引用R e s p o n s e对象的Wr i t e方法在屏幕上显示从1 ~ 5 0 0,每一句命令执
行后结果都立即显示,你可以实时地看到执行结果。
R e s p o n s e对象的Wr i t e方法将指定的字符串或表达式的结果写到当前的HTTP 输出。
方法就是嵌入到对象定义中的程序代码,它定义对象怎样去处理信息。使用嵌入的方法,
对象便知道如何去执行任务而不用提供额外的指令。
在某些场合下,你也可以利用缓冲区来延缓执行过程,当你利用缓冲区时,直到整个A S P执
行结束才会将结果输出到浏览器上。下面是利用R e s p o n s e对象的B u ff e r属性修改后的例子:
<% Response.Buffer=True %>
< H T M L >
Buffer Example< b o d y >
< %
FOR i=1 to 500
R e s p o n s e . W r i t e ( i & " < B R > " )
N E X T
% >
< / b o d y >
< / h t m l >
在A S P中设置对象属性的值的方法是“对象名.属性名=”,如上面脚本中的第一行用< %
R e s p o n s e . B u ff e r = True %>语句将R e s p o n s e对象的B u ff e r的属性设为Tr u e。这也是和前面那个脚本
仅有的一个区别。那么这页执行的时候,这个主页的所有内容会同时显示在浏览器上,这个主
页会存在缓存区中直到脚本执行结束。
任何对B u ff e r属性进行修改的语句都必须在< H T M L>语句和A S P脚本输出语句的前面,如果
在<H T M L>语句或者脚本输出后面修改B u ff e r属性,那么你的程序就会出错。
利用缓存程序可以根据某种条件来显示不同的主页,下面是随机显示的一个例子。
<% Response.Buffer=True %>
10使用ASP与SQL Server 网站架设
下载
< H T M L >
< H E A D > < T i t l e >第一页< / t i t l e > < / h e a d >
< B o d y >
这是第一页。
< / b o d y >
< / h t m l >
<%
R a n d o m i z e
注释:初始化随机数生成器。
IF Int(2*rnd)=1 THEN Response.End
R e s p o n s e . C l e a r
% >
< H T M L >
< H E A D > < T I T L E >第二页< / t i t l e > < / h e a d >
< b o d y >
这是第二页。
< / b o d y >
< / h t m l >
在这个例子中,使用了R e s p o n s e对象的两个新的方法: E n d方法和C l e a r方法。E n d方法会立
即停止A S P的执行和相应结果。你在执行E n d方法时不需要考虑是否进行了缓存输出。在这个例
子中,E n d方法被用来防止在显示第一页时第二页也显示出来。
C l e a r方法是用来在不将缓存中的内容输出的前提下清空当前页的缓存,仅当使用了缓存输
出的时候你才可以利用C l e a r方法,在这里面, C l e a r方法是用来防止显示第二个页面时第一个页
面也显示出来。它把第一个页面从B缓存中清空了。
R e s p o n s e对象中在缓存输出中还用到了另一个方法是F l u s h,该方法可以将缓存中的内容立
即显示出来。该方法有一点和C l e a r方法一样,它在脚本前面没有将B u ff e r属性设置为Tr u e时会出
错。和E n d方法不同的是,该方法调用后,该A S P可继续执行。
一般情况下,你并不需要缓存输出一个A S P,在大的H T M L主页或者运行较长的脚本中利用
缓存时,用户的浏览器可能长时间没有反应,这通常会使得用户感到迷惑。
如果希望根据条件显示不同主页内容,完全可以简单地利用V B脚本来做判断,例如,下面
这个例子实现了上面例子的同样功能但没有使用缓存。
< %
R a n d o m i z e
'初始化随机数生成器。
IF INT(2*RND)=1 THEN
% >
< H T M L >
< H E A D > < T I T L E >第一页< / T I T L E > < / H E A D >
< B O D Y >
这是第一页
< / B O D Y >
< / H T M L >
<% ELSE %>
< H T M L >
第2章A S P的内嵌对象使用11
下载
< H E A D > < T I T L E >第二页< / T I T L E > < / H E A D >
< B O D Y >
这是第二页
< / b o d y >
< / h t m l >
<% END IF %>
只有一种场合下使用缓存是必须的,那就是在主页内容已经确定后,你却需要改变主页的
H e a d e r。这时除了将B u ff e r属性设为Tr u e外别无选择。
浏览器的请求和服务端的响应都包含头信息,头信息提供了有关请求和响应的附加信息,
也包括了浏览器生成请求和服务端提供响应的过程信息。
A S P包含了相当多的集合和方法来维护H e a d e r s。一部分方法对应于特定的任务,例如提供
了站点内容分级以及站点限期时间等功能;其他的方法和集合用于一般的H e a d e r s维护。以下部
分详细介绍如何使用这些集合方法来影响H e a d e r s。
当浏览器在服务端接收到一个主页时,这个请求就包括了相当数量的H e a d e r s,你可以利用
R e q u e s t对象的S e r v e r Va r i a b l e集合来接收这些H e a d e r s,S e r v e r Va r i a b l e集合既包括了H e a d e r s也包
括了服务端的一些其他信息。
集合存储了相互有关系的字符串、数字、对象和其他值。集合与数组非常相近,但它在存
储或取出项目时会自动扩展与搜索。另外,集合被修改后,项目的位置将会移动。可以通过集
合中项目的名称、索引访问项目,也可以遍历访问项目。
下面的例子将S e r v e r Va r i a b l e集合的所有内容名称显示出来。
< H T M L >
< H E A D > < T i t l e >服务端变量< / T i t l e > < / H E A D >
< B O D Y >
<%
FOR Each name IN Request.ServerVariables
R e s p o n s e . W r i t e ( " < p > < b > " & n a m e & " < / b > : " )
Response.Write(Request.ServerVariables (name))
N E X T
% >
< / B O D Y >
< / H T M L >
显示结果为:
A L L H T T P : H T T P A C C E P T i m a g e / g i f , i m a g e / x -
x b i t m a p , i m a g e / j p e g , i m a g e / p j p e g , * / * H T T P A C C E P T L A N G U A G E : e n
H T T P C O N N E C T I O N : K e e p A l i v e
H T T P H O S T : p l a t o H T T P U S E R A G E N T : M o z i l l a / 4 . 0 1 [ e n ] ( W i n N T ; I ) H T T P C O O K I E : U S E R I D
= H T T P A C C E P T C H A R S E T i s o - 8 8 5 9 - 1 * , u t f - 8
ALL_RAW:Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,*/* Accept-
Language: en
Connection: Keep-alive Host:plato User-Agent:Mozilla/4.01[en](WinNT;I)
C o o k i e : U S E R I D = A c c e p t - C h a r s e t : i s o - 8 8 5 9 - 1 , * . u t f - 8
A P P L M D P A T H : / L M / W 3 S V C / 1 / R O O T / t e s t /
A P P L P H Y S I C A L P A T H : / D : \ I n e t p u b \ w w w r o o t
12使用ASP与SQL Server 网站架设
下载
A U T H P A S S W O R D :
A U T H T Y P E :
A U T H U S E R :
C E R T C O O K I E :
C E R T F L A G S :
C E R T I S S U E R :
C E R T K E Y S I Z E :
C E R T S E C R E T K E Y S I Z E :
C E R T S E R I A L N U M B E R :
C E R T I S S U E R :
C E R T S U B J E C T :
. . . (显示结果略)
可以看出, S e r v e r Va r i a b l e s集合包含了很多类型的信息,下面解释常用的信息类型:
A L L H T T P:客户端发送的所有HTTP 头文件。
A L L _ R AW:检索未处理表格中所有的头名称。A L L _ R AW 和ALL_HTTP 不同,
ALL_HTTP 在头文件名前面放置HTTP_ prefix,并且标题名称总是大写的。使用A L L R AW 时,
头名称和值只在客户端发送时才出现。
A P P L M D PAT H:检索ISAPI DLL 的( WAM) Application 的元数据库路径。
A P P L _ P H Y S I C A L _ PAT H : 检索与元数据库路径相应的物理路径。IIS 通过将
A P P L M D PATH 转换为物理(目录)路径以返回值。
A U T H PA S S W O R D:该值输入到客户端的鉴定对话中。只有使用基本鉴定时,该变量才可
用。
A U T H T Y P E:这是用户访问受保护的脚本时,服务器用于检验用户的验证方法。
A U T H U S E R:未被鉴定的用户名。
C E RT C O O K I E:客户端验证的唯一I D,以字符串方式返回。可作为整个客户端验证的签
字。
C E RT F L A G S:如有客户端验证,则bit0 为1。如果客户端验证的验证人无效(不在服务
器承认的CA 列表中),bit1 被设置为1。
C E RT I S S U E R:用户验证中的颁布者字段( O = M S,O U = I A S,CN=user name,C = U S A)。
C E RT K E Y S I Z E:安全套接字层连接关键字的位数,如1 2 8。
C E RT S E C R E T K E Y S I Z E:服务器验证私人关键字的位数。如1 0 2 4。
C E RT S E R I A L N U M B E R:用户验证的序列号字段。
C E RT S E RV E R I S S U E R:服务器验证的颁发者字段。
C E RT S E RV E R S U B J E C T:服务器验证的主字段。
C E RT S U B J E C T:客户端验证的主字段。
C O N T E N T L E N G T H:客户端发出内容的长度。
C O N T E N T _ T Y P E:内容的数据类型。同附加信息的查询一起使用,如HTTP 查询G E T、
POST 和P U T。
G AT E WAY I N T E R FA C E:服务器使用的CGI 规格的修订,格式为C G I / r e v i s i o n。
第2章A S P的内嵌对象使用13
下载
H T T P _ < H e a d e r N a m e >:HeaderName 存储在头文件中的值。未列入该表的头文件必须以
HTTP_ 作为前缀,以使S e r v e r Variables 集合检索其值。
注意,服务器将HeaderName 中的下划线(_)解释为实际头名称中的破折号。例如,如果
指定H T T P M Y H E A D E R,服务器将搜索以MY_HEADER 为名发送的头文件。
H T T P S:如果请求穿过安全通道( S S L),则返回O N。如果请求来自非安全通道,则返回
O F F。
H T T P S K E Y S I Z E:安全套接字层连接关键字的位数,如1 2 8。
H T T P S S E C R E T K E Y S I Z E:服务器验证私人关键字的位数,如1 0 2 4。
H T T P S S E RV E R I S S U E R:服务器验证的颁发者字段。
H T T P S S E RV E R S U B J E C T:服务器验证的主字段。
I N S TA N C E I D:文本格式I I S实例的I D。如果实例ID 为1,则以字符形式出现。使用该变
量可以检索请求所属的(元数据库中) Web 服务器实例的I D。
I N S TA N C E M E TA PAT H:响应请求的IIS 实例的元数据库路径。
L O C A L A D D R:返回接受请求的服务器地址。如果在绑定多个IP 地址的多宿主机器上查
找请求所使用的地址时,这条变量非常重要。
L O G O N U S E R:用户登录Windows NT 的账号。
PAT H I N F O:客户端提供的额外路径信息。可以使用这些虚拟路径和PATH_INFO 服务器
变量访问脚本。如果该信息来自U R L,在到达CGI 脚本前就已经由服务器解码了。
PAT H T R A N S L AT E D:PATH_INFO 转换后的版本,该变量获取路径并进行必要的由虚拟
路径至物理路径的映射。
Q U E RY S T R I N G:查询HTTP 请求中问号(?)后的信息。
R E M O T E A D D R:发出请求的远程主机的IP 地址。
R E M O T E _ H O S T :发出请求的主机名称。如果服务器无此信息,它将设置为空的
MOTE_ADDR 变量。
R E M O T E U S E R:用户发送的未映射的用户名字符串。该名称是用户实际发送的名称,与
服务器上验证过滤器修改过后的名称相对应。
R E Q U E S T M E T H O D:该方法用于提出请求。相当于用于HTTP 的G E T、H E A D、P O S T
等等。
S C R I P T N A M E:执行脚本的虚拟路径。用于自引用的U R L。
S E RV E R N A M E:出现在自引用URL 中的服务器主机名、DNS 化名或IP 地址。
S E RV E R P O RT:发送请求的端口号。
S E RV E R P O RT S E C U R E:包含0 或1 的字符串。如果安全端口处理了请求,则为1,否
则为0。
S E RV E R P R O TO C O L:请求信息协议的名称和修订。格式为protocol/revision 。
S E RV E R _ S O F T WA R E:应答请求并运行网关的服务器软件的名称和版本。格式为
name/version 。
U R L:提供URL 的基本部分。
14使用ASP与SQL Server 网站架设
下载
你可以根据需要利用S e r v e r Va r i a b l e s集合只是去接受特定的头变量,例如下面这个例子,只
有从o r i g i n . a s p进入这个例子,程序才被允许运行:
< H T M L >
< H E A D > < T I T L E >服务端变量< / T I T L E > < / H E A D >
< B O D Y >
< %
W h e r e F o r m = R e q u e s t . S e r v e r V a r i a b l e s ( " H T T P R E F E R E R " )
IF WhereForm="" THEN
% >
欢迎进入A S P教程示例
< %
E L S E
% >
您未被授权访问该页!
< %
END IF
% >
< / B O D Y >
< / H T M L >
在这个例子中,HTTP_REFERER 头变量检查用户连接的来源,只有从h t t p : / / w w w. m y s e r v e r
. c o m / e x a m p l e / o r i g i n . a s p连接过来的才被允许访问,这样进行授权控制就非常容易。
C o o k i e s集合是R e s p o n s e对象和R e q u e s t对象的一项经常用到的集合,什么是c o o k i e呢?实际
上,在HTTP 协议下,c o o k i e仅仅是一个文本文件, c o o k i e是服务器或脚本可以维护用户信息的
一种方式。包含用户的有关信息(如身份识别号码、密码、用户在Web 站点上购物的方式或用
户访问该站点的次数)。无论何时用户连接到服务器, Web 站点都可以访问cookie 信息。
R e s p o n s e对象的C o o k i e s集合用于创建与修改c o o k i e的值,如果指定的c o o k i e不存在,则创建
它,如果存在,则修改它。
语法:
Response.Cookies(cookie)[(key)|.attribute] = value
参数:
cookies 指定c o o k i e的名称
key 为可选参数。如果指定了k e y,则cookie 就是一个字典,而key 将被设置为v a l u e。
value 指定分配给key 或attribute 的值。
a t t r i b u t e指定cookie 自身的有关信息。attribute 参数可以是下列之一:
名称说明
D o m a i n 若被指定,则cookie 将被发送到对该域的请求中去
E x p i r e s cookie 的过期日期。为了在会话结束后将cookie 存储在客户端磁盘上,必须设置该日期。若此项
属性的设置未超过当前日期,则在任务结束后cookie 将到期
H a s K e y s 指定cookie 是否包含关键字
P a t h 若被指定,则cookie 将只发送到对该路径的请求中。如果未设置该属性,则使用应用程序的路径
S e c u r e 指定cookie 是否安全
第2章A S P的内嵌对象使用15
下载
现在,我们就可以用R e s p o n s e对象设置c o o k i e了。
创建一个带有关键字的c o o k i e,如下列脚本所示:
<%
Response.Cookies("mycookie")("type1") = "First"
Response.Cookies("mycookie")("type2") = "Secondly"
%>
则此头文件将被发送出去,如下所示:
S e t - C o o k i e : M Y C O O K I E = T Y P E 1 = s u g a r & T Y P E 2 = g i n g e r + s n a p
在用户机器的C o o k i e s目录下建立的文本文件如下:
m y C o o k i e
t y p e 1 = F i r s t & t y p e 2 = S e c o n d l y
如果在指定myCookie 时不指定关键字,将破坏type1 和t y p e 2。如下面示例所示:
<% Response.Cookies("myCookie") = "Third" %>
在前面的示例中,关键字type1 和type2 被破坏且其值也被删除。myCookie 只有Third 的
值。
在用户机器的C o o k i e s目录下建立的文本文件如下:
m y c o o k i e
T h i r d
而R e q u e s t对象的C o o k i e s集合读取c o o k i e的值。
语法:
Request.Cookies(cookie)[(key)|.attribute]
参数:
cookie 指定要检索其值的c o o k i e。
key 为可选参数,用于从cookie 字典中检索子关键字的值。
attribute 指定cookie 自身的有关信息。
可以通过包含一个key 值来访问cookie 字典的子关键字。如果访问cookie 字典时未指定
k e y,则所有关键字都会作为单个查询字符串返回。例如,如果MyCookie 有两个关键字, First 和
S e c o n d,而在调用R e q u e s t . C o o k i e s时并未指定其中任何一个关键字,那么将返回下列字符串:
F i r s t = f i r s t k e y v a l u e & S e c o n d = s e c o n d k e y v a l u e
如果客户端浏览器发送了两个同名的c o o k i e,那么Request.Cookie 将返回其中路径结构较
深的一个。例如,如果有两个同名的c o o k i e,但其中一个的路径属性为/www/ 而另一个为
/ w w w / h o m e /,客户端浏览器同时将两个cookie 都发送到/www/home/ 目录中,那么
Request.Cookie 将只返回第二个c o o k i e。
要确定某个cookie 是不是cookie 字典(cookie 有否有关键字),可使用下列脚本:
<%= Request.Cookies("myCookie").HasKeys %>
如果myCookie 是一个cookie 字典,则前面的赋值为T R U E。否则,为FA L S E。
可以通过循环遍历Cookies 集合中的所有cookie 或cookie 中的所有关键字。但是,通过关
16使用ASP与SQL Server 网站架设
下载
键字在没有关键字的cookie 上遍历将不产生任何输出。使用HasKeys 语法先检查一下cookie 是
否有关键字,可以避免这种情况的发生。
R e q u e s t . C o o k i e s语句必须写在ASP 文件中的第一个< HTML> 标记前,这是因为cookie 是
作为HTTP 传输的头信息的一部分发送给客户的,如果当HTTP 头信息已经传输给客户后再使
用R e s p o n s e . C o o k i e s,将出现以下错误:“HTTP 头信息已经写入到客户浏览器。任何HTTP 头
信息的修改必须在写在页内容之前。”
下面的例子说明如何设置与读取c o o k i e (见图2 - 1与图2 - 2 )。
<%@ LANGUAGE=VBScript %>
< %
U s e r n a m e = R e q u e s t . C o o k i e s ("U s e r I n f o")
IF Username=" " T H E N
Username = Request.Form("U s e r n a m e")
R e s p o n s e . C o o k i e s ("U s e r I n f o") = Username
R e s p o n s e . C o o k i e s ("U s e r I n f o").Expires = "Dec 1, 2000"
R e s p o n s e . C o o k i e s ("U s e r i n f o").Path = "/"
IF Username <> " " T H E N
R e s p o n s e . Write "欢迎你初次光临"
END IF
E L S E
R e s p o n s e . Write "欢迎你再次光临"
END IF
% >
< h t m l >
< b o d y >
< / p >
< / p >
< / p >