Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9910447
  • 博文数量: 299
  • 博客积分: 9955
  • 博客等级: 中将
  • 技术积分: 4177
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-27 20:59
文章分类
文章存档

2015年(1)

2012年(2)

2011年(9)

2010年(47)

2009年(108)

2008年(132)

我的朋友

分类: 系统运维

2009-10-02 10:58:21

第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 >





姓名< / f o n t > < / t d >


< / t d >
< / t r >



< / d i v >
< / t d >
< / t a b l e >
< / d i v >
< / F o r m >
第2章A S P的内嵌对象使用17
下载

< / p >
< / b o d y >
< / h t m l >
图2-1 使用C o o k i e s集合,初次提交后的结果
图2-2 使用C o o k i e s集合,再次提交后的结果
在记事本中输入以上代码,保存为R e g i s t e r. a s p,用H T T P的方式访问R e g i s t e r. a s p。
现在让我们来看看上面的代码是如何工作的:
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 " )
18使用ASP与SQL Server 网站架设
下载
用R e q u e s t对象读取c o o k i e的值,如果存在,赋给变量U s e r n a m e。并显示“欢迎你再次光
临”。
IF Username="" THEN
如果这个C o o k i e不存在,则创建它,并显示"欢迎你初次光临"。
Username = Request.Form("Username")
Response.Cookies("UserInfo") = Username
Response.Cookies("UserInfo").Expires = "Dec 1, 2000"
Response.Cookies("Userinfo").Path = "/"
IF Username <> "" THEN
Response.Write 欢"迎你初次光临"
END IF
E L S E
Response.Write 欢"迎你再次光临"
END IF
尽管上面的这个例子很简单,但可以从中扩展许多富有创造力的应用程序。你可以在表单
中加入许多功能,以便定制化We b站点。你还可以让访问者定制网站的色彩、字体,以及其他
We b元素。有可能的话,你可以询问访问者的生日,当访问者在那一天来访时,你就可以显示”
生日快乐”的信息给他。
在上面的例子中,我们看到了对R e q u e s t对象的新的引用:
Username = Request.Form("Username")
当需要在多个A S P主页中传递消息的时候, R e q u e s t的F o r m方法是一个你可以选择的方法。
它通过使用POST 方法的表格检索传送到HTTP 请求正文中的表格元素的值。它的具体语法是:
Request.Form(element)[(index)|.Count]
参数:
element 指定集合要检索的表格元素的名称。
index 可选参数,使用该参数可以访问某参数中多个值中的一个。它可以是1 到R e q u e s t . F o r m
(parameter).Count 之间的任意整数。
Count 集合中元素的个数
Form 集合按请求正文中参数的名称来索引。Request.Form(element) 的值是请求正文中所有
element 值的数组。通过调用Request.Form(element).Count 来确定参数中值的个数。如果参数未
关联多个值,则计数为1。如果找不到参数,计数为0。要引用有多个值的表格元素中的单个值,
必须指定index 值。index 参数可以是从1 到Request.Form(element).Count 中的任意数字。如果
引用多个表格参数中的一个,而未指定index 值,返回的数据将是以逗号分隔的字符串。
可以使用重述符来显示表格请求中的所有数据值。在下例中,用户通过指定的几个值填写
表格(结果参见图2 - 3与图2 - 4),代码如下:
< 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 >
< H 2 >个人爱好情况< / H 2 >
第2章A S P的内嵌对象使用19
下载
< P >
请提供以下信息,然后单击"提交" :

< P >
足球name="title" value=乒"乓 球"> 乒乓球 网球 蓝球< I n p u t
Type="checkbox" name="title" valu羽e毛="球 "> 羽毛球

name="title" value=棒"球 "> 棒球 冰球 壁球


< / F o r m >
< / B o d y >
< / H t m l >
在记事本中输入以上代码,保存为f o r m . h t m。
<%@ LANGUAGE = "VBScript" %>
< %
FOR Each item In Request.Form("title")
Response.Write item & "
"
N E X T
% >
图2-3 供选择的表单
在记事本中输入以上代码,保存为f o r m . a s p。把两个文件拷贝到同一个目录,用H T T P的方
式打开f o r m . h t m浏览,观察单击“提交”按钮后的浏览器输出。
20使用ASP与SQL Server 网站架设
下载
图2-4 用R e q u e s t得到F o r m集合的内容
相信看到这里的读者应当十分熟悉H T M L,显示结果应该能想象到了(如果不是的话,请先
看本书的附录关于H T M L的内容或者其他有关制作主页的入门书籍)。在这里,主页的介绍就不
再多写了。请注意这里面的F o r m M e t h o d = " P O S T ",也就是说,文本框内容在“提交”按钮点击
确认后会传送到服务端,由于F o r m的内容将作为H T T P请求的一部分,那么就是说可以用A S P的
R e q u e s t对象来处理了。针对这种目的, A S P的R e q u e s t对象特别指定了一个F o r m集合来进行相关
处理。F o r m集合就可以包含所有添加HTML Form的信息。
在R e q u e s t对象中,还有一个集合实现类似的功能,它就是Q u e r y S t r i n g。我们经常可以看见
类似这样的网络地址:“h t t p : / / w w w. s t o c k t . c o m / q u e r y. a s p ? s t o c k C o d e = 0 6 6 0”。
问号(?) 后面的值就是H T T P查询字符串,而QueryString 集合检索HTTP 查询字符串中变量
的值。通过发送表格数据或由用户在其浏览器的地址框中键入查询都可以生成类似的查询字符
串。它和F o r m集合的区别是用QueryString 集合检索HTTP 查询字符串中变量的值时,变量和它
的值是可见的。也就是说,任何一个路过的人都可以看见由Q u e r y S t r i n g集合接收的任何变量的
值,这就意味着如果用它来传递用户密码是很危险的。
如果传递的数据量比较大,用Q u e r y字段也不好办。对于不同的浏览器,这种信息传递的大
小是有不同的限制的,例如IE 4.0无法处理超过2 0 0 0个字符的Q u e r y字段。如果U R L连接带Q u e r y
字段超过这个长度,浏览器就无法正确处理。有时无法确认字段长度具体有多少,因为实际上
对于浏览器限制的长度是指浏览器地址栏中所能显示并发送的最大长度,也就是U R L地址和
Q u e r y字段的总长度。
再有,很多浏览器所限定的长度还远远达不到IE 4.0的2 0 0 0个字符的限制,尤其是早期的版
本,因此,一般说来,如果传递数据量比较大,就不要使用这种方式了。
所以,利用Q u e r y字段传递的信息都应当是简洁的和非保密的,如果有大量数据需要传递,
那么可以利用H T T P的F o r m中的h i d d e n类型,详细介绍请参考有关H T M L的介绍。在这里值得解
第2章A S P的内嵌对象使用21
下载
释的是,H T T P协议在传递F o r m时比传递Q u e r y字段有效得多。Q u e r y S t r i n g集合的具体语法是:
Request.QueryString(variable)[(index)|.Count]
参数:
v a r i a b l e:在HTTP 查询字符串中指定要检索的变量名。
i n d e x:这是一个可选参数,可以用来检索variable 的多个值中的某一个值。可以是从1 到
Request.QueryString(variable).Count 之间的任何整数。
Q u e r y S t r i n g集合可以让你用名称检索环境变量Q U E RY S T R I N G的值,Q U E RY_STRING 包
含查询H T T P请求中问号( ?)后的信息。Request.QueryString (参数) 的值是出现在Q U E RY
_STRING 中所有参数值的数组。通过调用Request.QueryString(parameter).Count 可以确定参数
有多少个值。如果变量未关联多个数据集,则计数为1。如果找不到变量,计数为0。
可以使用循环在查询字符串中遍历所有的数据值。例如,如果发送以下的请求:
h t t p : / / N a m e s . a s p ? N A M E = F r e d & N A M E = S a l l y
而且Names.asp 包含下面的脚本:
< %
FOR Each item In Request.QueryString("NAME")
Response.Write item & "
"
N E X T
% >
Names.asp 将显示如下:
F r e d
S a l l y
上述脚本也可以用Count 来写。
< %
FOR I = 1 To Request.QueryString("NAME").Count
Response.Write Request.QueryString("NAME")(I) & "
"
N E X T
% >
还有,上面关于F o r m集合的例子F o r m . a s p可以改写成:
<%@ LANGUAGE = "VBScript" %>
< %
FOR Each item In Request.QueryString("title")
Response.Write item & "
"
N E X T
% >
可以得到相同的结果。
对象R e s p o n s e的另一个常用的方法是Redirect 方法。在很多场合下,你需要引导用户到另一
个主页上,例如,用户注册单没有填写完全或填写错误就进行了提交,那么提交程序会自动将
用户返回到注册页等等。Redirect 方法使浏览器立即重定向到程序指定的U R L。这也是一个我
们经常用到方法,这样,程序员就可以根据客户的不同响应,为不同的客户指定不同的页面,
或根据不同的情况指定不同的页面。一旦使用了Redirect 方法,任何在页中显式设置的响应正
文内容都将被忽略。然而,此方法不向客户端发送该页设置的其他HTTP 头信息,而是产生一
个将重定向URL 作为链接包含的自动响应正文。Redirect 方法发送下列显式头文件,其中U R L
22使用ASP与SQL Server 网站架设
下载
是传递给该方法的值。如:
< %
IF Request.Form("UserName")="" THEN Response.Redirect "register.asp"
% >
< 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 >
谢谢您、< % = R e q u e s t . F o r m ( " U s e r N a m e " ) % >注册教程示例。
< / B O D Y >
< / H T M L >
假设一个用户没有填写姓名就提交了注册表,那么第一个脚本的判断就会将用户重新引导
回注册页面。
必须在浏览器显示任何文本前使用R e s p o n s e . R e d i r e c t方法,最好是在< H T M L >标记之前进行
使用。
可以利用R e s p o n s e . R e d i r e c t方法来指向任何合法的网址,该网址可以是H T M L主页或A S P页
面等,可以处于当前服务器,也可以处于局域网甚至广域网上的任何一台自带操作系统和H T T P
S e r v e r的服务器。
不过,现在这种操作并不顺利,老版本的浏览器通常无法处理这个方法,更糟的是,新的
浏览器(诸如N e t S c a p e 4 . 0)也无法自动响应,而是会显示如下信息:
Object Moved
This Object may be found here
用鼠标单击h e r e后,转到相应页面。
这显然是站点制作人所不愿意看到的,用户也会很不习惯。所以我们可以把要转到的页面
包含进当前文件。
利用服务端的I N C L U D E命令可以很容易地在A S P中包含其他文件。这种服务端的I N C L U D E
命令不需要在脚本中实现,它完全可以作为H T M L代码的一部分,例如:
< 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 >
在这个例子中。文件m y b a n n e r. i n c将被插入到这个A S P文件< B O D Y >标记下面,当这个A S P
文件执行时,在m y b a n n e r. i n c中的H T M L代码以及脚本也将在相应位置执行或出现(其实和子程
序差不多,只不过没有参数传递)。这种文件包含有两种路径,虚拟路径或者物理路径。下面是
包含物理路径的示例:
< 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 >

第2章A S P的内嵌对象使用23
下载
欢迎进入文件包容示例程序
< / B O D Y >
< / H T M L >
如果你使用F I L E命令来指定物理路径,那么文件必须在当前目录或者子目录下面。本例中,
文件在当前目录下,这样限制就比较多,因此,一般你应当使用虚拟路径命令。
这种文件对于任何扩展名都是有效的,一般来说,习惯上用. i n c扩展名,但是还可以使用
. a s p、. h t m、. h t m l或者任何其他扩展名。
当改变了包含的文件时,并不一定马上就看到效果,那是因为I I S的缓存作用, I I S在对正常
文件变动的响应比包含文件变动的响应要快。在这种场合下,你有两种方法处理。一种是在
Internet Service Manager中重新启动一下S e r v e r。另一种是将包含其他文件的母文件也做一下改
动,例如添加一个无意义的空格,那么I I S就会意识到这种变动并且作出正确响应,不过,如果
包含变动文件的母文件较多,显然这就成了耗时耗力的工作。
有两种情况需要包含其他文件,一种是有一些十分通用的常用程序段或者脚本,不需要每
个A S P文件都写一遍,那么完全可以在每个需要的A S P文件中进行包含就行了。
另外一种是进行判断后根据条件重定向的场合,例如上面的例子,也完全可以利用
I N C L U D E语句实现。请看下面这段例子:
< %
IF Request.Form("Username")="" THEN
% >

这个脚本是错误的,因为在I I S中先执行I N C L U D E语句,后执行V B脚本。这样,文件
"< % = M y I n c l u d e % >"自然找不到。
2.1.1 Response对象的属性
1. ContentTy p e属性
C o n t e n t Ty p e属性指定响应的HTTP 内容类型。如果未指定C o n t e n t Ty p e,其默认值为
t e x t / H T M L。
2. Charset属性
Charset 属性将字符集名称附加到Response 对象中content-type 头信息的后面。对于不包含
Response.Charset 属性的ASP 页,content-type 头信息将为: c o n t e n t - t y p e : t e x t / h t m l。我们可以在
.asp 文件中指定content-type 头信息,如:
< % Response.Charset="gb2312") %>
将产生以下结果:
content-type:text/html; charset=gb2312
无论字符串表示的字符集是否有效,该功能都会将其插入content-type 头信息中。且如果某
个页包含多个含有Response.Charset 的标记,则每个Response.Charset 都将替代前一个
C h a r s e t N a m e。这样,字符集将被设置为该页中Response.Charset 的最后一个实例所指定的值。
3. Expires 属性
E x p i r e s属性指定了在浏览器上缓冲存储的页距过期还有多少时间。如果用户在某个页过期
之前又回到此页,就会显示缓冲区中的版本。如设置r e s p o n s e . e x p i r e s = 0,则可使缓存的页面立
即过期。这是一个较实用的属性,当客户通过ASP 的登陆页面进入Web 站点后,应该利用该属
性使登陆页面立即过期,以确保安全。
4. ExpiresAbsolute 属性
与Expires 属性不同,ExpiresAbsolute 属性指定缓存于浏览器中页面的确切到期日期和时间。
在未到期之前,若用户返回到该页,该缓存中的页面就显示。如果未指定时间,该主页在当天
午夜到期。如果未指定日期,则该主页在脚本运行当天的指定时间到期。如下示例指定页面在
2000 年7 月31 日上午9:00 分30 秒到期。
<% Response.ExpiresAbsolute=#Jul 31,2000 9:00:30# %>
2.1.2 Request对象的属性
1. TotalBytes 属性
得到客户端在请求正文中发送的总字节数。该属性为只读。
语法:
第2章A S P的内嵌对象使用25
下载
Counter = Request.TotalBytes
参数:
2. Counter属性
指定一个变量来接收客户端在请求中发送的总字节数。
示例:以下脚本设置一个等于请求对象中包括的总字节数的变量。
< %
Dim bytecount
bytecount = Request.TotalBytes
% >
2.1.3 Request对象的方法
R e q u e s t对象包括BinaryRead 方法,该方法获取作为POST 请求的一部分而从客户端传送到
服务器的数据。此方法获取来自客户端的数据并将其储存在SafeArray 中。SafeArray 是一个数
组,其中包含维数和边界信息。
语法:
variant = Request.BinaryRead(count)
参数:
v a r i a n t:包含由该方法返回的无符号数的数组。该参数的类型为V T A R R AY | VT_UI1。
c o u n t:在执行前,指定要从客户端读取的字节数。此方法返回后, count 将包含从客户机成
功读取的字节数。实际读取的字节总数将小于或等于R e q u e s t . To t a l B y t e s。
BinaryRead 方法用于读取作为POST 请求的一部分从客户端发出的未加工数据。此方法用
于在底层访问数据。与此相反, Request.Form 集合用于查看在公告请求中发送的表格数据。一
旦调用了B i n a r y R e a d,则引用Request.Form 集合中的任何变量都将导致错误发生。反之,一旦
引用了Request.Form 集合中的一个变量,则调用B i n a r y Write 也将导致错误发生。请记住,如
果在访问Request 集合中的变量时未指定该变量属于哪一个子集,将搜索Request.Form 集合并
强制使用上述规则。
下列示例使用BinaryRead 方法将请求的内容放入一个安全的数组中。
< %
Dim binread
Dim bytecount
bytecount = Request.TotalBytes
binread = Request.BinaryRead(bytecount)
% >
2.2 Application 对象
微软希望用户将A S P作为一种常规的编程语言。当你创建了一个A S P页的时候,你就创建
了一个类似子程序这样的东西。当你创建了一组A S P页,那么你就是创建了一个A p p l i c a t i o n
对象。
26使用ASP与SQL Server 网站架设
下载
因此,一个A p p l i c a t i o n对象就是在硬盘上的一组主页以及A S P文件,当一个ASP 加入了一个
a p p l i c a t i o n对象,那么它就拥有了作为单独主页所无法拥有的属性。下面是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对象可以覆盖多个用户。
• 一个A p p l i c a t i o n对象包含事件可以触发某些A p p l i c a t i n对象脚本。
• 一个对象的例子可以被整个A p p l i c a t i o n对象共享。
• 个别的A p p l i c a t i o n对象可以用Internet Service Manager来设置而获得不同属性。
• 单独的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对象(将其所有组件从内存中驱除)而不会影响到其他应用程
序。
一个网站可以有不止一个A p p l i c a t i o n对象。典型情况下,你可以针对个别任务的一些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对象来适用于全部公用用户,而再创
建另外一个Ap p l i c a t i o n对象只适用于网络管理员。
Application 对象使给定应用程序的所有用户之间共享信息,并且在服务器运行期间持久地
保存数据。因为多个用户可以共享一个Application 对象,所以必须要有Lock 和Unlock 方法以
确保多个用户无法同时改变某一属性。
语法:
A p p l i c a t i o n . m e t h o d
2.2.1 集合
1. Contents集合
Contents 是由所有通过脚本命令添加到应用程序的项目组成的集合。可以使用Contents 集
合获取给定的应用程序作用域的项目的列表或设置给定应用程序的属性。
语法:
A p p l i c a t i o n . C o n t e n t s ( K e y )
参数:
K e y:指定要获取的项目的名称。
Application.Contents 集合包含了用S e r v e r.CreateObject 创建的对象和通过A p p l i c a t i o n对象
声明建立的数值变量。例如,在下面的脚本中, M y Var 和MyObj 将成为A p p l i c a t i o n . C o n t e n t s
集合的成员:
<%
Application("MyVar") = "Hello"
Set Application("MyObj") = Server.CreateObject("MyComponent")
% >
Application.Contents 集合支持FOR...EACH 和FOR...NEXT 循环。下列两个脚本说明遍历
Application.Contents 集合的每种方法。
第2章A S P的内嵌对象使用27
下载
< %
FOR EACH Key in Application.Contents
Response.Write ("Key")
NEXT Key
% >
<%
FOR i = 1 to Application.Contents.Count
Response.Write ("Key")
NEXT Key
% >
2. StaticObjects 集合
StaticObjects 集合包含所有的在Application 对象范围中使用 标记创立的对象。
可以使用该集合确定某对象的指定属性的值或遍历集合及检索所有静态对象的所有属性。
语法:
A p p l i c a t i o n . S t a t i c O b j e c t s ( K e y )
参数:
K e y:指定要检索的项目的值。
使用循环控制结构可以遍历StaticObjects 集合中的关键字。请看下面的示例。
<%
DIM ObjProp
FOR Each ObjProp in Application.StaticObjects
Response.Write(ObjProperty & " : " & Application.StaticObjects(ObjProp) &
" < B R > " )
NEXT ObjProp
%>
2.2.2 方法
1. Lock方法
Lock 方法可以阻止其他客户修改存储在Application 对象中的变量,以确保在同一时刻仅有
一个客户可修改和存取Application 变量。如果用户没有明确调用Unlock 方法,则服务器将在
.asp 文件结束或超时后即解除对Application 对象的锁定。
语法:
Application.Lock
2. Unlock方法
Unlock 方法可以使其他客户端在使用Lock 方法锁住Application 对象后,修改存储在该对
象中的变量。如果未显式调用该方法, Web 服务器将在.asp 文件结束或超时后解锁A p p l i c a t i o n
对象。
语法:
A p p l i c a t i o n . U n l o c k
28使用ASP与SQL Server 网站架设
下载
示例:
<%
A p p l i c a t i o n ( " N u m V i s i t s " ) = 0
A p p l i c a t i o n . L o c k
Application("NumVisits") = Application("NumVisits") + 1
A p p l i c a t i o n . U n l o c k
%>
这个应用程序网页已被访问了
<%= Application("NumVisits") %次>!
在前面的示例中, Lock 方法保护变量N u m Visits 在同一时刻不被多个客户所访问。U n l o c k
方法解除对象的锁定,使得下一个客户端能够增加N u m Vi s i t s。如果应用程序未被锁定,则两个
客户就可以同时增加变量N u m Visits 的值。
这样,我们用A p p l i c a t i o n对象轻易的建立了一个简单的计数器。
2.2.3 事件
1. Application_OnEnd事件
Application_OnEnd 事件在应用程序退出时于Session_OnEnd 事件之后发生,只有
Application 和Server 内嵌对象可用。
语法:

参数:
ScriptLanguage
指定用于编写事件脚本的脚本编写语言。可以是任何一种支持脚本的语言,例如V B S c r i p t
或J S c r i p t。
2. Application_OnStart事件
Application_OnStart 事件在首次创建新的会话(即Session_OnStart 事件)之前发生。只有
Application 和Server 内嵌对象是可用的。在Application_OnStart 事件脚本中引用S e s s i o n、
Request 或Response 对象将导致错误。
语法:
阅读(1239) | 评论(0) | 转发(0) |
0

上一篇:ASP与数据库

下一篇:ASP 组件

给主人留下些什么吧!~~