第 6章 ASP中的内建对象
本章要点,
?HTML中使用表单
?Request 对象
?Response 对象
?ASP内建对象 Server
?Global.asa文件的作用
在面向对象编程中, 对象就是指由当作
完整实体的操作和数据组成的变量, 是基于
特定模型的 。 在对象中客户使用对象的服务,
通过由一组方法或相关函数的接口访问对象
的数据, 然后客户端调用这些方法执行某种
操作 。
ASP提供了可在脚本中使用的内建对象 。
通过这些对象, 用户更容易收集通过浏览器
请求发送的信息, 响应浏览器以及存储用户
信息,从而使对象开发者摆脱很多烦琐的工
作 。
6.1 在 HTML中使用表单
表单在 HTML页面中起着重要作用,它是与用
户交互信息的主要手段。一个表单至少应该包括
说明性文字、用户填写的表格、提交和重填按钮
等内容。用户填写了所需的资料之后,按下, 提
交, 按钮,所填资料就会通专门的 CGI接口传到
Web服务器上。网页的设计者随后就能在 Web服务
器上看到用户填写的资料,从而完成了从用户到
作者之间的反馈和交流。
表单中主要包括下列元素,
button——普通按钮
radio ——单选按钮
checkbox——复选框
Select ——下拉式菜单
text ——单行文本框
textarea——多行文本框
submit——提交按钮
reset—— 重填按钮
用 HTML设计表单常用的标记是,<form>,<input>、
<option>,<select>,<textarea>和 <isindex>等
标记。
6.1.1 表单标记 <form>
<form>标记的主要作用是设定表单的起止位
置, 并指定处理表单数据程序的 url地址 。 基本语
法如下,
<form
action= url
method=get|post
name= value
onreset=function
onsubmit= function
target=window>
</form>
其中,
action,用于设定处理表单数据程序 url的地
址, 这样的程序通常是 CGI应用程序, 例如采用
电子邮件方式时,用 action=“mailto:你的邮件地
址, 。
method,指定数据传送到服务器的方式, 有
两种主要的方式, 当 method=get时, 将输入数据
加在 action指定的地址后面传送到服务器;当
method=post时, 则将输入数据按照 HTTP传输协议
中的 post传输方式传送到服务器, 用电子邮件接
收用户信息采用这种方式 。
name,用于设定表单的名称 。
onreset和 onsubmit,主要针对, reset”按钮
和, submit”按钮来说的, 分别设定了在按下相应
的按钮之后要执行的子程序 。
target,指定输入数据结果显示在那个窗口,
这需要与 <frame>标记配合使用。
6.1.2 表单输入标记 <input>
此标记在表单中使用频繁, 大部分表单内容需要
用到此标记 。 语法如下,
<input
aligh=left|righ|top|middle|bottom
name=value
type=text|textarea|password|checkbox|radio|
submit|reset|file|hidden|image|button
value=value
src=url
checked
maxlength=n
size=n
onclick=function
onselect=function>
其中,
align,用于设定表单的位置是靠左 ( left), 靠
右 ( right), 居中 ( middle), 靠
上 (top),还是靠底( bottom)。
name,设定当前变量名称 。
type,决定了输入数据的类型 。 其选项较多, 各
项的意义是,
text,表示输入单行文本;
textarea,表示输入多行文本;
password:表示输入数据为密码, 用星号表示;
checkbox,表示复选框;
radio,表示单选框;
submit,表示提交按钮, 数据将被送到服务器;
reset,表示清除表单数据, 以便重新输入;
file,表示插入一个文件;
hidden,表示隐藏按钮;
image,表示插入一个图像;
button,表示普通按钮;
value,用于设定输入默认值, 即如果用户不输入
的话, 就采用此默认值;
src,是针对 type=image的情况来说的, 设定图像
文件的地址;
checked,表示选择框中, 此项被默认选中;
maxlength,表示在输入单行文本的时候, 最大输
入字符个数;
size,用于设定在输入多行文本时的最大输入字
符数, 采用 width,height方式;
onclick,表示在按下输入时调用指定的子程序;
onselect,表示当前项被选择时调用指定的子程
序。
6.1.3 下拉菜单标记 <select>
用 <select>标记可以在表间中插入一个下拉菜单,
它需与 <option>标记联用, 因为下拉菜单中的每
个选项要用 <option>标记来定义 。 <select>标记
的语法如下,
<select
name=nametext
size=n
multiple>
其中,
name,设定下拉式菜单的名称;
size,设定菜单框的高度, 也就是一次显示几个
菜单项, 一般取默认值 ( size="1") ;
multiple,设定为可以进行多选。
6.1.4 选项标记 < option>
该标记为下拉菜单中一个选项, 语法很简单:
<option selected value=value>
其中,
selected,表示当前项被默认选中;
value,表示该项对应的值, 在该项被中之后, 该
项的值就会被送到服务器进行处理 。
6.1.5 多行文本输入标记 <textarea>
这是一个建立多行文本输入框的专用标记, 其语
法如下,
<textarea
name=name
cols=n
rows=n
wrap=off|hard|soft>
其中,
name,文本框名称;
cols,宽度;
rows,高度 ( 行数 ) ;
wrap,换行控制;
off,不自动换行;
hard,自动硬回车换行, 换行标记一同被传送到
服务器中去;
soft,自动软回车换行, 换行标记不会传送到服
务器中去 。
表单所涉及的标记较多, 参数也较复杂, 而在实
际制作表单时就是这些标记的组合应用 。 一般的
表单不可能涉及所有参数, 选择参数时尽量用默
认值, 不设定一个不用的参数 。
6.2 Request 对象
Request 对象是 ASP编程中使用最频繁的对象
之一 。 可以使用 Request 对象访问任何基于
HTTP 请求传递的所有信息, 包括从 HTML 表格用
POST方法或 GET方法传递的参数, cookie 和用户
认证等 。 通过 Request 对象能够访问客户端发送
给服务器的二进制数据 。
Request 的语法,
Request[.集合 | 属性 | 方法 ]( 变量 )
其中, 集合可以被指定为 Form或者 QueryString。
变量即提交页面中使用的 Form对象的变量名 。
6.2.1 Form集合
Form集合通过使用 POST 方法的表格检索发
送到 HTTP 请求正文中的表格元素的值 。
语法,
Request.Form(element)[(index)|.Count]
其中,
element 指定集合要检索的表格元素的名称 。
index 可选参数, 使用该参数可以访问某参数中
多个值中的一个 。 它可以是 1 到
Request.Form(parameter).Count 之间的任意整
数 。
Count 集合中元素的个数。
图 6-2 调查表
Form,集合按请求正文中参数的名称来索引,
Request.Form(element) 的值是请求正文中所有
element 值的数组。通过调用
Request.Form(element).Count 来确定参数中值
的个数。如果参数未关联多个值,则计数为 1。
如果找不到参数,计数为 0。要引用有多个值的
表格元素中的单个值,必须指定 index值。 index
参数可以是从 1到 Request.Form(element).Count
中的任意数字。如果引用多个表格参数中的一个,
而未指定 index值,返回的数据将是以逗号分隔的
字符串。
对于图 6-2调查表中的多个, 爱好, 参数, 可以使
用程序 6.2来检索这些值 。
程序 6.2 sample6-02.asp
<html>
<head><title></title></head>
<body>
<p>请填写你的爱好
</p>
<form method="POST" action="form.asp">
<p>
<input type="text" name="hobby" size="20"><br>
<input type="checkbox" name="hobby" value=" 足球
"> 足球
<input type="checkbox" name="hobby" value=" 乒
乓球 "> 乒乓球
</p>
<p>
<input type="submit" value=" 发送 " name="B1">
<input type="reset" value=" 重填 " name="B2">
</p>
</form>
<%
For Each i In Request.Form("hobby")
Response.Write i & "<BR>"
Next
%>
</body>
</html>
当然使用 For...Next 循环也可以生成同样的输出,
如下所示,
< %
For i = 1 To Request.Form("hobby").Count
Response.Write Request.Form("hobby")(i) & "<
BR>"Next
%>
6.2.2 QueryString集合
QueryString集合用来检索 HTTP 查询字符串中变
量的值, HTTP查询字符串由问号 (?) 后的值指定 。
如,
< a href= "example.asp?string=this is a
sample">string sample</a>
生成值为 "this is a sample" 的变量名字符串 。
通过发送表格或由用户在其浏览器的地址框中键
入查询也可以生成查询字符串 。
语法,
Request.QueryString(variable)[(index)|.Coun
t]
QueryString集合可以用名称来检索 QUERY_STRING
变量 。 Request.QueryString(参数 ) 的值是出现
在 QUERY_STRING中所有参数的值的数组 。 通过调
用 Request.QueryString(para
meter).Count 可以确定参数有多少个值 。
也可以使用 QueryString来达到与前一个范例相同
的功能。只需要将 request.form 部分
替换如下,
< %
For Each i In Request.querystring("hobby")
Response.Write i & "< BR>"
Next
%>
6.2.3 Cookies
1,什么是 Cookies?
Cookie其实就是一个标签。在访问一个需要
唯一标识你的地址的 Web站点时,它会在你的硬盘
上留下一个标记,下一次再次访问这个站点时,
站点的页面就会查找这个标记。每个 Web站点都有
自己的标记,标记的内容可以随时读取,但只能
由该站点的页面完成。每个站点的 Cookie与其它
所有站点的 Cookie存在同一文件夹中的不同文件
内( Windows 2000系统下,可以在 C:\Documents
and Settings\Administrator\Cookies的目录下
找到它们)。
一个 Cookie 就是一个唯一标识客户的标记,
Cookie可以包含在一个对话期或几个对话期之间
某个 Web站点的所有页面共享的信息, 使用 Cookie
还可以在页面之间交换信息 。 Request提供的
Cookies集合允许用户检索在 HTTP请求中发送的
cookie的值 。 这项功能经常被使用在要求认证客
户密码以及电子公告板, Web聊天室等 ASP程序中 。
语法,
Request.Cookies(cookie)[(key)|.attribute]
其中,cookie指定要检索其值的 cookie。 key是可
选参数, 用于从 cookie字典中检索子关键字的值 。
attribute指定 cookie自身的有关 信息 。 如:
HasKeys只读, 指定 cookie是否包含关键字 。 可以
通过包含一个 key值来访问 cookie字典的子
关键字 。 如果访问 cookie字典时未指定 key,则所
有关键字都会作为单个查询字符串返回 。 例如,
如果 MyCookie有两个关键字,First和 Second,
而在调用 Request.Cookies时并未指定其中任何一
个关键字, 那么将返回下列字符串 。
First=firstkeyvalue&Second=secondkeyvalue
如果客户端浏览器发送了两个同名的 cookie,
那么 Request.Cookie将返回其中路径结构较深的
一个。例如,如果有两个同名的的 cookie,但其
中一个的路径属性为 /www/而另一个为 /www/home/,
客户端浏览器同时将两个 cookie都发送到
/www/home/目录中,那么 Request.Cookie将只返
回第二个 cookie。
要确定某个 cookie是不是 cookie字典 ( cookie有否有
关键字 ), 可使用下列脚本 。
< %= Request.Cookies("myCookie").HasKeys %>
如果 myCookie是一个 cookie 字典, 则前面的赋值为
TRUE。 否则为 FALSE。 下面看一个 cookie的应用实例 。
程序 6.3 sample6-03.asp
<%
nickname=request.form("nick")
response.cookies("nick")=nickname
'用 response 对象将用户名写入 Cookie 之中
response.write " 欢迎 "&request.cookies("nick")&" 光临小站 !
"
%>
<html><head><meta http-equiv="Content-Type"
content="text/html; charset=gb2312">
<title>cookie</title>
<meta name="GENERATOR" content="Microsoft
FrontPage 3.0"></head>
<body>
<form method="POST" action="cookie.asp">
<p><input type="text" name="nick" size="20">
<input type="submit" value=" 发送 " name="B1"><input
type="reset"
value=" 重填 " name="B2"></p></form>
</body></html>
这其实是一个在基于 Web的 BBS或 CHAT的 ASP程序中
常用的手法, 它将用户在起始页面上所填入的
姓名保存在 cookie 中, 这样后面的程序就可以很
容易地调用该用户的 nick了 。
2,Cookie的工作原理
Cookies将通过 HTTP Headers来从服务端返
回到浏览器上 。 服务端首先在响应中利用 Set-
Cookie header来创建一个 Cookie,浏览器后面的
请求的 cookie header中就会返回这个 Cookie来完
成浏览器的认证 。
假设创建了一个名字为 UserName的 Cookie来
包含访问者的信息, 创建 Cookie时, Server的
Header就象下面 ( 假设访问者为 Bill Gates),
Set-Cookie,
UserName=BILL+Gates;path=/;domain=aspsite.c
om;
expires=Tuesday,01-Jan-99 00:00:01 GMT
这个 Header就在浏览器的电脑上的 Cookie文
件中添加了一条记录 。 浏览器将名字为 UserName
的 Cookie赋值为 Bill Gates。 请注意这个 cookie
的值是进行了 URL-encoded操作的 。
浏览器创建了一个 Cookie后, 在每一个针对
该网站的请求时都会在 Header中带着这个 Cookie,
也就是每一次满足该路径的情况下这个 Cookie都
会有效 。 不过, 对于其它网站的请求 Cookie是绝
对不会跟着发送的 。 浏览器会这样一直发送到
Cookie过期为止 。 Cookie Header如下,
cookie,username,Bill+Gates
3,在 ASP中创建和读取 Cookies
当利用 ASP创建了一个 cookie之后, 就可以使用
Response对象的 Cookie集合了 。 可以创建两种
cookie,一种 是 单 值的 ; 另 一种 可 以 认为 是
cookie字典类型, 即允许多个键值对的存在 。
创建单值的相对简单, 如下脚本,
<%
Response.Cookies("Username")="Bill Gates"
Response.Cookies("Username").Expires="Jan
1,1999"
%>
显然, 这个脚本将名字为 Username的 Cookie
赋值为 Bill Gates,同时将过期时间限定为 1999
年 1月 1日 。
这里面需要说明的是, Expires属性如果不进行赋
值, 那么默认的就是用户一离开网站就过期 。
由于这个例子脚本创建的是 Header的部分,
那么就必须在 ASP的任何输出语句之前进行这个脚
本的操作, 或者使用 Buffer输出 。
前面的脚本是创建一个 Cookie的简单示例,
只是使用了最常用的 Expires属性, 其实还有许多
其他属性也可以自行设置, 下面是一个比较完全
的例子,
<%
Response.Cookies("Username")="Steve Jobs"
Response.Cookies("Username").Expires="Jan 1,1999"
Response.Cookies("Username").Path="/examples"
Response.Cookies("Username").Domain="aspsite.com"
Response.Cookies("Username").Secure=True
%>
这个脚本例子和前面的其实没有什么区别,
不过有三个附加的属性需要解释,
? Path属性是用来更加严格的限定浏览器发送
Cookie,在这个例子中,只有针对于 /examples目
录的请求的 Header中才携带 Cookie信息,例如
/examples/hello.asp以及
/examples/chapter16/hello.asp的请求都会在 Header
上携带 Cookie信息,但是如果是浏览器对 /hello.asp
的请求就不会携带该 Cookie信息。 Path属性的默认
值是该 Cookie创建的 ASP所在的路径。(也就是说,
即便不做指定,也不会跨过目 录发送 Cookie)
? Domain属性,限定了 Cookie发送的网站,例子
中的 aspsite.com说明 cookie可以被发送到
www.aspsite.com或者 beetle.aspsite.com或者
yeah.aspsite.com等等,同样作为默认值是该
Cookie创建的网站。
? 最后是 Secure属性,当该属性设为 True时,则
传递中就实行了加密算法,如果你正在使用安全
接口层,那么就可以使用这个属性。
在一个 ASP 中读取 cookie,只 需 要 使 用
Request对象的 Cookies集合 。 例如, 输出一个
cookie值, 那么脚本如下,
<%=Request.Cookies("Username") %>
这个脚本将名字为 Username的 Cookie值进行了
输出,和以前同样的是,依然可以利用 For Each
循环或者利用 Count属性和 For… Next循环结合的
方式来将 Cookie集合 的所有
属性值显示出来, 下面这个例子的运行结果应当
无须解释了 。
<%
For EACH thing IN Request.Cookies
Response.write("<BR>"&thing&Request.Cookies(thin
g))
NEXT
%>
4,创建多个 Cookie
要创建多个 Cookie,只需在 Response对象的
Cookies集合中简单的定义多个名称就可以 。 不过,
许多浏览器对一个指定网站就限定了三到四个
Cookie。
创建多个 Cookie还有一种选择, 就是创建一个
Cookie字典, 那么一个 Cookie字典中就可以含有多
个键值对, 下面是这么一个字典的例子,
<%
Response.Cookies("User")("Name")="Bill Gates"
Response.Cookies("User")( "Password")= "billions"
%>
这个脚本创建了一个名为 User的 Cookie字典,
其中含有两个键分别是 Name和 Password,当这个
Cookie字典创建时, 请求的 Header中是这样的信息:
Set-
Cookie:User=Name=Bill+Gates&Password=billions
上面的语句创建了一个名字为 User的 Cookie,它含
有两个键值对, 这意味着所有的键和相应的值都
在一个大的 Cookie中 。
接受这样的 Cookie值,还可以利用以前的
Response对象的 Cookies集合,既可以将其全部显
示,(这样显示就是没有经过解码的 Header中的源
代码,也就是上面 Header中的信息,这样一般都是
用于调试工作)也可以按每一个键的相应名称显
示相应值,如下例,
<%=Request.Cookies("User") %>
<%=Request.Cookies("User")("Name")%>
<%=Request.Cookies("User")( "Name")%>
利用 Cookie技术传递诸如密码这样的信息要特
别小心, 因为一般说来, 这种信息是未经加密的,
当然, 如果网站有安全接口层技术, 也可以进行
加密传输, 但是在浏览器端该信息还是存放在文
本文件中 。
如果希望知道一个 Cookie是否是一个 Cookie字
典, 可以用 HasKeys属性, 例如下面脚本如果返回
值为 True,那么就是一个 Cookie字典 。
<%=Request.Cookies("User").HasKeys %>
5,不利用 Cookie来保持信息
前面已经介绍过 QueryString字段的使用及接收,
以及 Form的接收 。 这两种手段也可以进行一些信
息保存, 最后对这三种方案进行综合比较 。
( 1) 利用 QueryString来保持信息
由于可以在连接中添加任何 QueryString字段, 那么,
只要在网站的所有连接中添加一个保存用户某种
信息的字段, 再在各个程序上进行相应处理, 就
可以进行模拟跟踪, 如下例,
<HTML>
<HEAD><TITLE>Query字段进行信息保留
</TITLE></HEAD>
<BODY>
<%
Username=Server.URLEncode("Bill Gates")
%>
<A Href="/nextpage.asp?<%=UserName%>">点击这里 </a>
</BODY>
</HTML>
这个脚本将 Bill Gates赋值给 Username的变量, 然后将它通
过 QueryString传递给 nextpage.asp,那么在 nextpage.asp中就
可以接受, 然后继续进行这个参数的传递 。 例如:下面就
是 nextpage.asp的一个示例,
<HTML>
<HEAD><TITLE>Next Page</TITLE></HEAD>
<BODY>
<%
Username=Server.URLEncode("Request.QueryString("Userna
me"))
%>
<A HREF="/thirdpage.asp?<%=Username%>">点击这里 </a>
</body>
</html>
这个脚本的优点是适用于所有浏览器,但是
用这样的传递来保存信息实在太麻烦了,所有的
连接都要考虑到,每一个 ASP都必须相应处理一下,
而且用户很可能, 一不小心, 就溜出了这种跟踪
之外。另外,修改起来也过于麻烦。
另一个缺点是针对不同的浏览器必须考虑长
度限制,同时安全性没有保证。
( 2) 利用 Form的 hidden类型进行信息传递
如果确实需要传递大量信息而又不想选用 Session
变量,那么只有利用 Form的 Hidden类型。如下例,
<HTML>
<HEAD><TITLE>Form传参示例 </TITLE></HEAD>
<BODY>
<%
Username="Bill Gates"
%>
<FORM METHOD="Post" Action="/nextpage.asp">
<INPUT Name="Username" TYPE="HIDDEN"
VALUE="<%=Username%>">
<input type="submit" name="下一页 ">
</Form>
</Body>
</HTML>
这个页面包括一个表单, 其中有一个隐含类
型名字为 Username,同时赋予 Username变量的值 。
表单上有一个 Submit按钮, 当按钮点击后, 在
hiden类型中存放的 Username的值将传递到下一个
网页上, 在下一个网页进行处理, 然后以同样方
式传递到另外一个新的主页上, 下面是
nextpage.asp的例子,
<HTML>
<HEAD><TITLE>下一页 </TITLE></HEAD> <BODY>
<%
Username=Request.Form("Username")
%>
<FORM METHOD="Post" Action="/thirdpage.asp">
<input name="Username" Type="hidden"
Value="<%=Username%>">
<input type=submit value="再下一页 ">
</Form>
</Body>
</Html>
( 3) 两种方法的结合
这两种方法实现起来都十分麻烦, 但是, 如
果偏要不用 Cookies和 Session变量来传递信息,
确实也别无良策 。 同时, 这两种方法确实可以适
用于任何浏览器 。
请注意, 如果在任意一页中没有进行这种
QueryString字段或者 hidden类型的表单的处理,
那么这种跟踪就停止了 。
一个明显的缺点是不管利用 QueryString字
段还是利用 Hidden Form传递信息, 安全性都是
毫无保证的, 这是由于浏览器对信息的接受是在
几乎毫无屏障的情况下进行的 。
完全可以将这两种方法结合起来,而在接受
时可以没有任何区别。这里面补充的是,对于
Response对象,可以不指定 Form集合和
QueryString集合来进行接受,这时系统会自动
辨认。见下面这个例子,
<HTML>
<HEAD><TITLE>下一页 </TITLE></HEAD>
<BODY>
<%
Username=Request("Username")
%>
<!---注:就是上面这个脚本, QueryString和 hidden的 Form
都可以正确接收 --->
<Form Method="Post" Action="/nextpage.asp">
<input name="Username" Type="Hidden"
Value="<%=Username%>">
<input type=Submit value="下一页 ">
</FORM>
<a href=/nextpage.asp?<%=ServerURLEncode(Username)%>
点击这里 </a>
</BODY>
</HTML>
在这个例子中,变量 Username被赋值而无须知道
上一页是利用的 Hidden form域 还是 QueryString
来传递参数。在以后编制 ASP时,这种
Request("Username")形式的简易调用将十分常用。
6.2.4 ServerVariables
在浏览器中浏览网页的时候使用的传输协议
是 HTTP,在 HTTP的标题文件中会记录一些客户端
的信息, 如:客户的 IP地址等等 。 有时服务器端
需要根据不同的客户端信息做出不同的反应, 这
时候就需要用 ServerVariables 集合获取所需信
息 。
语法,Request.ServerVariables ( 服务器环境
变量 )
由于服务器环境变量较多,表 5-1中仅列出了一些常用的变量。
ALL_HTTP
客户端发送的所有 HTTP标题文件。
CONTENT_LEN
GTH
客户端发出内容的长度。
CONTENT_T
YPE
内容的数据类型。如:, text/html”。 同附加信息
的查询一起使用,如 HTTP查询 GET,POST和
PUT。
LOCAL_ADD
R
返回接受请求的服务器地址。如果在绑定多个 IP
地址的多宿主机器上查找请求所使用的地址时,
这条变量非常重要。
LOGON_USER 用户登录 Windows NT的帐号。
QUERY_STRING
查询 HTTP请求中问号(?)后的信息。
REMOTE_ADDR
发出请求的远程主机 (client) 的 IP地址。
REMOTE_HOST
发出请求的主机 (client) 名称。如果服务器无此信
息,它将设置为空的 REMOTE_ADDR 变量。
REQUEST_MET
HOD
该方法用于提出请求。相当于用于 HTTP的
GET,HEAD,POST等等。
SERVER_NAME
出现在自引用 URL中的服务器主机名,DNS
或 IP地址。
SERVER_PORT
发送请求的端口号。
表 5-1 服务器环境变量
可以使用以下脚本打印出所有的服务器环境变量 。
<TABLE>
<TR><TD><B>Server
Variable</B></TD><TD><B>Value</B></TD></TR>
<% For Each name In Request.ServerVariables %>
<TR><TD>
<%= name %>
</TD>
<TD><%=Request.ServerVariables(name)%><%
Next%></TD>
</TR>
</TABLE>
一个非常有用的实例是,可以利用 ServerVariables,
如 REMOTE_ADDR来规定来自哪些 IP地址的客户机可
以访问你的系统,以保护你的页面不被某些用户
浏览。这段代码留给读者完成。
6.3 Response对象
Request 是获取客户端 HTTP 信息, 相反
Response对象用来控制发送给用户的信息, 包括
直接发送信息给浏览器, 重定向浏览器到另一个
URL或设置 cookie的值 。
语法,
Response.collection|property|method
6.3.1 属性
( 1) Buffer
Buffer 属性指示是否缓冲页输出 。 当缓冲页
输出时, 只有当前页的所有服务器脚本处理完毕
或者调用了 Flush 或 End 方法后, 服务器才将
响应发送给客户端浏览器, 服务器将输出发送给
客户端浏览器后就不能再设置 Buffer 属性 。 因
此应该在, asp 文 件 的 第 一 行 调 用
Response.Buffer。
( 2) Charset
Charset 属 性 将 字 符 集 名 称 附 加 到
Response 对象中 content-type标题的后面 。 对于
不包含 Response.Charset 属性的 ASP 页,
content-type 标 题 将 为, content-
type:text/html。
可以在,asp文件中指定 content-type标题,
如,<% Response.Charset="gb2312") %>
将产生以下结果,
content-type:text/html; charset=gb2312
注意,无论字符串表示的字符集是否有效,
该功能都会将其插入 content-type 标题中。且如
果某个页包含多个含有 Response.Charset的标记,
则每个 Response.Charset都将替代前一个
CharsetName。 这样,字符集将被设置为该页中
Response.Charset的最后一个实例所指定值。
( 3) ContentType
ContentType属性指定服务器响应的 HTTP内容类型 。
如果未指定 ContentType,默认为 text/html。
( 4) Expires
Expires属性指定了在浏览器上缓冲存储的页距
过期还有多少时间 。 如果用户在某个页过期之前
又回到此页, 就会显示缓冲区中的页面 。 如果设
置 response.expires=0,则可使缓存的页面立即
过期 。 这是一个较实用的属性, 当客户通过 ASP的
登陆页面进入 Web站点后, 应该利用该属性使登陆
页面立即过期, 以确保安全 。
( 5) ExpiresAbsolute
与 Expires属性不同 ExpiresAbsolute属性指
定缓存于浏览器中的页面的确切到期日期和时间 。
在未到期之前, 若用户返回到该页, 该缓存中的
页面就显示 。 如果未指定时间, 该主页在当天午
夜到期 。 如果未指定日期, 则该主页在脚本运行
当天的指定时间到期 。 如下示例指定页面在 1998
年 12月 10日上午 9:00分 30秒到期 。
< % Response.ExpiresAbsolute=#Dec 12,1998
9:00:30# %>
6.3.2 方法
( 1) Clear方法
可以用 Clear方法清除缓冲区中的所有 HTML输
出 。 但 Clear方法只清除响应正文而不清除响应标
题 。 可以用该方法处理错误情况 。 但是如果没有
将 Response.Buffer设置为 TRUE,则该方法将导
致运行时错误 。
( 2) End方法
End方法使 Web服务器停止处理脚本并返回当前结
果。文件中剩余的内容将不被处理。
如果 Response.Buffer已设置为 TRUE,则调用
Response.End将缓冲输出 。
( 3) Flush方法
Flush 方法立即发送缓冲区中的输出 。 如果
没有将 Response.Buffer设置为 TRUE,则该方法将
导致运行时错误 。
( 4) Redirect方法
Redirect方法使浏览器立即重定向到程序指定
的 URL。 这也是一个经常用到的方法, 利用此方法,
程序员可以根据客户的不同响应, 为不同的客户
指定不同的页面或根据不同的情况指定不同的页
面 。 一旦使用了 Redirect 方法, 任何在页中显
式设置的响应正文内容都将被忽略 。 然而, 此方
法不向客户端发送该页设置的其它 HTTP 标题,
将产生一个将重定向 URL 作为链接包含的自动
响应正文 。 Redirect 方法发送下列显式标题, 其
中 URL 是传递给该方法的值 。 如,
<% Response.redirect("www.edu.cn") %>
( 5) Write方法
Write方法是平时最常用的方法之一,它是将
指定的字符串写到当前的 HTTP输出。
6.3.3 集合
Response 对象只有一个集合 ——Cookie。
Cookies 集合设置 cookie的值 。 若指定的 cookie
不存在, 则创建它 。 若存在, 则设置新的值并且
将旧值删去 。
语法,
Response.Cookies(cookie)[(key)|.attribute]=
value
这里的 cookie是指定 cookie的名称 。 而如果
指定了 key,则该 cookie 就是一个字典 。
attribute 指定 cookie 自 身 的 有 关 信 息 。
attribute 参数可以是下列之一,
Domain若被指定, 则 cookie将被发送到对该域的
请求中去 。
Expires指定 cookie的过期日期 。 为了在会话结束
后将 cookie存储在客户端磁盘上, 必须设置该
日期 。 若此项属性的设置未超过当前日期, 则在
任务结束后 cookie将到期 。
HasKeys指定 cookie是否包含关键字 。
Path若被指定, 则 cookie将只发送到对该路径的
请求中 。 如果未设置该属性, 则使用应用程序的
路径 。
下 面 通 过 一 段 程 序 来 说 明 Request 和
Response的应用 。
程序 sample6-04.asp
<%
Dim user
Dim flag
Dim pwd
Dim say
Response.buffer=true '开启缓冲页面功能
Response.ContentType="text/HTML"
Response.Charset="gb2312"
user=Request.Form("username")
pwd=Request.Form("password")
say=Request.QueryString("say")
%>
<form method="POST" action=" sample6-04.asp ">
<p> 用户名,
<input type="text" name="username" size="12"><br>
口 令,
<input type="password" name="password" size="12"><br>
<input type="submit" value=" 提交 " name="B1">
<input type="reset" value=" 取消 " name="B2"></p>
</form>
<%
If say=1 then
Response.Write " 欢迎光临寒舍 !"
End If
If say>1 then
Response.Write " 欢迎再次光临 !"
End If
If user="adm" and pwd="adm" Then
页面输出
End If
%>
<% Response.write "<p><a href=' sample6-
05.asp?flag="&flag&"'>Web数据库技术 </a></p>"
%>
程序 sample6-05.asp,
<%
Dim say
say=Request.QueryString("flag")
Response.write say
Select case say
case "1"
Response.Redirect " sample6-04.asp?say=1"
case "2"
Response.Redirect " sample6-04.asp?say=2"
case "3"
Response.Redirect " sample6-04.asp?say=3"
case "0"
Response.Redirect " sample6-04.asp?say=0"
End Select
%>
将这两个程序放在有执行权限的 Web 虚拟目
录下, 并以 http方式访问 sample6-04.asp。 当第
一次访问 sample6-04.asp文件时, 页面上出现一
个 Form并提示输入用户名和口令, 如果你输入
用户名,adm; 口令,adm,则会出现如图 6-3的页面,
图 6-3 adm用户首次访问 sample6-04.asp的结果
如果输入用户名,guest; 口令,guest,则仅出
现如图 6-4的页面,
图 6-4 guest用户首次访问 sample6-04.asp的结果
程序分析如下:由于设置了页面缓存, 当使
用 guest 登陆时, 判断程序自动清空其之前所有
存储在缓存中的页面, 而仅将其后脚本程序执行
的结果显示出来 。
第一次 sample6-04.asp页面时仅仅显示一个
Form对话框, 是因为此时程序判断到用户既非
adm,也不是 guest和 vip,所以执行 Response.End,
立即将存储在缓存中的 Form显示出来, 并停止其
后的一切脚本处理, 包括纯 HTML代码的显示 。
无论是用 adm还是 guest或 vip登陆该页面都可
以看到一个超链接,该超链接指向文件 web1.asp。
当点击该超链接时,sample6-04.asp 将变量 flag
的值作为参数发送给 sample6-05.asp,而后者则
根据该参数的值来做出判断,并依据不同情况
使用 Response.Redirect 再强行返回 sample6-
04.asp,并也将一个变量 say的值作为参数发送给
sample6-04.asp。 如此一来,sample6-04.asp又
会根据此参数来做出不同的反应。
6.4 Application和 Session对象
在 ASP的内建对象中除了用于发送, 接收
和处理数据的对象外, 还有一些非常实用和重
要的对象 。
在同一虚拟目录及其子目录下的所有,asp
文件构成了 ASP应用程序。使用 Application 对
象,可以在给定的应用程序的所有用户之间共
享信息,并在服务器运行期间持久的保存数据。
而且,Application对象还有控制访问应用层数
据的方法和可用于在应用程序启动和停止时触
发过程的事件。
6.4.1 Application 对象
1,属性
虽然 Application对象没有内置的属性, 但可以
使用以下句法设置用户定义的属性, 也可称为集
合 。
Application(" 属性 / 集合名称 ")= 值
使用如下脚本声明并建立 Application对象的属性 。
< %
Application("MyVar") = "Hello"
Set Application("MyObj") =
Server.CreateObject("MyComponent")
%>
一旦分配了 Application对象的属性,它就会持久
地存在,直到关闭 Web服务器服务使 Application
停止。由于存储在 Application对象中的数值可以
被应用程序的所有用户读取,所以 Application对
象的属性特别适合在应用程序的用户之间传递信
息。
2,方法
Application对象有两个方法, 它们都是用
于处理多个用户对存储在 Application中的数据进
行写入的问题 。
( 1) Lock 方法禁止其他客户修改 Application对
象的属性
Lock 方法阻止其他客户修改存储在 Application
对象中的变量, 以确保在同一时刻仅有一个客户
可修改和存取 Application变量 。 如果用户没有
明确调用 Unlock方法, 则服务器将在,asp文件结
束或超时后即解除对 Application对象的锁定 。
( 2) Unlock 方法允许其他客户修改 Application
对象的属性
在上面的例子中, 上述例子中, Unlock方法
解除对象的锁定, 使得下一个客户端能够增加
NumVisits的值 。
3,事件
( 1) Application_OnStart
Application_OnStart 事件在首次创建新的
会话 (即 Session_OnStart 事件 )之前发生 。 当
Web 服务器启动并允许对应用程序所包含的文件
进行请求时就触发 Application_OnStart 事件 。
Application_OnStart 事件的处理过程必须写在
Global.asa 文件之中 。
Application_OnStart 事件的语法如下,
< SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server>
Sub Application_OnStart…
End Sub
< /SCRIPT>
( 2) Application_OnEnd
Application_OnEnd 事件在应用程序退出时于
Session_OnEnd事件之后发生, Application_OnEnd 事件
的处理过程也必须写在 Global.asa 文件之中 。
使用 Application 对象时必须注意,
1) 不能在 Application 对象中存储 ASP内建对象 。 例如,
下面的每一行都返回一个错误 。
<%
Set Application("var1")=Session
Set Application("var2")=Request
Set Application("var3")=Response
Set Application("var4")=Server
Set Application("var5")=Application
Set Application("var6")=ObjectContext
%>
2) 若将一个数组存储在 Application对象中, 请
不要直接更改存储在数组中的元素 。 例如, 下列
的脚本无法运行 。
< % Application("StoredArray")(3) = "new
value" %>
这是因为 Application对象是作为集合被实现
的 。 数组元素 StoredArray(3)未获得新的赋值 。
而此值将包含在 Application对象集合中, 并将覆
盖此位置以前存储的任何信息 。 建议将数组存储
在 Application对象中时, 在检索或改变数组中的
对象前获取数组的一个副本 。 在对数组操作时,
应再将数组全部存储在 Application对象中, 这样
所做的任何改动将被存储下来 。 下面的程序即采
用了上述的方法 。
程序 sample6-07.asp
<%
dim MyArray()
Redim MyArray(5)
MyArray(0)="hello"
MyArray(1)="some other string"
Application.Lock
Application("StoredArray")=MyArray
Application.Unlock
Response.Redirect " sample6-08.asp "
%>
程序 sample6-08.asp
<%
LocalArray=Application("StoredArray")
LocalArray(1)=" there"
Response.Write LocalArray(0)&LocalArray(1)
Application.Lock
Application("StoredArray")=LocalArray
Application.Unlock
%>
6.4.2 Session对象
与 Application对象具有相近作用的另一个非常实
用的 ASP 内 建 对 象 就 是 Session。 可 以 使 用
Session 对象存储特定的用户会话所需的信息 。
当用户在应用程序的页之间跳转时, 存储在
Session对象中的变量不会清除, 而用户在
应用程序中访问页面时, 这些变量始终存在 。 当
用户请求来自应用程序的 Web页时, 如果该用户还
没有会话, 则 Web服务器将自动创建一个 Session
对象 。 当会话过期或被放弃后, 服务器将终止该
会话 。
通过向客户程序发送唯一的 Cookie可以管理
服务器上的 Session对象 。 当用户第一次请求 ASP
应用程序中的某个页面时, ASP要检查 HTTP头信息,
查看是否有在报文中有名为 ASPSESSIONID 的
Cookie发送过来, 如果有, 则服务器会启动新的
会话, 并为该会话生成一个全局唯一的值, 在把
这个值作为新 ASPSESSIONID Cookie的值发送给客
户端, 正是使用这种 Cookie,可以访问存储在服
务器上的属于客户程序的信息 。
Session对象最常见的作用就是存储用户的首
选项 。 例如, 如果用户指明不喜欢查看图形, 就
可以将该信息存储在 Session对象中 。 另外其还经
常被用在鉴别客户身份的程序中 。 要注意的是,
会话状态仅在支持 cookie的浏览器中保留, 如果
客户关闭了 Cookie选项, Session也就不能发挥作
用了 。
1,属性
( 1) SessionID属性
SessionID属性返回用户的会话标识 。 在创
建会话时, 服务器会为每一个会话生成一个单独
的标识 。 会话标识以长整形数据类型返回 。 在很
多情况下 SessionID可以用于 Web页面注册统计 。
( 2) TimeOut属性
Timeout属性以分钟为单位为该应用程序的
Session对象指定超时时限 。 如果用户在该超时时
限之内不刷新或请求网页, 则该会话将终止 。
2,方法
Session对象仅有一个方法, 就是 Abandon。
Abandon方法可以删除所有存储在 Session
对象中的对象并释放这些对象的源 。 如果未明确地调用
Abandon方法, 一旦会话超时, 服务器将删除这些对象 。
当服务器处理完当前页时, 释放会话状态 。 如,
< % Session.Abandon %>
3,事件
Session对象有两个事件可用于在 Session
对象启动和释放是运行过程。
( 1) Session_OnStart 事件在服务器创建新会
话时发生。服务器在执行请求的页之前先处理
该脚本。 Session_OnStart事件是设置会话期变
量的最佳时机,因为在访问任何页之前都会先
设置它们。
尽管在 Session_OnStart 事件包含
Redirect或 End方法调用的情况下 Session对象
仍会保持, 然而服务器将停止处理 Global.asa
文件并触发 Session_OnStart事件的文件中的脚
本 。
为了确保用户在打开某个特定的 Web页时始终
启动一个会话, 就可以在 Session_OnStart事件
中调用 Redirect方法 。 当用户进入应用程序时,
服 务 器 将 为 用 户 创 建 一 个 会 话 并 处 理
Session_OnStart事件脚本 。 可以将脚本包含在该
事件中以便检查用户打开的页是不是启动页, 如
果不是, 就指示用户调用 Response.Redirect方法
启动网页 。 如,
<SCRIPT RUNAT=Server Language=VBScript>
Sub Session_OnStart
startPage = "/MyApp/StartHere.asp"
currentPage = Request.ServerVariables("SCRIPT_NAME")
if strcomp(currentPage,startPage,1) then
Response.Redirect(startPage)
end if
End Sub
</SCRIPT>
上述程序只能在支持 cookie的浏览器中运行 。
因为不支持 cookie的浏览器不能返回 SessionID
cookie,所以, 每当用户请求 Web页时, 服务器都
会创建一个新会话 。 这样, 对于每个请求服务器
都将处理 Session_OnStart脚本并将用户重定向到
启动页中 。
( 2) Session_OnEnd事件在会话被放弃或超时发
生 。
使用 Session对象需要注意的事项与 Application
对象相近, 请参照前文 。
会话可以通过以下三种方式启动,
一个新用户请求访问一个 URL,该 URL标识了
某个应用程序中的,asp文件, 并且该应用程序的
Global.asa文件包含 Session_OnStart过程 。
用户在 Session对象中存储了一个值 。
用户请求了一个应用程序的,asp 文件, 并且
该应用程序的 Global.asa文件使用 < OBJECT>标签
创建带有会话作用域的对象的实例 。
如果用户在指定时间内没有请求或刷新应用
程序中的任何页,会话将自动结束。这段时间的
默认值是 20分钟。可以通过在, Internet服务管
理器, 中设置, 应用程序选项, 属性页中的, 会
话超时, 属性改变应用程序的默认超时限制设置。
应依据 Web应用程序的要求和服务器的内存空间来
设置此值。例如,如果希望浏览 Web 应用程序的
用户在每一页仅停留几分钟,就应该缩短会话的
默认超时值。过长的会话超时值将导致打开的会
话过多而耗尽服务器的内存资源。对于一个特定
的会话,如果想设置一个小于默认超时值的超时
值,可以设置 Session对象的 Timeout属性。例如,
<% Session.Timeout = 5 %>将超时值设置为 5分钟 。
当然也可以设置一个大于默认设置的超时值,
Session.Timeout属性决定超时值 。 还可以通过
Session对象的 Abandon方法显式结束一个会话 。
例如, 在表格中提供一个, 退出, 按钮, 将按钮
的 ACTION 参数设置为包含下列命令的,asp 文
件的 URL。 例如,
<% Session.Abandon %>
4,Session的工作原理
Session其实是利用 Cookie进行信息处理的
( 参见前面有关 Cookies的介绍 ) 。 当用户首先进
行了请求后, 服务端就在用户浏览器上创建了一
个 Cookie,当这个 Session结束时, 其实就是意味
着这个 Cookie就过期了 。 为这个用 户创建 的
Cookie的名称是 ASPSESSIONID。
这个 Cookie的唯一目的就是为每一个用户提
供不同的身份认证 。
如果对名字是 ASPSESSIONID的 COOKIE感到好
奇, 可 以 利 用 ServerVariables 集合的 COOKIE
Header来接受这个信息, 如下面这个脚本,
<%=Request.ServerVariables("HTTP COOKIE") %>
多次刷新屏幕,显示结果依然不变。
Session变量自己不会存在用户浏览器上 。 不
过, ASPSESSIONID这个 cookie需要使用 session变
量 。 服务器使用 ASPSESSIONID cookie来将特定的
用户和特定的 session信息联系起来 。 没有 cookie
的话, 服务器就不会了解到每一个特定用户在网
站中移动的信息 。
利用 SessionID 变量存储 ASPSESSIONID
cookie和直接对名为 ASPSESSIONID的 cookie赋值
有很大不同 。 微软利用了一个复杂的数学算法对
SessionID进行了加密措施, 以防止黑客猜测出
SessionID的值并且依据这个获得不该获得的身份
或权限 。
可以用两种方法屏蔽掉 SessionID,一种是将
全站进行屏蔽;另一种是对一个单独 ASP进行相应
屏蔽 。
如果想要将整个站点的 Session操作进行屏蔽,
可以使用, Internet 信息服务 → 默认站点属性 →
主目录 → 配置 → 应用程序选项 → 启用会话状况, 。
取消, 启用会话状况, 选项的选择 。
还可以在特定的 ASP程序的首行加入使之屏蔽
的语句来进行这种操作 。 如,
<% EnableSessionState=False %>
由于 Session对象使用了 Cookies,那么它的
兼容性就受到了限制, 例如有些浏览器提供了屏
蔽 Cookie的选项 。
由于 Cookie不能适用于所有浏览器,那么在
建站时必须注意,如果你的网站定位于大众通用,
就必须考虑各种不同的用户情况。
6.5 Global.asa文件的使用
在上一节中介绍了两个非常实用的 ASP 内
建对象 Application和 Session的使用方法。由于
这两者的 OnStart,OnEnd事件的脚本都必须在
Global.asa文件中声明,因此,本节将 详细介绍
Global.asa文件的使用方法。
Global.asa文件其实是一个可选文件,程序
编写者可以在该文件中指定事件脚本,并声明
具有会话和应用程序作用域的对象。该文件的
内容不是用来给用户显示的,而是用来存储事
件信息和由应用程序全局使用的对象。该文件
的名称必须是 Global.asa且必须存放在应用程序
的根目录中。每个应用程序只能有一个
Global.asa 文件。
在 Global.asa文件中, 如果包含的脚本没有用 <
SCRIPT>标记封装, 或定义的对象没有会话或应用
程序作用域, 则服务器将返回错误 。 可以用任何
支持脚本的语言编写 Global.asa 文件中包含的脚本 。
如果多个事件使用同一种脚本语言, 就可以将它
们组织在一组 < SCRIPT>标记中 。
在 Global.asa文件中声明的过程只能从一个或
多个与 Application_OnStart,Application_OnEnd、
Session_OnStart和 Session_OnEnd事件相关的脚本
中调用 。 在基于 ASP 的应用程序的 ASP页中, 它们
是不可用的 。 如果要在应用程序之间共享过程,
可在单独的文件中声明这些过程, 然后使用服务
器端包容 (SSI) 语句将该文件包含在调用该过程的
ASP程序中 。 通常, 包含文件的扩展名应为,inc。
下面是一个很标准的 Global.asa 文件,
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Application_OnStart
VisitorCountFilename=Server.MapPath ("/ex2") +
"\VisitCount.txt"
Set
FileObject=Server.CreateObject("Scripting.FileSystemObject")
Set
Out=FileObject.OpenTextFile(VisitorCountFilename,1,FALSE,
FALSE)
Application("visitors")=Out.ReadLine
Application("VisitorCountFilename")=VisitorCountFilename
End Sub
'=============================================
============
Sub Application_OnEnd
Set FileOutObject =
Server.CreateObject("Scripting.FileSystemObject")
Set Out= FileOutObject.CreateTextFile
(Application("VisitorCountFilename"),TRUE,FALSE)
Out.WriteLine(application("visitors"))
End Sub
'=============================================
============
Sub Session_OnStart
Session.Timeout = 5
Application("visitors") = Application("visitors") + 1
Session("ID")=Session.SessionID
End Sub
</SCRIPT>
在这个 Global.asa 程序中,涉及到了 ASP的 File
Access组件(有关 ASP组件方面的知识请查阅有关
资料),它可以提供用于访问文件系统的方法、
属性和集合。在这里,它起到了在服务器上创建
新文件并对文件进行写操作的作用。这其实是一
个 ASP页面访问记数器应用程序的 Global 文件,首
先当客户首次访问该应用程序的首页时,过程
Application_OnStart定义了在服务器上指定的虚拟
目录下新建一个 VisitCount.txt 的文本文件,并将文
件的路径和内容保存在应用程序级的变量中。而
当任何一个客户访问 ASP应用程序中的任何一个页
面时,过程 Session_OnStart 定义将应用程序级的变
量 visitors的值自动加一。这样,每当有客户访问页
面时,变量 visitors都将自动加一,以起到统计点击
率的作用。由于变量 visitors的值是存储在系统内存
之中,所以如果服务器关闭或重新启动,存储在变
量中的数据将自动丢失,所以通过定义过程
Application_OnEnd,在服务器关闭或重启之前将数
据写入事先建立的文本文件之中,这样就能确保当
服务器再次启动时,Application_OnStart过程可以
从 VisitCount.txt文件中读取以前的统计数。
6.6 ASP内建对象 Server
ASP的应用完全是基于 IIS之上的 。 IIS支持
虚拟目录, 通过在, 服务器属性, 对话框中的
,目录, 标签可以管理虚拟目录 。 建立虚拟目
录对于管理 Web站点具有非常重要的意义 。 首
先, 虚拟目录隐藏了有关站点目录结构的重要
信息 。 因为在浏览器中, 客户通过选择, 查看
源代码,, 很容易就能获取页面的文件路径信
息, 如果在 Web页中使用物理路径, 将暴露有
关站点目录的重要信息, 这容易导致系统受到
攻击 。 其次, 只要两台机器具有相同的虚拟目
录, 就可以在不对页面代码做任何改动的情况
下, 将 Web页面从一台机器上移到另一台机器 。
最后, 将 Web页面放置于虚拟目录下后, 管理
员可以对
目录设置不同的属性, 如,Read( 读 ), Excute
( 执行 ), Script( 脚本 ) 。 读访问表示将目录
内容从 IIS传递到浏览器 。 而执行访问则可以使在
该目录内执行可执行的文件 。 当需要使用 ASP时,
就必须将存放,asp文件的目录设置为, Excute”。
在此建议设置 Web站点时, 将 HTML文件同 ASP文件
分开放置在不同的目录下, 然后将 HTML子目录设
置为, 读,, 将 ASP子目录设置为, 执行,, 这不
仅方便了对 Web的管理, 而且最重要是的提高了
ASP程序的安全性, 防止程序内容被客户所访问 。
Server 对象提供对服务器上的方法和属性的
访问,其中大多数方法和属性是作为实用程序的
功能服务的。有了 Server对象,就可以在服务器
上启动 ActiveX对象例程,并使用 Active Server
服务提供象 HTML和 URL编码这样的函数。 语法,
Server.property|method
6.6.1 属性
ScriptTimeout 超时值, 表示在脚本运行超
过这一时间之后即作超时处理 。 下面的代码指定
服务器处理脚本在 100 秒后超时 。
<% Server.ScriptTimeout=100 %>
这里需要注意的是,通过使用元数据库中的
AspScriptTimeout属性可以为 Web服务或 Web 服
务器设置缺省的 ScriptTimeout值。
ScriptTimeout属性不能设置为小于在元数据库中
指定的值。例如,如果 NumSeconds设置为 60,而
元数据库设置包含了默认值 90秒,则脚本在 90秒
后超时。
6.6.2 方法
1,HTMLEncode方法
HTMLEncode方法允许对特定的字符串进行
HTML编码 。 虽然 HTML可以显示大部分写入 ASP文件
中的文本, 但是当需要实际包含 HTML标记中所使
用的字符, 就会遇到问题 。 这是因为, 当浏览器
读到这样的字符串时, 会试图进行解释 。 例如下
面的这段文本,
这是对 HTMLEncode 方法的测试 。 < br>
这里应该不会另起一行 。
会被浏览器显示为,
这是对 HTMLEncode 方法的测试 。
这里应该不会另起一行 。
为了避免此类问题, 需要使用 Server对象的
HTMLEncode方法, 采用对应的不由浏览器解释的
HTML Character Code替代 HTML标记字符 。 所以,
用下面的代码才能显示正确的 HTMLEncode字符串,
从而在浏览器中按需要输出文本 。
<%
Response.write Server.HTMLEncode(" 这 是 对
HTMLEncode 方法的测试 。 <br> 这应该不会另起
一行 。 ")
%>
2,URLEncode方法
就像 HTMLEncode方法使客户可以将字符串翻
译成可接受的 HTML格式一样, Server 对象的
URLEncode方法可以根据 URL规则对字符串进
行正确编码, 当字符串数据以 URL 的形式传递到
服务器时, 在字符串中不允许出现空格, 也不允
许出现特殊字符 。 为此, 如果希望在发送字符串
之前进行 URL编码, 可以使用 Server.URLEncode方
法 。
3,MapPath方法
MapPath方法将指定的相对或虚拟路径映射到
服务器上相应的物理目录上 。
语法,
Server.MapPath(Path)
这里的 Path指定要映射物理目录的相对或虚
拟路径。若 Path以一个正斜杠( /)或反斜杠( \)
开始,则 MapPath 方法返回路径时将 Path 视为
完整的虚拟路径。若 Path不是以斜杠开始,则
MapPath方法返回同,asp文件中已有路径相对的路
径。这里需要注意的是 MapPath方法不检查返回
的路径是否正确或在服务器上是否存在。
对于下列示例, 文件 data.txt和包含下列脚本
的 test.asp文件都位于目录 C:\Inetpub\wwwroot\asp
( C:\Inetpub\wwwroot目录为服务器的宿主目录 )
下 。 示例中使用服务器变量 PATH_INFO映射当前
文件的物理路径 。 脚本
< % =
server.mappath(Request.ServerVariables("PATH_INFO"))%>
输出,
c:\inetpub\wwwroot\asp\test.asp
由于下列示例中的路径参数不是以斜杠字符开始
的, 所以它们被相对映射到当前目录, 此处是目
录 C:\Inetpub\wwwroot\asp。 脚本,
< %= server.mappath("data.txt")%>
< %= server.mappath("asp/data.txt")%>
输出,
c:\inetpub\wwwroot\asp\data.txt
c:\inetpub\wwwroot\asp\asp\data.txt
4,CreateObject方法
Server.CreateObject是 ASP 中最为实用,
也是最强劲的功能 。 它用于创建已经注册到服务
器上的 ActiveX 组件实例 。 这是一个非常重要的
特性, 因为通过使用 ActiveX 组件能够轻松地扩
展 ActiveX 的能力, 使用 ActiveX 组件, 可以
实现至关重要的功能, 譬如数据库连接, 文件访
问, 广告显示和其它 VBScript 不能提供或不能
简单地依靠单独使用 ActiveX 所能完成的功能 。
语法,
Server.CreateObject("Component Name")
默认情况下,由 Server.CreateObject 方法
创建的对象具有页作用域。这就是说,在当前
ASP 页处理完成之后,服务器将自动破坏这些对
象。如果要创建有会话或应用程序作用域的对象,
可以使用 < OBJECT> 标记并设置 Session或
Application的 Scope属性,也可以在对话及应用
程序变量中存储该对象。如,
<%
Set Session("ad") = Server.CreateObject("MSWC.AdRotator")%>
这里需要注意的是,不能创建与内建对象同
名的对象实例,否则,将返回错误。
本 章 小 结
本章详细介绍了在表单的使用及 ASP的 5个常
用而重要的内建对象的语法, 属性, 方法和事件 。
学完本章, 读者应该能够自行编写出一定水平的
ASP程序 。
习 题
1,在 Form数据传送中 Get与 Post方法的区别 。
2,如何利用 Query字段传递多个参数 。
3,Session的工作原理 。
4,论述 Global.asa的作用 。
5.利用所学知识,编写一个简单的 ASP Web 聊天
室程序。
本章要点,
?HTML中使用表单
?Request 对象
?Response 对象
?ASP内建对象 Server
?Global.asa文件的作用
在面向对象编程中, 对象就是指由当作
完整实体的操作和数据组成的变量, 是基于
特定模型的 。 在对象中客户使用对象的服务,
通过由一组方法或相关函数的接口访问对象
的数据, 然后客户端调用这些方法执行某种
操作 。
ASP提供了可在脚本中使用的内建对象 。
通过这些对象, 用户更容易收集通过浏览器
请求发送的信息, 响应浏览器以及存储用户
信息,从而使对象开发者摆脱很多烦琐的工
作 。
6.1 在 HTML中使用表单
表单在 HTML页面中起着重要作用,它是与用
户交互信息的主要手段。一个表单至少应该包括
说明性文字、用户填写的表格、提交和重填按钮
等内容。用户填写了所需的资料之后,按下, 提
交, 按钮,所填资料就会通专门的 CGI接口传到
Web服务器上。网页的设计者随后就能在 Web服务
器上看到用户填写的资料,从而完成了从用户到
作者之间的反馈和交流。
表单中主要包括下列元素,
button——普通按钮
radio ——单选按钮
checkbox——复选框
Select ——下拉式菜单
text ——单行文本框
textarea——多行文本框
submit——提交按钮
reset—— 重填按钮
用 HTML设计表单常用的标记是,<form>,<input>、
<option>,<select>,<textarea>和 <isindex>等
标记。
6.1.1 表单标记 <form>
<form>标记的主要作用是设定表单的起止位
置, 并指定处理表单数据程序的 url地址 。 基本语
法如下,
<form
action= url
method=get|post
name= value
onreset=function
onsubmit= function
target=window>
</form>
其中,
action,用于设定处理表单数据程序 url的地
址, 这样的程序通常是 CGI应用程序, 例如采用
电子邮件方式时,用 action=“mailto:你的邮件地
址, 。
method,指定数据传送到服务器的方式, 有
两种主要的方式, 当 method=get时, 将输入数据
加在 action指定的地址后面传送到服务器;当
method=post时, 则将输入数据按照 HTTP传输协议
中的 post传输方式传送到服务器, 用电子邮件接
收用户信息采用这种方式 。
name,用于设定表单的名称 。
onreset和 onsubmit,主要针对, reset”按钮
和, submit”按钮来说的, 分别设定了在按下相应
的按钮之后要执行的子程序 。
target,指定输入数据结果显示在那个窗口,
这需要与 <frame>标记配合使用。
6.1.2 表单输入标记 <input>
此标记在表单中使用频繁, 大部分表单内容需要
用到此标记 。 语法如下,
<input
aligh=left|righ|top|middle|bottom
name=value
type=text|textarea|password|checkbox|radio|
submit|reset|file|hidden|image|button
value=value
src=url
checked
maxlength=n
size=n
onclick=function
onselect=function>
其中,
align,用于设定表单的位置是靠左 ( left), 靠
右 ( right), 居中 ( middle), 靠
上 (top),还是靠底( bottom)。
name,设定当前变量名称 。
type,决定了输入数据的类型 。 其选项较多, 各
项的意义是,
text,表示输入单行文本;
textarea,表示输入多行文本;
password:表示输入数据为密码, 用星号表示;
checkbox,表示复选框;
radio,表示单选框;
submit,表示提交按钮, 数据将被送到服务器;
reset,表示清除表单数据, 以便重新输入;
file,表示插入一个文件;
hidden,表示隐藏按钮;
image,表示插入一个图像;
button,表示普通按钮;
value,用于设定输入默认值, 即如果用户不输入
的话, 就采用此默认值;
src,是针对 type=image的情况来说的, 设定图像
文件的地址;
checked,表示选择框中, 此项被默认选中;
maxlength,表示在输入单行文本的时候, 最大输
入字符个数;
size,用于设定在输入多行文本时的最大输入字
符数, 采用 width,height方式;
onclick,表示在按下输入时调用指定的子程序;
onselect,表示当前项被选择时调用指定的子程
序。
6.1.3 下拉菜单标记 <select>
用 <select>标记可以在表间中插入一个下拉菜单,
它需与 <option>标记联用, 因为下拉菜单中的每
个选项要用 <option>标记来定义 。 <select>标记
的语法如下,
<select
name=nametext
size=n
multiple>
其中,
name,设定下拉式菜单的名称;
size,设定菜单框的高度, 也就是一次显示几个
菜单项, 一般取默认值 ( size="1") ;
multiple,设定为可以进行多选。
6.1.4 选项标记 < option>
该标记为下拉菜单中一个选项, 语法很简单:
<option selected value=value>
其中,
selected,表示当前项被默认选中;
value,表示该项对应的值, 在该项被中之后, 该
项的值就会被送到服务器进行处理 。
6.1.5 多行文本输入标记 <textarea>
这是一个建立多行文本输入框的专用标记, 其语
法如下,
<textarea
name=name
cols=n
rows=n
wrap=off|hard|soft>
其中,
name,文本框名称;
cols,宽度;
rows,高度 ( 行数 ) ;
wrap,换行控制;
off,不自动换行;
hard,自动硬回车换行, 换行标记一同被传送到
服务器中去;
soft,自动软回车换行, 换行标记不会传送到服
务器中去 。
表单所涉及的标记较多, 参数也较复杂, 而在实
际制作表单时就是这些标记的组合应用 。 一般的
表单不可能涉及所有参数, 选择参数时尽量用默
认值, 不设定一个不用的参数 。
6.2 Request 对象
Request 对象是 ASP编程中使用最频繁的对象
之一 。 可以使用 Request 对象访问任何基于
HTTP 请求传递的所有信息, 包括从 HTML 表格用
POST方法或 GET方法传递的参数, cookie 和用户
认证等 。 通过 Request 对象能够访问客户端发送
给服务器的二进制数据 。
Request 的语法,
Request[.集合 | 属性 | 方法 ]( 变量 )
其中, 集合可以被指定为 Form或者 QueryString。
变量即提交页面中使用的 Form对象的变量名 。
6.2.1 Form集合
Form集合通过使用 POST 方法的表格检索发
送到 HTTP 请求正文中的表格元素的值 。
语法,
Request.Form(element)[(index)|.Count]
其中,
element 指定集合要检索的表格元素的名称 。
index 可选参数, 使用该参数可以访问某参数中
多个值中的一个 。 它可以是 1 到
Request.Form(parameter).Count 之间的任意整
数 。
Count 集合中元素的个数。
图 6-2 调查表
Form,集合按请求正文中参数的名称来索引,
Request.Form(element) 的值是请求正文中所有
element 值的数组。通过调用
Request.Form(element).Count 来确定参数中值
的个数。如果参数未关联多个值,则计数为 1。
如果找不到参数,计数为 0。要引用有多个值的
表格元素中的单个值,必须指定 index值。 index
参数可以是从 1到 Request.Form(element).Count
中的任意数字。如果引用多个表格参数中的一个,
而未指定 index值,返回的数据将是以逗号分隔的
字符串。
对于图 6-2调查表中的多个, 爱好, 参数, 可以使
用程序 6.2来检索这些值 。
程序 6.2 sample6-02.asp
<html>
<head><title></title></head>
<body>
<p>请填写你的爱好
</p>
<form method="POST" action="form.asp">
<p>
<input type="text" name="hobby" size="20"><br>
<input type="checkbox" name="hobby" value=" 足球
"> 足球
<input type="checkbox" name="hobby" value=" 乒
乓球 "> 乒乓球
</p>
<p>
<input type="submit" value=" 发送 " name="B1">
<input type="reset" value=" 重填 " name="B2">
</p>
</form>
<%
For Each i In Request.Form("hobby")
Response.Write i & "<BR>"
Next
%>
</body>
</html>
当然使用 For...Next 循环也可以生成同样的输出,
如下所示,
< %
For i = 1 To Request.Form("hobby").Count
Response.Write Request.Form("hobby")(i) & "<
BR>"Next
%>
6.2.2 QueryString集合
QueryString集合用来检索 HTTP 查询字符串中变
量的值, HTTP查询字符串由问号 (?) 后的值指定 。
如,
< a href= "example.asp?string=this is a
sample">string sample</a>
生成值为 "this is a sample" 的变量名字符串 。
通过发送表格或由用户在其浏览器的地址框中键
入查询也可以生成查询字符串 。
语法,
Request.QueryString(variable)[(index)|.Coun
t]
QueryString集合可以用名称来检索 QUERY_STRING
变量 。 Request.QueryString(参数 ) 的值是出现
在 QUERY_STRING中所有参数的值的数组 。 通过调
用 Request.QueryString(para
meter).Count 可以确定参数有多少个值 。
也可以使用 QueryString来达到与前一个范例相同
的功能。只需要将 request.form 部分
替换如下,
< %
For Each i In Request.querystring("hobby")
Response.Write i & "< BR>"
Next
%>
6.2.3 Cookies
1,什么是 Cookies?
Cookie其实就是一个标签。在访问一个需要
唯一标识你的地址的 Web站点时,它会在你的硬盘
上留下一个标记,下一次再次访问这个站点时,
站点的页面就会查找这个标记。每个 Web站点都有
自己的标记,标记的内容可以随时读取,但只能
由该站点的页面完成。每个站点的 Cookie与其它
所有站点的 Cookie存在同一文件夹中的不同文件
内( Windows 2000系统下,可以在 C:\Documents
and Settings\Administrator\Cookies的目录下
找到它们)。
一个 Cookie 就是一个唯一标识客户的标记,
Cookie可以包含在一个对话期或几个对话期之间
某个 Web站点的所有页面共享的信息, 使用 Cookie
还可以在页面之间交换信息 。 Request提供的
Cookies集合允许用户检索在 HTTP请求中发送的
cookie的值 。 这项功能经常被使用在要求认证客
户密码以及电子公告板, Web聊天室等 ASP程序中 。
语法,
Request.Cookies(cookie)[(key)|.attribute]
其中,cookie指定要检索其值的 cookie。 key是可
选参数, 用于从 cookie字典中检索子关键字的值 。
attribute指定 cookie自身的有关 信息 。 如:
HasKeys只读, 指定 cookie是否包含关键字 。 可以
通过包含一个 key值来访问 cookie字典的子
关键字 。 如果访问 cookie字典时未指定 key,则所
有关键字都会作为单个查询字符串返回 。 例如,
如果 MyCookie有两个关键字,First和 Second,
而在调用 Request.Cookies时并未指定其中任何一
个关键字, 那么将返回下列字符串 。
First=firstkeyvalue&Second=secondkeyvalue
如果客户端浏览器发送了两个同名的 cookie,
那么 Request.Cookie将返回其中路径结构较深的
一个。例如,如果有两个同名的的 cookie,但其
中一个的路径属性为 /www/而另一个为 /www/home/,
客户端浏览器同时将两个 cookie都发送到
/www/home/目录中,那么 Request.Cookie将只返
回第二个 cookie。
要确定某个 cookie是不是 cookie字典 ( cookie有否有
关键字 ), 可使用下列脚本 。
< %= Request.Cookies("myCookie").HasKeys %>
如果 myCookie是一个 cookie 字典, 则前面的赋值为
TRUE。 否则为 FALSE。 下面看一个 cookie的应用实例 。
程序 6.3 sample6-03.asp
<%
nickname=request.form("nick")
response.cookies("nick")=nickname
'用 response 对象将用户名写入 Cookie 之中
response.write " 欢迎 "&request.cookies("nick")&" 光临小站 !
"
%>
<html><head><meta http-equiv="Content-Type"
content="text/html; charset=gb2312">
<title>cookie</title>
<meta name="GENERATOR" content="Microsoft
FrontPage 3.0"></head>
<body>
<form method="POST" action="cookie.asp">
<p><input type="text" name="nick" size="20">
<input type="submit" value=" 发送 " name="B1"><input
type="reset"
value=" 重填 " name="B2"></p></form>
</body></html>
这其实是一个在基于 Web的 BBS或 CHAT的 ASP程序中
常用的手法, 它将用户在起始页面上所填入的
姓名保存在 cookie 中, 这样后面的程序就可以很
容易地调用该用户的 nick了 。
2,Cookie的工作原理
Cookies将通过 HTTP Headers来从服务端返
回到浏览器上 。 服务端首先在响应中利用 Set-
Cookie header来创建一个 Cookie,浏览器后面的
请求的 cookie header中就会返回这个 Cookie来完
成浏览器的认证 。
假设创建了一个名字为 UserName的 Cookie来
包含访问者的信息, 创建 Cookie时, Server的
Header就象下面 ( 假设访问者为 Bill Gates),
Set-Cookie,
UserName=BILL+Gates;path=/;domain=aspsite.c
om;
expires=Tuesday,01-Jan-99 00:00:01 GMT
这个 Header就在浏览器的电脑上的 Cookie文
件中添加了一条记录 。 浏览器将名字为 UserName
的 Cookie赋值为 Bill Gates。 请注意这个 cookie
的值是进行了 URL-encoded操作的 。
浏览器创建了一个 Cookie后, 在每一个针对
该网站的请求时都会在 Header中带着这个 Cookie,
也就是每一次满足该路径的情况下这个 Cookie都
会有效 。 不过, 对于其它网站的请求 Cookie是绝
对不会跟着发送的 。 浏览器会这样一直发送到
Cookie过期为止 。 Cookie Header如下,
cookie,username,Bill+Gates
3,在 ASP中创建和读取 Cookies
当利用 ASP创建了一个 cookie之后, 就可以使用
Response对象的 Cookie集合了 。 可以创建两种
cookie,一种 是 单 值的 ; 另 一种 可 以 认为 是
cookie字典类型, 即允许多个键值对的存在 。
创建单值的相对简单, 如下脚本,
<%
Response.Cookies("Username")="Bill Gates"
Response.Cookies("Username").Expires="Jan
1,1999"
%>
显然, 这个脚本将名字为 Username的 Cookie
赋值为 Bill Gates,同时将过期时间限定为 1999
年 1月 1日 。
这里面需要说明的是, Expires属性如果不进行赋
值, 那么默认的就是用户一离开网站就过期 。
由于这个例子脚本创建的是 Header的部分,
那么就必须在 ASP的任何输出语句之前进行这个脚
本的操作, 或者使用 Buffer输出 。
前面的脚本是创建一个 Cookie的简单示例,
只是使用了最常用的 Expires属性, 其实还有许多
其他属性也可以自行设置, 下面是一个比较完全
的例子,
<%
Response.Cookies("Username")="Steve Jobs"
Response.Cookies("Username").Expires="Jan 1,1999"
Response.Cookies("Username").Path="/examples"
Response.Cookies("Username").Domain="aspsite.com"
Response.Cookies("Username").Secure=True
%>
这个脚本例子和前面的其实没有什么区别,
不过有三个附加的属性需要解释,
? Path属性是用来更加严格的限定浏览器发送
Cookie,在这个例子中,只有针对于 /examples目
录的请求的 Header中才携带 Cookie信息,例如
/examples/hello.asp以及
/examples/chapter16/hello.asp的请求都会在 Header
上携带 Cookie信息,但是如果是浏览器对 /hello.asp
的请求就不会携带该 Cookie信息。 Path属性的默认
值是该 Cookie创建的 ASP所在的路径。(也就是说,
即便不做指定,也不会跨过目 录发送 Cookie)
? Domain属性,限定了 Cookie发送的网站,例子
中的 aspsite.com说明 cookie可以被发送到
www.aspsite.com或者 beetle.aspsite.com或者
yeah.aspsite.com等等,同样作为默认值是该
Cookie创建的网站。
? 最后是 Secure属性,当该属性设为 True时,则
传递中就实行了加密算法,如果你正在使用安全
接口层,那么就可以使用这个属性。
在一个 ASP 中读取 cookie,只 需 要 使 用
Request对象的 Cookies集合 。 例如, 输出一个
cookie值, 那么脚本如下,
<%=Request.Cookies("Username") %>
这个脚本将名字为 Username的 Cookie值进行了
输出,和以前同样的是,依然可以利用 For Each
循环或者利用 Count属性和 For… Next循环结合的
方式来将 Cookie集合 的所有
属性值显示出来, 下面这个例子的运行结果应当
无须解释了 。
<%
For EACH thing IN Request.Cookies
Response.write("<BR>"&thing&Request.Cookies(thin
g))
NEXT
%>
4,创建多个 Cookie
要创建多个 Cookie,只需在 Response对象的
Cookies集合中简单的定义多个名称就可以 。 不过,
许多浏览器对一个指定网站就限定了三到四个
Cookie。
创建多个 Cookie还有一种选择, 就是创建一个
Cookie字典, 那么一个 Cookie字典中就可以含有多
个键值对, 下面是这么一个字典的例子,
<%
Response.Cookies("User")("Name")="Bill Gates"
Response.Cookies("User")( "Password")= "billions"
%>
这个脚本创建了一个名为 User的 Cookie字典,
其中含有两个键分别是 Name和 Password,当这个
Cookie字典创建时, 请求的 Header中是这样的信息:
Set-
Cookie:User=Name=Bill+Gates&Password=billions
上面的语句创建了一个名字为 User的 Cookie,它含
有两个键值对, 这意味着所有的键和相应的值都
在一个大的 Cookie中 。
接受这样的 Cookie值,还可以利用以前的
Response对象的 Cookies集合,既可以将其全部显
示,(这样显示就是没有经过解码的 Header中的源
代码,也就是上面 Header中的信息,这样一般都是
用于调试工作)也可以按每一个键的相应名称显
示相应值,如下例,
<%=Request.Cookies("User") %>
<%=Request.Cookies("User")("Name")%>
<%=Request.Cookies("User")( "Name")%>
利用 Cookie技术传递诸如密码这样的信息要特
别小心, 因为一般说来, 这种信息是未经加密的,
当然, 如果网站有安全接口层技术, 也可以进行
加密传输, 但是在浏览器端该信息还是存放在文
本文件中 。
如果希望知道一个 Cookie是否是一个 Cookie字
典, 可以用 HasKeys属性, 例如下面脚本如果返回
值为 True,那么就是一个 Cookie字典 。
<%=Request.Cookies("User").HasKeys %>
5,不利用 Cookie来保持信息
前面已经介绍过 QueryString字段的使用及接收,
以及 Form的接收 。 这两种手段也可以进行一些信
息保存, 最后对这三种方案进行综合比较 。
( 1) 利用 QueryString来保持信息
由于可以在连接中添加任何 QueryString字段, 那么,
只要在网站的所有连接中添加一个保存用户某种
信息的字段, 再在各个程序上进行相应处理, 就
可以进行模拟跟踪, 如下例,
<HTML>
<HEAD><TITLE>Query字段进行信息保留
</TITLE></HEAD>
<BODY>
<%
Username=Server.URLEncode("Bill Gates")
%>
<A Href="/nextpage.asp?<%=UserName%>">点击这里 </a>
</BODY>
</HTML>
这个脚本将 Bill Gates赋值给 Username的变量, 然后将它通
过 QueryString传递给 nextpage.asp,那么在 nextpage.asp中就
可以接受, 然后继续进行这个参数的传递 。 例如:下面就
是 nextpage.asp的一个示例,
<HTML>
<HEAD><TITLE>Next Page</TITLE></HEAD>
<BODY>
<%
Username=Server.URLEncode("Request.QueryString("Userna
me"))
%>
<A HREF="/thirdpage.asp?<%=Username%>">点击这里 </a>
</body>
</html>
这个脚本的优点是适用于所有浏览器,但是
用这样的传递来保存信息实在太麻烦了,所有的
连接都要考虑到,每一个 ASP都必须相应处理一下,
而且用户很可能, 一不小心, 就溜出了这种跟踪
之外。另外,修改起来也过于麻烦。
另一个缺点是针对不同的浏览器必须考虑长
度限制,同时安全性没有保证。
( 2) 利用 Form的 hidden类型进行信息传递
如果确实需要传递大量信息而又不想选用 Session
变量,那么只有利用 Form的 Hidden类型。如下例,
<HTML>
<HEAD><TITLE>Form传参示例 </TITLE></HEAD>
<BODY>
<%
Username="Bill Gates"
%>
<FORM METHOD="Post" Action="/nextpage.asp">
<INPUT Name="Username" TYPE="HIDDEN"
VALUE="<%=Username%>">
<input type="submit" name="下一页 ">
</Form>
</Body>
</HTML>
这个页面包括一个表单, 其中有一个隐含类
型名字为 Username,同时赋予 Username变量的值 。
表单上有一个 Submit按钮, 当按钮点击后, 在
hiden类型中存放的 Username的值将传递到下一个
网页上, 在下一个网页进行处理, 然后以同样方
式传递到另外一个新的主页上, 下面是
nextpage.asp的例子,
<HTML>
<HEAD><TITLE>下一页 </TITLE></HEAD> <BODY>
<%
Username=Request.Form("Username")
%>
<FORM METHOD="Post" Action="/thirdpage.asp">
<input name="Username" Type="hidden"
Value="<%=Username%>">
<input type=submit value="再下一页 ">
</Form>
</Body>
</Html>
( 3) 两种方法的结合
这两种方法实现起来都十分麻烦, 但是, 如
果偏要不用 Cookies和 Session变量来传递信息,
确实也别无良策 。 同时, 这两种方法确实可以适
用于任何浏览器 。
请注意, 如果在任意一页中没有进行这种
QueryString字段或者 hidden类型的表单的处理,
那么这种跟踪就停止了 。
一个明显的缺点是不管利用 QueryString字
段还是利用 Hidden Form传递信息, 安全性都是
毫无保证的, 这是由于浏览器对信息的接受是在
几乎毫无屏障的情况下进行的 。
完全可以将这两种方法结合起来,而在接受
时可以没有任何区别。这里面补充的是,对于
Response对象,可以不指定 Form集合和
QueryString集合来进行接受,这时系统会自动
辨认。见下面这个例子,
<HTML>
<HEAD><TITLE>下一页 </TITLE></HEAD>
<BODY>
<%
Username=Request("Username")
%>
<!---注:就是上面这个脚本, QueryString和 hidden的 Form
都可以正确接收 --->
<Form Method="Post" Action="/nextpage.asp">
<input name="Username" Type="Hidden"
Value="<%=Username%>">
<input type=Submit value="下一页 ">
</FORM>
<a href=/nextpage.asp?<%=ServerURLEncode(Username)%>
点击这里 </a>
</BODY>
</HTML>
在这个例子中,变量 Username被赋值而无须知道
上一页是利用的 Hidden form域 还是 QueryString
来传递参数。在以后编制 ASP时,这种
Request("Username")形式的简易调用将十分常用。
6.2.4 ServerVariables
在浏览器中浏览网页的时候使用的传输协议
是 HTTP,在 HTTP的标题文件中会记录一些客户端
的信息, 如:客户的 IP地址等等 。 有时服务器端
需要根据不同的客户端信息做出不同的反应, 这
时候就需要用 ServerVariables 集合获取所需信
息 。
语法,Request.ServerVariables ( 服务器环境
变量 )
由于服务器环境变量较多,表 5-1中仅列出了一些常用的变量。
ALL_HTTP
客户端发送的所有 HTTP标题文件。
CONTENT_LEN
GTH
客户端发出内容的长度。
CONTENT_T
YPE
内容的数据类型。如:, text/html”。 同附加信息
的查询一起使用,如 HTTP查询 GET,POST和
PUT。
LOCAL_ADD
R
返回接受请求的服务器地址。如果在绑定多个 IP
地址的多宿主机器上查找请求所使用的地址时,
这条变量非常重要。
LOGON_USER 用户登录 Windows NT的帐号。
QUERY_STRING
查询 HTTP请求中问号(?)后的信息。
REMOTE_ADDR
发出请求的远程主机 (client) 的 IP地址。
REMOTE_HOST
发出请求的主机 (client) 名称。如果服务器无此信
息,它将设置为空的 REMOTE_ADDR 变量。
REQUEST_MET
HOD
该方法用于提出请求。相当于用于 HTTP的
GET,HEAD,POST等等。
SERVER_NAME
出现在自引用 URL中的服务器主机名,DNS
或 IP地址。
SERVER_PORT
发送请求的端口号。
表 5-1 服务器环境变量
可以使用以下脚本打印出所有的服务器环境变量 。
<TABLE>
<TR><TD><B>Server
Variable</B></TD><TD><B>Value</B></TD></TR>
<% For Each name In Request.ServerVariables %>
<TR><TD>
<%= name %>
</TD>
<TD><%=Request.ServerVariables(name)%><%
Next%></TD>
</TR>
</TABLE>
一个非常有用的实例是,可以利用 ServerVariables,
如 REMOTE_ADDR来规定来自哪些 IP地址的客户机可
以访问你的系统,以保护你的页面不被某些用户
浏览。这段代码留给读者完成。
6.3 Response对象
Request 是获取客户端 HTTP 信息, 相反
Response对象用来控制发送给用户的信息, 包括
直接发送信息给浏览器, 重定向浏览器到另一个
URL或设置 cookie的值 。
语法,
Response.collection|property|method
6.3.1 属性
( 1) Buffer
Buffer 属性指示是否缓冲页输出 。 当缓冲页
输出时, 只有当前页的所有服务器脚本处理完毕
或者调用了 Flush 或 End 方法后, 服务器才将
响应发送给客户端浏览器, 服务器将输出发送给
客户端浏览器后就不能再设置 Buffer 属性 。 因
此应该在, asp 文 件 的 第 一 行 调 用
Response.Buffer。
( 2) Charset
Charset 属 性 将 字 符 集 名 称 附 加 到
Response 对象中 content-type标题的后面 。 对于
不包含 Response.Charset 属性的 ASP 页,
content-type 标 题 将 为, content-
type:text/html。
可以在,asp文件中指定 content-type标题,
如,<% Response.Charset="gb2312") %>
将产生以下结果,
content-type:text/html; charset=gb2312
注意,无论字符串表示的字符集是否有效,
该功能都会将其插入 content-type 标题中。且如
果某个页包含多个含有 Response.Charset的标记,
则每个 Response.Charset都将替代前一个
CharsetName。 这样,字符集将被设置为该页中
Response.Charset的最后一个实例所指定值。
( 3) ContentType
ContentType属性指定服务器响应的 HTTP内容类型 。
如果未指定 ContentType,默认为 text/html。
( 4) Expires
Expires属性指定了在浏览器上缓冲存储的页距
过期还有多少时间 。 如果用户在某个页过期之前
又回到此页, 就会显示缓冲区中的页面 。 如果设
置 response.expires=0,则可使缓存的页面立即
过期 。 这是一个较实用的属性, 当客户通过 ASP的
登陆页面进入 Web站点后, 应该利用该属性使登陆
页面立即过期, 以确保安全 。
( 5) ExpiresAbsolute
与 Expires属性不同 ExpiresAbsolute属性指
定缓存于浏览器中的页面的确切到期日期和时间 。
在未到期之前, 若用户返回到该页, 该缓存中的
页面就显示 。 如果未指定时间, 该主页在当天午
夜到期 。 如果未指定日期, 则该主页在脚本运行
当天的指定时间到期 。 如下示例指定页面在 1998
年 12月 10日上午 9:00分 30秒到期 。
< % Response.ExpiresAbsolute=#Dec 12,1998
9:00:30# %>
6.3.2 方法
( 1) Clear方法
可以用 Clear方法清除缓冲区中的所有 HTML输
出 。 但 Clear方法只清除响应正文而不清除响应标
题 。 可以用该方法处理错误情况 。 但是如果没有
将 Response.Buffer设置为 TRUE,则该方法将导
致运行时错误 。
( 2) End方法
End方法使 Web服务器停止处理脚本并返回当前结
果。文件中剩余的内容将不被处理。
如果 Response.Buffer已设置为 TRUE,则调用
Response.End将缓冲输出 。
( 3) Flush方法
Flush 方法立即发送缓冲区中的输出 。 如果
没有将 Response.Buffer设置为 TRUE,则该方法将
导致运行时错误 。
( 4) Redirect方法
Redirect方法使浏览器立即重定向到程序指定
的 URL。 这也是一个经常用到的方法, 利用此方法,
程序员可以根据客户的不同响应, 为不同的客户
指定不同的页面或根据不同的情况指定不同的页
面 。 一旦使用了 Redirect 方法, 任何在页中显
式设置的响应正文内容都将被忽略 。 然而, 此方
法不向客户端发送该页设置的其它 HTTP 标题,
将产生一个将重定向 URL 作为链接包含的自动
响应正文 。 Redirect 方法发送下列显式标题, 其
中 URL 是传递给该方法的值 。 如,
<% Response.redirect("www.edu.cn") %>
( 5) Write方法
Write方法是平时最常用的方法之一,它是将
指定的字符串写到当前的 HTTP输出。
6.3.3 集合
Response 对象只有一个集合 ——Cookie。
Cookies 集合设置 cookie的值 。 若指定的 cookie
不存在, 则创建它 。 若存在, 则设置新的值并且
将旧值删去 。
语法,
Response.Cookies(cookie)[(key)|.attribute]=
value
这里的 cookie是指定 cookie的名称 。 而如果
指定了 key,则该 cookie 就是一个字典 。
attribute 指定 cookie 自 身 的 有 关 信 息 。
attribute 参数可以是下列之一,
Domain若被指定, 则 cookie将被发送到对该域的
请求中去 。
Expires指定 cookie的过期日期 。 为了在会话结束
后将 cookie存储在客户端磁盘上, 必须设置该
日期 。 若此项属性的设置未超过当前日期, 则在
任务结束后 cookie将到期 。
HasKeys指定 cookie是否包含关键字 。
Path若被指定, 则 cookie将只发送到对该路径的
请求中 。 如果未设置该属性, 则使用应用程序的
路径 。
下 面 通 过 一 段 程 序 来 说 明 Request 和
Response的应用 。
程序 sample6-04.asp
<%
Dim user
Dim flag
Dim pwd
Dim say
Response.buffer=true '开启缓冲页面功能
Response.ContentType="text/HTML"
Response.Charset="gb2312"
user=Request.Form("username")
pwd=Request.Form("password")
say=Request.QueryString("say")
%>
<form method="POST" action=" sample6-04.asp ">
<p> 用户名,
<input type="text" name="username" size="12"><br>
口 令,
<input type="password" name="password" size="12"><br>
<input type="submit" value=" 提交 " name="B1">
<input type="reset" value=" 取消 " name="B2"></p>
</form>
<%
If say=1 then
Response.Write " 欢迎光临寒舍 !"
End If
If say>1 then
Response.Write " 欢迎再次光临 !"
End If
If user="adm" and pwd="adm" Then
页面输出
End If
%>
<% Response.write "<p><a href=' sample6-
05.asp?flag="&flag&"'>Web数据库技术 </a></p>"
%>
程序 sample6-05.asp,
<%
Dim say
say=Request.QueryString("flag")
Response.write say
Select case say
case "1"
Response.Redirect " sample6-04.asp?say=1"
case "2"
Response.Redirect " sample6-04.asp?say=2"
case "3"
Response.Redirect " sample6-04.asp?say=3"
case "0"
Response.Redirect " sample6-04.asp?say=0"
End Select
%>
将这两个程序放在有执行权限的 Web 虚拟目
录下, 并以 http方式访问 sample6-04.asp。 当第
一次访问 sample6-04.asp文件时, 页面上出现一
个 Form并提示输入用户名和口令, 如果你输入
用户名,adm; 口令,adm,则会出现如图 6-3的页面,
图 6-3 adm用户首次访问 sample6-04.asp的结果
如果输入用户名,guest; 口令,guest,则仅出
现如图 6-4的页面,
图 6-4 guest用户首次访问 sample6-04.asp的结果
程序分析如下:由于设置了页面缓存, 当使
用 guest 登陆时, 判断程序自动清空其之前所有
存储在缓存中的页面, 而仅将其后脚本程序执行
的结果显示出来 。
第一次 sample6-04.asp页面时仅仅显示一个
Form对话框, 是因为此时程序判断到用户既非
adm,也不是 guest和 vip,所以执行 Response.End,
立即将存储在缓存中的 Form显示出来, 并停止其
后的一切脚本处理, 包括纯 HTML代码的显示 。
无论是用 adm还是 guest或 vip登陆该页面都可
以看到一个超链接,该超链接指向文件 web1.asp。
当点击该超链接时,sample6-04.asp 将变量 flag
的值作为参数发送给 sample6-05.asp,而后者则
根据该参数的值来做出判断,并依据不同情况
使用 Response.Redirect 再强行返回 sample6-
04.asp,并也将一个变量 say的值作为参数发送给
sample6-04.asp。 如此一来,sample6-04.asp又
会根据此参数来做出不同的反应。
6.4 Application和 Session对象
在 ASP的内建对象中除了用于发送, 接收
和处理数据的对象外, 还有一些非常实用和重
要的对象 。
在同一虚拟目录及其子目录下的所有,asp
文件构成了 ASP应用程序。使用 Application 对
象,可以在给定的应用程序的所有用户之间共
享信息,并在服务器运行期间持久的保存数据。
而且,Application对象还有控制访问应用层数
据的方法和可用于在应用程序启动和停止时触
发过程的事件。
6.4.1 Application 对象
1,属性
虽然 Application对象没有内置的属性, 但可以
使用以下句法设置用户定义的属性, 也可称为集
合 。
Application(" 属性 / 集合名称 ")= 值
使用如下脚本声明并建立 Application对象的属性 。
< %
Application("MyVar") = "Hello"
Set Application("MyObj") =
Server.CreateObject("MyComponent")
%>
一旦分配了 Application对象的属性,它就会持久
地存在,直到关闭 Web服务器服务使 Application
停止。由于存储在 Application对象中的数值可以
被应用程序的所有用户读取,所以 Application对
象的属性特别适合在应用程序的用户之间传递信
息。
2,方法
Application对象有两个方法, 它们都是用
于处理多个用户对存储在 Application中的数据进
行写入的问题 。
( 1) Lock 方法禁止其他客户修改 Application对
象的属性
Lock 方法阻止其他客户修改存储在 Application
对象中的变量, 以确保在同一时刻仅有一个客户
可修改和存取 Application变量 。 如果用户没有
明确调用 Unlock方法, 则服务器将在,asp文件结
束或超时后即解除对 Application对象的锁定 。
( 2) Unlock 方法允许其他客户修改 Application
对象的属性
在上面的例子中, 上述例子中, Unlock方法
解除对象的锁定, 使得下一个客户端能够增加
NumVisits的值 。
3,事件
( 1) Application_OnStart
Application_OnStart 事件在首次创建新的
会话 (即 Session_OnStart 事件 )之前发生 。 当
Web 服务器启动并允许对应用程序所包含的文件
进行请求时就触发 Application_OnStart 事件 。
Application_OnStart 事件的处理过程必须写在
Global.asa 文件之中 。
Application_OnStart 事件的语法如下,
< SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server>
Sub Application_OnStart…
End Sub
< /SCRIPT>
( 2) Application_OnEnd
Application_OnEnd 事件在应用程序退出时于
Session_OnEnd事件之后发生, Application_OnEnd 事件
的处理过程也必须写在 Global.asa 文件之中 。
使用 Application 对象时必须注意,
1) 不能在 Application 对象中存储 ASP内建对象 。 例如,
下面的每一行都返回一个错误 。
<%
Set Application("var1")=Session
Set Application("var2")=Request
Set Application("var3")=Response
Set Application("var4")=Server
Set Application("var5")=Application
Set Application("var6")=ObjectContext
%>
2) 若将一个数组存储在 Application对象中, 请
不要直接更改存储在数组中的元素 。 例如, 下列
的脚本无法运行 。
< % Application("StoredArray")(3) = "new
value" %>
这是因为 Application对象是作为集合被实现
的 。 数组元素 StoredArray(3)未获得新的赋值 。
而此值将包含在 Application对象集合中, 并将覆
盖此位置以前存储的任何信息 。 建议将数组存储
在 Application对象中时, 在检索或改变数组中的
对象前获取数组的一个副本 。 在对数组操作时,
应再将数组全部存储在 Application对象中, 这样
所做的任何改动将被存储下来 。 下面的程序即采
用了上述的方法 。
程序 sample6-07.asp
<%
dim MyArray()
Redim MyArray(5)
MyArray(0)="hello"
MyArray(1)="some other string"
Application.Lock
Application("StoredArray")=MyArray
Application.Unlock
Response.Redirect " sample6-08.asp "
%>
程序 sample6-08.asp
<%
LocalArray=Application("StoredArray")
LocalArray(1)=" there"
Response.Write LocalArray(0)&LocalArray(1)
Application.Lock
Application("StoredArray")=LocalArray
Application.Unlock
%>
6.4.2 Session对象
与 Application对象具有相近作用的另一个非常实
用的 ASP 内 建 对 象 就 是 Session。 可 以 使 用
Session 对象存储特定的用户会话所需的信息 。
当用户在应用程序的页之间跳转时, 存储在
Session对象中的变量不会清除, 而用户在
应用程序中访问页面时, 这些变量始终存在 。 当
用户请求来自应用程序的 Web页时, 如果该用户还
没有会话, 则 Web服务器将自动创建一个 Session
对象 。 当会话过期或被放弃后, 服务器将终止该
会话 。
通过向客户程序发送唯一的 Cookie可以管理
服务器上的 Session对象 。 当用户第一次请求 ASP
应用程序中的某个页面时, ASP要检查 HTTP头信息,
查看是否有在报文中有名为 ASPSESSIONID 的
Cookie发送过来, 如果有, 则服务器会启动新的
会话, 并为该会话生成一个全局唯一的值, 在把
这个值作为新 ASPSESSIONID Cookie的值发送给客
户端, 正是使用这种 Cookie,可以访问存储在服
务器上的属于客户程序的信息 。
Session对象最常见的作用就是存储用户的首
选项 。 例如, 如果用户指明不喜欢查看图形, 就
可以将该信息存储在 Session对象中 。 另外其还经
常被用在鉴别客户身份的程序中 。 要注意的是,
会话状态仅在支持 cookie的浏览器中保留, 如果
客户关闭了 Cookie选项, Session也就不能发挥作
用了 。
1,属性
( 1) SessionID属性
SessionID属性返回用户的会话标识 。 在创
建会话时, 服务器会为每一个会话生成一个单独
的标识 。 会话标识以长整形数据类型返回 。 在很
多情况下 SessionID可以用于 Web页面注册统计 。
( 2) TimeOut属性
Timeout属性以分钟为单位为该应用程序的
Session对象指定超时时限 。 如果用户在该超时时
限之内不刷新或请求网页, 则该会话将终止 。
2,方法
Session对象仅有一个方法, 就是 Abandon。
Abandon方法可以删除所有存储在 Session
对象中的对象并释放这些对象的源 。 如果未明确地调用
Abandon方法, 一旦会话超时, 服务器将删除这些对象 。
当服务器处理完当前页时, 释放会话状态 。 如,
< % Session.Abandon %>
3,事件
Session对象有两个事件可用于在 Session
对象启动和释放是运行过程。
( 1) Session_OnStart 事件在服务器创建新会
话时发生。服务器在执行请求的页之前先处理
该脚本。 Session_OnStart事件是设置会话期变
量的最佳时机,因为在访问任何页之前都会先
设置它们。
尽管在 Session_OnStart 事件包含
Redirect或 End方法调用的情况下 Session对象
仍会保持, 然而服务器将停止处理 Global.asa
文件并触发 Session_OnStart事件的文件中的脚
本 。
为了确保用户在打开某个特定的 Web页时始终
启动一个会话, 就可以在 Session_OnStart事件
中调用 Redirect方法 。 当用户进入应用程序时,
服 务 器 将 为 用 户 创 建 一 个 会 话 并 处 理
Session_OnStart事件脚本 。 可以将脚本包含在该
事件中以便检查用户打开的页是不是启动页, 如
果不是, 就指示用户调用 Response.Redirect方法
启动网页 。 如,
<SCRIPT RUNAT=Server Language=VBScript>
Sub Session_OnStart
startPage = "/MyApp/StartHere.asp"
currentPage = Request.ServerVariables("SCRIPT_NAME")
if strcomp(currentPage,startPage,1) then
Response.Redirect(startPage)
end if
End Sub
</SCRIPT>
上述程序只能在支持 cookie的浏览器中运行 。
因为不支持 cookie的浏览器不能返回 SessionID
cookie,所以, 每当用户请求 Web页时, 服务器都
会创建一个新会话 。 这样, 对于每个请求服务器
都将处理 Session_OnStart脚本并将用户重定向到
启动页中 。
( 2) Session_OnEnd事件在会话被放弃或超时发
生 。
使用 Session对象需要注意的事项与 Application
对象相近, 请参照前文 。
会话可以通过以下三种方式启动,
一个新用户请求访问一个 URL,该 URL标识了
某个应用程序中的,asp文件, 并且该应用程序的
Global.asa文件包含 Session_OnStart过程 。
用户在 Session对象中存储了一个值 。
用户请求了一个应用程序的,asp 文件, 并且
该应用程序的 Global.asa文件使用 < OBJECT>标签
创建带有会话作用域的对象的实例 。
如果用户在指定时间内没有请求或刷新应用
程序中的任何页,会话将自动结束。这段时间的
默认值是 20分钟。可以通过在, Internet服务管
理器, 中设置, 应用程序选项, 属性页中的, 会
话超时, 属性改变应用程序的默认超时限制设置。
应依据 Web应用程序的要求和服务器的内存空间来
设置此值。例如,如果希望浏览 Web 应用程序的
用户在每一页仅停留几分钟,就应该缩短会话的
默认超时值。过长的会话超时值将导致打开的会
话过多而耗尽服务器的内存资源。对于一个特定
的会话,如果想设置一个小于默认超时值的超时
值,可以设置 Session对象的 Timeout属性。例如,
<% Session.Timeout = 5 %>将超时值设置为 5分钟 。
当然也可以设置一个大于默认设置的超时值,
Session.Timeout属性决定超时值 。 还可以通过
Session对象的 Abandon方法显式结束一个会话 。
例如, 在表格中提供一个, 退出, 按钮, 将按钮
的 ACTION 参数设置为包含下列命令的,asp 文
件的 URL。 例如,
<% Session.Abandon %>
4,Session的工作原理
Session其实是利用 Cookie进行信息处理的
( 参见前面有关 Cookies的介绍 ) 。 当用户首先进
行了请求后, 服务端就在用户浏览器上创建了一
个 Cookie,当这个 Session结束时, 其实就是意味
着这个 Cookie就过期了 。 为这个用 户创建 的
Cookie的名称是 ASPSESSIONID。
这个 Cookie的唯一目的就是为每一个用户提
供不同的身份认证 。
如果对名字是 ASPSESSIONID的 COOKIE感到好
奇, 可 以 利 用 ServerVariables 集合的 COOKIE
Header来接受这个信息, 如下面这个脚本,
<%=Request.ServerVariables("HTTP COOKIE") %>
多次刷新屏幕,显示结果依然不变。
Session变量自己不会存在用户浏览器上 。 不
过, ASPSESSIONID这个 cookie需要使用 session变
量 。 服务器使用 ASPSESSIONID cookie来将特定的
用户和特定的 session信息联系起来 。 没有 cookie
的话, 服务器就不会了解到每一个特定用户在网
站中移动的信息 。
利用 SessionID 变量存储 ASPSESSIONID
cookie和直接对名为 ASPSESSIONID的 cookie赋值
有很大不同 。 微软利用了一个复杂的数学算法对
SessionID进行了加密措施, 以防止黑客猜测出
SessionID的值并且依据这个获得不该获得的身份
或权限 。
可以用两种方法屏蔽掉 SessionID,一种是将
全站进行屏蔽;另一种是对一个单独 ASP进行相应
屏蔽 。
如果想要将整个站点的 Session操作进行屏蔽,
可以使用, Internet 信息服务 → 默认站点属性 →
主目录 → 配置 → 应用程序选项 → 启用会话状况, 。
取消, 启用会话状况, 选项的选择 。
还可以在特定的 ASP程序的首行加入使之屏蔽
的语句来进行这种操作 。 如,
<% EnableSessionState=False %>
由于 Session对象使用了 Cookies,那么它的
兼容性就受到了限制, 例如有些浏览器提供了屏
蔽 Cookie的选项 。
由于 Cookie不能适用于所有浏览器,那么在
建站时必须注意,如果你的网站定位于大众通用,
就必须考虑各种不同的用户情况。
6.5 Global.asa文件的使用
在上一节中介绍了两个非常实用的 ASP 内
建对象 Application和 Session的使用方法。由于
这两者的 OnStart,OnEnd事件的脚本都必须在
Global.asa文件中声明,因此,本节将 详细介绍
Global.asa文件的使用方法。
Global.asa文件其实是一个可选文件,程序
编写者可以在该文件中指定事件脚本,并声明
具有会话和应用程序作用域的对象。该文件的
内容不是用来给用户显示的,而是用来存储事
件信息和由应用程序全局使用的对象。该文件
的名称必须是 Global.asa且必须存放在应用程序
的根目录中。每个应用程序只能有一个
Global.asa 文件。
在 Global.asa文件中, 如果包含的脚本没有用 <
SCRIPT>标记封装, 或定义的对象没有会话或应用
程序作用域, 则服务器将返回错误 。 可以用任何
支持脚本的语言编写 Global.asa 文件中包含的脚本 。
如果多个事件使用同一种脚本语言, 就可以将它
们组织在一组 < SCRIPT>标记中 。
在 Global.asa文件中声明的过程只能从一个或
多个与 Application_OnStart,Application_OnEnd、
Session_OnStart和 Session_OnEnd事件相关的脚本
中调用 。 在基于 ASP 的应用程序的 ASP页中, 它们
是不可用的 。 如果要在应用程序之间共享过程,
可在单独的文件中声明这些过程, 然后使用服务
器端包容 (SSI) 语句将该文件包含在调用该过程的
ASP程序中 。 通常, 包含文件的扩展名应为,inc。
下面是一个很标准的 Global.asa 文件,
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Application_OnStart
VisitorCountFilename=Server.MapPath ("/ex2") +
"\VisitCount.txt"
Set
FileObject=Server.CreateObject("Scripting.FileSystemObject")
Set
Out=FileObject.OpenTextFile(VisitorCountFilename,1,FALSE,
FALSE)
Application("visitors")=Out.ReadLine
Application("VisitorCountFilename")=VisitorCountFilename
End Sub
'=============================================
============
Sub Application_OnEnd
Set FileOutObject =
Server.CreateObject("Scripting.FileSystemObject")
Set Out= FileOutObject.CreateTextFile
(Application("VisitorCountFilename"),TRUE,FALSE)
Out.WriteLine(application("visitors"))
End Sub
'=============================================
============
Sub Session_OnStart
Session.Timeout = 5
Application("visitors") = Application("visitors") + 1
Session("ID")=Session.SessionID
End Sub
</SCRIPT>
在这个 Global.asa 程序中,涉及到了 ASP的 File
Access组件(有关 ASP组件方面的知识请查阅有关
资料),它可以提供用于访问文件系统的方法、
属性和集合。在这里,它起到了在服务器上创建
新文件并对文件进行写操作的作用。这其实是一
个 ASP页面访问记数器应用程序的 Global 文件,首
先当客户首次访问该应用程序的首页时,过程
Application_OnStart定义了在服务器上指定的虚拟
目录下新建一个 VisitCount.txt 的文本文件,并将文
件的路径和内容保存在应用程序级的变量中。而
当任何一个客户访问 ASP应用程序中的任何一个页
面时,过程 Session_OnStart 定义将应用程序级的变
量 visitors的值自动加一。这样,每当有客户访问页
面时,变量 visitors都将自动加一,以起到统计点击
率的作用。由于变量 visitors的值是存储在系统内存
之中,所以如果服务器关闭或重新启动,存储在变
量中的数据将自动丢失,所以通过定义过程
Application_OnEnd,在服务器关闭或重启之前将数
据写入事先建立的文本文件之中,这样就能确保当
服务器再次启动时,Application_OnStart过程可以
从 VisitCount.txt文件中读取以前的统计数。
6.6 ASP内建对象 Server
ASP的应用完全是基于 IIS之上的 。 IIS支持
虚拟目录, 通过在, 服务器属性, 对话框中的
,目录, 标签可以管理虚拟目录 。 建立虚拟目
录对于管理 Web站点具有非常重要的意义 。 首
先, 虚拟目录隐藏了有关站点目录结构的重要
信息 。 因为在浏览器中, 客户通过选择, 查看
源代码,, 很容易就能获取页面的文件路径信
息, 如果在 Web页中使用物理路径, 将暴露有
关站点目录的重要信息, 这容易导致系统受到
攻击 。 其次, 只要两台机器具有相同的虚拟目
录, 就可以在不对页面代码做任何改动的情况
下, 将 Web页面从一台机器上移到另一台机器 。
最后, 将 Web页面放置于虚拟目录下后, 管理
员可以对
目录设置不同的属性, 如,Read( 读 ), Excute
( 执行 ), Script( 脚本 ) 。 读访问表示将目录
内容从 IIS传递到浏览器 。 而执行访问则可以使在
该目录内执行可执行的文件 。 当需要使用 ASP时,
就必须将存放,asp文件的目录设置为, Excute”。
在此建议设置 Web站点时, 将 HTML文件同 ASP文件
分开放置在不同的目录下, 然后将 HTML子目录设
置为, 读,, 将 ASP子目录设置为, 执行,, 这不
仅方便了对 Web的管理, 而且最重要是的提高了
ASP程序的安全性, 防止程序内容被客户所访问 。
Server 对象提供对服务器上的方法和属性的
访问,其中大多数方法和属性是作为实用程序的
功能服务的。有了 Server对象,就可以在服务器
上启动 ActiveX对象例程,并使用 Active Server
服务提供象 HTML和 URL编码这样的函数。 语法,
Server.property|method
6.6.1 属性
ScriptTimeout 超时值, 表示在脚本运行超
过这一时间之后即作超时处理 。 下面的代码指定
服务器处理脚本在 100 秒后超时 。
<% Server.ScriptTimeout=100 %>
这里需要注意的是,通过使用元数据库中的
AspScriptTimeout属性可以为 Web服务或 Web 服
务器设置缺省的 ScriptTimeout值。
ScriptTimeout属性不能设置为小于在元数据库中
指定的值。例如,如果 NumSeconds设置为 60,而
元数据库设置包含了默认值 90秒,则脚本在 90秒
后超时。
6.6.2 方法
1,HTMLEncode方法
HTMLEncode方法允许对特定的字符串进行
HTML编码 。 虽然 HTML可以显示大部分写入 ASP文件
中的文本, 但是当需要实际包含 HTML标记中所使
用的字符, 就会遇到问题 。 这是因为, 当浏览器
读到这样的字符串时, 会试图进行解释 。 例如下
面的这段文本,
这是对 HTMLEncode 方法的测试 。 < br>
这里应该不会另起一行 。
会被浏览器显示为,
这是对 HTMLEncode 方法的测试 。
这里应该不会另起一行 。
为了避免此类问题, 需要使用 Server对象的
HTMLEncode方法, 采用对应的不由浏览器解释的
HTML Character Code替代 HTML标记字符 。 所以,
用下面的代码才能显示正确的 HTMLEncode字符串,
从而在浏览器中按需要输出文本 。
<%
Response.write Server.HTMLEncode(" 这 是 对
HTMLEncode 方法的测试 。 <br> 这应该不会另起
一行 。 ")
%>
2,URLEncode方法
就像 HTMLEncode方法使客户可以将字符串翻
译成可接受的 HTML格式一样, Server 对象的
URLEncode方法可以根据 URL规则对字符串进
行正确编码, 当字符串数据以 URL 的形式传递到
服务器时, 在字符串中不允许出现空格, 也不允
许出现特殊字符 。 为此, 如果希望在发送字符串
之前进行 URL编码, 可以使用 Server.URLEncode方
法 。
3,MapPath方法
MapPath方法将指定的相对或虚拟路径映射到
服务器上相应的物理目录上 。
语法,
Server.MapPath(Path)
这里的 Path指定要映射物理目录的相对或虚
拟路径。若 Path以一个正斜杠( /)或反斜杠( \)
开始,则 MapPath 方法返回路径时将 Path 视为
完整的虚拟路径。若 Path不是以斜杠开始,则
MapPath方法返回同,asp文件中已有路径相对的路
径。这里需要注意的是 MapPath方法不检查返回
的路径是否正确或在服务器上是否存在。
对于下列示例, 文件 data.txt和包含下列脚本
的 test.asp文件都位于目录 C:\Inetpub\wwwroot\asp
( C:\Inetpub\wwwroot目录为服务器的宿主目录 )
下 。 示例中使用服务器变量 PATH_INFO映射当前
文件的物理路径 。 脚本
< % =
server.mappath(Request.ServerVariables("PATH_INFO"))%>
输出,
c:\inetpub\wwwroot\asp\test.asp
由于下列示例中的路径参数不是以斜杠字符开始
的, 所以它们被相对映射到当前目录, 此处是目
录 C:\Inetpub\wwwroot\asp。 脚本,
< %= server.mappath("data.txt")%>
< %= server.mappath("asp/data.txt")%>
输出,
c:\inetpub\wwwroot\asp\data.txt
c:\inetpub\wwwroot\asp\asp\data.txt
4,CreateObject方法
Server.CreateObject是 ASP 中最为实用,
也是最强劲的功能 。 它用于创建已经注册到服务
器上的 ActiveX 组件实例 。 这是一个非常重要的
特性, 因为通过使用 ActiveX 组件能够轻松地扩
展 ActiveX 的能力, 使用 ActiveX 组件, 可以
实现至关重要的功能, 譬如数据库连接, 文件访
问, 广告显示和其它 VBScript 不能提供或不能
简单地依靠单独使用 ActiveX 所能完成的功能 。
语法,
Server.CreateObject("Component Name")
默认情况下,由 Server.CreateObject 方法
创建的对象具有页作用域。这就是说,在当前
ASP 页处理完成之后,服务器将自动破坏这些对
象。如果要创建有会话或应用程序作用域的对象,
可以使用 < OBJECT> 标记并设置 Session或
Application的 Scope属性,也可以在对话及应用
程序变量中存储该对象。如,
<%
Set Session("ad") = Server.CreateObject("MSWC.AdRotator")%>
这里需要注意的是,不能创建与内建对象同
名的对象实例,否则,将返回错误。
本 章 小 结
本章详细介绍了在表单的使用及 ASP的 5个常
用而重要的内建对象的语法, 属性, 方法和事件 。
学完本章, 读者应该能够自行编写出一定水平的
ASP程序 。
习 题
1,在 Form数据传送中 Get与 Post方法的区别 。
2,如何利用 Query字段传递多个参数 。
3,Session的工作原理 。
4,论述 Global.asa的作用 。
5.利用所学知识,编写一个简单的 ASP Web 聊天
室程序。