Transcript Document

第7章 与用户交互
主要内容
• 在ASP网页中如何将动态信息发送给客
户?以及当客户通过表单提交信息时如
何接收呢?为此本章讨论以下内容:
–
–
–
–
–
动态信息插入到html文档
缓冲输出及发送其它类型文档
重定向网页
表单的发送和接收
获取环境变量
本章目录
7.1 发送信息
7.2.1 接收通过GET
方式发送的信息
7.1.1 将动态信息插
7.2.2 接收通过POST
入到html文档中
方式发送的信息
7.1.2 输出静态信息
7.1.3 缓冲输出
7.2.3 环境变量
7.1.4 输出内容指定 7.2.4 不同类型表单
7.1.5 重定向用户
域的数据接收
7.1.6 其它属性和方法 本章小结
7.2 接收信息
习题
7.1 发送信息
• 根据客户端浏览器的请求,服务器将已有的网
页或必要的信息动态生成网页发送到客户端,
根据信息组成方式的不同,以下分别讨论:
7.1.1 将动态信息插入到html文档中
7.1.2 输出静态信息
7.1.3 缓冲输出
7.1.4 输出内容指定
7.1.5 重定向用户
7.1.6 其它属性和方法
7.1.1 将动态信息插入到html文档中
• 通过ASP中的内置对象Response可以实现
将需要动态生成的信息嵌入到html文档中,
也可以通过它向客户端浏览器传递一些其
它信息。
• 先来讨论将信息插入到html文档中的方法。
根据需要插入的信息量的多少,分别讨论:
1. 少量信息插入
2. 较多信息插入
1. 少量信息插入
• 为了将少量信息插入到html文档中,(如
插入一个变量的值、一个表达式的值),可
以使用如下形式:
<%=表达式%>
• 与之等价的形式为:
<% Response.write 表达式%>
• 其中,Response是ASP内置的对象名,
write是该对象的一个方法。
1. 少量信息插入
• 几点规定:
–文件的扩展名应改为asp
–文件保存的位置应在服务器的相应目录中
–不能通过双击这样的文件来实现浏览功能
• 当用户请求访问该网页时,服务器端首
先会调用相应的脚本引擎来计算该表达式
的值,并将得到的结果信息象一般文档那
样插入到原来的html文档中,形成临时的
html文档发送给客户端浏览器。
2. 较多信息插入
• 但如果一个网页文件中要插入大量的动
态信息,一般直接使用一次或多次
Response对象的Write方法 ,形式如下:
Response.write 表达式
• 由于这一行是由服务器执行的脚本,它
必须包含在<%和%>之间。
在网页中嵌入动态信息举例
• 网页内容
指定网页所用的脚本
<%@language=VBScript%>
语言为VBScript
<% dim d,m,y
d=day(date())
脚本程序,用于分别
m=month(date())
求出当前日期的年、
y=year(date())
月、日放入相应变量
%>
<html>
<head>
<title> 显示日期时间</title>
</head>
<body>
<p><font size="6">
在网页中嵌入动态信息举例
• 网页内容
将动态形成的内容插
入到html文档中
<%
Response.write "今天是" & y & "年" & m & "月" & d & "
日<BR>"
%>
现在时间是<%=time()%>
</font></p>
</body>
插入当前时间
</html>
在网页中嵌入动态信息举例
• 浏览结果
正确的显示结果如图所示:
在网页中嵌入动态信息举例
• 测试结果
为了正确地得到应有的浏览结果,你必须将相
应文件以ASP为扩展名保存,并存放在指定目
录中,之后再启动浏览器,在地址栏中输入
相应地址。关于Web服务器的安装请参看第6
章的内容。
为了让本课件的例子能正确测试,请在Web服务
器管理器中将课件所存放的目录设置为名为
KJ的虚拟目录。
单击测试
在网页中嵌入动态信息举例
• 对于如左图所示的浏览结果,用菜单中
“查看”=>“源文件”,系统启动记事本,
并显示如右图所示内容,请注意看到的内
容并不是ASP文件的内容。
7.1.2 输出静态信息
• 对于一些静态信息,同样可以作为
Response对象的write方法的参数进行输
出。尤其当网页中包含一些必须通过动
态生成的内容时,更为方便。请看以下
的比较:
文档形式1
<%
if Weekday(date)=1 then
%>
<script language="VBscript">
status="没有授权"
</script>
控制某网页在星期天
<%
时不能访问的脚本
else
%>
<html><body>
欢迎您!…
</body></html>
<%
end if
%>
文档形式2
<%
if Weekday(date)=1 then
Response.write "<script language=VBscript>"
Response.write "status=""没有授权"""
Response.write "</script>"
else
Response.write "<html><body>"
Response.write "欢迎您!…"
Response.write "</body></html>"
end if
%>
控制某网页在星期天
时不能访问的脚本
7.1.3 缓冲输出
• 缓冲输出是指把输出内容先放到服务器
的缓冲区中,在适当的时候再发送到客
户端的一种技术。以下分别讨论有关内
容:
1.
2.
3.
4.
设置缓冲输出方式
清除缓冲区的内容
输出缓冲区中的内容
结束输出
1. 设置缓冲输出方式
• 使用Response对象的buffer属性可以设置
缓冲输出页面的内容,形式为:
Response.buffer=true
• 这一设置,将告诉服务器,不要把后面
的内容(包括HTTP报头)直接送往客户端。
• 注意:
这一属性的设置必须放在所有的文档输出之
前,即<html>标签之前。
1. 设置缓冲输出方式
• 一旦设置完成后,可用一般的html文档形
式,来缓冲输出所需内容,即将这些要输
出的内容先存入缓冲区。如:
Hello User<BR>
• 也可用Response对象的Write方法,如:
<% Response.write “Hello User”%>
• 注意:在Windows2000中默认为缓冲输出
方式。
修改默认设置
在Internet信息
服务管理器窗
中,右击默认 在属性对
Web站点,选 话框的主
目录选项
择属性。
卡中单击
配置。
在应用程序配置
对话框的应用程
序选项卡中关闭
“启用缓冲”复
选框。
2. 清除缓冲区的内容
• 缓冲输出的缓冲区是建立在服务器中的,
在缓冲输出方式中,可以把一些已经放入
缓冲区的内容清除掉(作废),其形式如
下:
Response.Clear
• 即使用Response对象的clear方法,它清除
缓冲区中原有的内容。但这一方法只清除
body标签之间的内容,所以清除后不必再
送入头部信息,就可输出新的网页。
3. 输出缓冲区中的内容
• 在缓冲输出方式下,要将缓冲区中的内
容发送到客户端,可使用Response对象的
Flush方法来实现,形式如下:
Response.Flush
• 它把缓冲区内容立即送往客户端输出。
4. 结束输出
• 可以使用Response对象的end方法来结束
输出,执行到该语句时,系统将已经送往
缓冲区中的内容发送到客户端浏览器输出,
并通知浏览器文档已经结束。形式为:
Response.End
• 其后的文档或脚本输出均无效。即使在
非缓冲方式,这一命令也有效。
使用缓冲输出举例
• 网页内容
设置成缓冲输
出方式
<%@language=VBScript%>
<% Response.buffer=true %>
<html><body>
<font size="6">
这是一行客户端看不到的内容
<%
Response.write "这是第二行看不到的内容"
Response.clear
Response.write " 这 是 客 户 端 能 看 到 的 第 一 行 内 容
<BR>"
%>
清除已存缓冲区
中的内容
使用缓冲输出举例
• 网页内容(续)
这是看到的第二行内容<BR>
输出缓冲区中
<%
的内容
Response.flush
Response.write "这是看到的最后一行内容<BR>"
Response.end
结束文档输出
%>
这是结束后输出的一行内容,客户端看不到这行内容。
</font>
</body>
</html>
使用缓冲输出举例
• 浏览结果
单击测试
如果你把源文件放在
inetpub\wwwroot目录
中,这时你可以输入
象图中那样的地址了
7.1.4 输出内容指定
• 一般情况,当浏览器请求一网页时,服务器会
将一个html文档发送给客户端浏览器,但服务器
也可以使用Response对象的ContentType属性指明
向浏览器发送的是其它类型的文档。
• 指明发送给客户端浏览器的是什么类型的文档,
可使用如下形式:
Response.ContentType[=内容类型]
• 内容类型的书写格式为:“类型/子类型”,
如默认值为“text/html”。
7.1.4 输出内容指定
• 内容类型可以是“text/plain”表示纯文本,
“application/msword”表示WORD文档,还
可以是“image/GIF”表示GIF图片等。以
下分别讨论两种常用形式:
1. 输出文本文件
2. 输出Word文档
1. 输出文本文件
• 要想向客户端发送文本文件,使用如下
形式的指定:
Response.ContentType=“text/plain”
• 要注意的是,这一行必须放在输出任何
内容之前。
输出文本文件举例
•网页内容
<% @language = VBScript %>
<%
Response.ContentType = "text/plain"
%>
指定内容为纯文本
你好:
你看到的是纯文本文件,它不识别html的标签。
请注意这里的<BR>标志并不处理成换行。
html中的换行标志
不被处理
输出文本文件举例
•浏览结果
–要验证本例中的代码,文件的扩展名也必须
用asp,并把文件存放在指定的目录中,执
行结果如图所示。
如果你把源文件放在
inetpub\wwwroot目录
中,这时你可以输入
象图中那样的地址了
单击测试
2. 输出Word文档
• 要想向客户端发送Word文档,使用如下
形式的指定:
Response.ContentType="application/msword"
• 通过这一指定后,浏览将启动WORD来打
开服务器端发来的文档。
• 要注意,这一行必须放在输出任何内容
之前。
输出Word文档举例
•网页内容
<% @language = VBScript %>
<%
Response.ContentType = "application/msword"
%>
指定内容为WORD文档
用户好:
这一信息将直接使用MS Word来显示,并且你能直接修改和保存
它。
注意:在这里原来的象<BR>这样的html标签不被处理成换行
html中的换行标志不
被处理
输出Word文档举例
•浏览结果
验证本例中的代码时,当在浏览器中输入地址
后,客户端会启动Word程序来打开具有上述内
容的网页,如图所示,
此后可以编辑并保
存它的内容。
单击测试
7.1.5 重定向用户
• 使用Response对象的redirect方法可以把用户引
导到指定的某个网页。形式如下:
Response.redirect 网页地址
• 其中,网页地址可以是本地的,也可以是其它
服务器的地址。例如:
Response.redirect “Login.asp”
• 这里,Login.asp是已经存在的网页文件名。
• 注意:redirect方法必须在输出任何信息之前使
用,即必须放在<html>标签之前。
7.1.6 其它属性和方法
• 对于Response对象,除了以上讨论的属
性和方法外,Response对象还有一些其
它属性和方法,分别讨论如下:
1. Expires属性
2. ExpiresAbsolute属性
3. IsClientConnected属性
4. CacheControl属性
5. AppendToLog方法
1. Expires属性
• 设置网页的失效时间,单位是分钟,形式如下:
Response.Expires=分钟数
•这一属性的设置表示让网页在规定的时间后失
效。当将分钟数设为0时,表示网页马上失效。
• 通过设置网页的失效时间,可以让浏览器了解
到缓冲区中存放的原来访问时留下的网页内容是
否已经过期。
• 同样,这一属性的设置需要放在任何信息发送
到浏览器之前进行。
2. ExpiresAbsolute属性
• 设置网页失效的绝对时间,即指出网页在某年
某月某日后失效。形式如下:
Response.ExpiresAbsolute=日期时间
• 例如:
<% Response.ExpiresAbsolute=#Dec 31,1999 23:59:59#%>
• 指出网页在1999年12月31日23:59:59后失效。
如果未指定时间,该页面将在当天午夜过期。如
果未指定日期,则该主页在脚本运行当天的指定
时间到期。
3. IsClientConnected属性
• 可以通过Response对象的
IsClientConnected属性来判断用户是否已
经离开,一旦用户离开,则网页中的脚
本就不应继续执行。
3. IsClientConnected属性
•网页内容
<% response.buffer=false %>
<html><body>
<%
每输出十个加一个换行
i=0
do
if i mod 10=0 then Response.write "<BR>" &
i/10 & ":"
i=i+1
Response.write "Hello!"
loop until not(Response.isclientconnected)
%>
</body></html>
3. IsClientConnected属性
•浏览结果
本例中重复显示Hello!,(每10个一行),直到按下
浏览器的停止按钮。注意:这一属性的值实际上是
在上一次使用write方法时设置的。
对于本例,请使用浏览器测试其浏览结果。即先单独
打开浏览器窗口,在地址栏输入下面的地址:
http://localhost/kj/7/L7_5.asp
单击测试
4. CacheControl属性
• 本属性用于指出是否允许代理服务器缓
存该页的内容,缺省值为FALSE。允许
代理服务器缓存该页能提高访问速度,
但有可能让用户得到过时的内容。
5. AppendToLog方法
• AppendToLog 方 法 用 来 将 一 个 字 符 串 添 加 到
Web服务器日志条目的末尾。这一方法主要用于
记录访问该网页的用户,及相应的访问时间等,
以便于通过其它应用程序来统计。
• 使用形式如下:
Response.AppendToLog 字符串
• 根据日志文件的格式要求,字符串中不能包含
逗号,并且字符串最长不能超过80个字符。
7.2 接收信息
• 如果希望通过网页来接收用户的一些信
息,如用户输入的用户名、口令,用户对
你的网页的评价,用户请求帮助的一些信
息。可以用ASP中内置的Request对象,它
封装了所有用户的请求和表单信息。
• 根据HTTP协议的规定,用户发送表单有
两种方式,即GET和POST方式,对于这两
种不同的方式,在ASP中接收信息的处理
方式也有所不同,以下分别讨论。
7.2 接收信息
7.2.1 接收用户通过GET方式发送的信息
7.2.2 接收通过POST方式发送的信息
7.2.3 环境变量
7.2.4 不同类型表单域的数据接收
7.2.1 接收用户通过GET方式发送的信息
• 让我们先来看一下GET方式发送信息的处
理过程,再依次讨论以下内容:
1.
2.
3.
4.
5.
6.
表单设计
接收表单数据
合并两个文件
直接使用查询字符串
重定向到其它网页
GET方式总结
GET方式的表单
读出A.htm内
容发送
请求访问
网页
A.htm
显示网页
A.htm等待
输入后提交
执行B.asp,接收查询
字符串,把 需要的内
容形成临时文件发送
形成对网页
B.asp的查询
字符串发送
显示临时文
件内容
在地址栏输入地址
读出A.htm内
容发送
请求访问
网页
reve.htm
读出所需网页内容
读出所需网
页内容发送
显示网页内容
显示网页
reve.htm
等待输入后按提交
等待输入后
提交
形成发送信息进行发送
形成对网页
reve.asp的查
询字符串发
送
执行脚本接收
执行reve.asp,接
收查询字符串
<%
if Request.ServerVariables("QUERY_STRING")<>"" then
response.write "<html><body>"
response.write "您输入的信息是"
response.write "姓名" & request.querystring("xm") & "<BR>"
response.write "学号" & request.querystring("xh") & "<BR>"
response.write "年龄" & request.querystring("nl") & "<BR>"
response.write "</body></html>"
end if %>
回送结果
回送结果
<%
if Request.ServerVariables("QUERY_STRING")<>"" then
response.write "<html><body>"
response.write "您输入的信息是"
response.write "姓名" & request.querystring("xm") & "<BR>"
response.write "学号" & request.querystring("xh") & "<BR>"
response.write "年龄" & request.querystring("nl") & "<BR>"
response.write "</body></html>"
end if %>
1. 表单设计
• 若要设计一个表单,用于输入姓名和口令,
形式如下:
<form method="get" action="abc.asp">
姓名:<input type="text" name="username"><br>
口令:<input type="password" name="userpassword"><BR>
<input type="submit">
</form>
• 可以看出,要想以GET方式发送表单信息,
表单设计部分的FORM标签中需要指出两个
方面的内容:
1. 表单设计
表单数据的发
送方式
<form method="get" action="abc.asp">
接收表单数据的文件或应
用程序名
2. 接收表单数据
• 可以使用ASP内置对象Request来接收表
单数据,使用形式如下:
Request.querystring("表单域的名称")
• 其中,querystring是内置对象Request的一
个集合。例如使用
Request.querysting(“username”)可获得名称
为username的表单域的值。
2. 接收表单数据
• 由于querystring的中文含义是查询字符串,
我们常常把以GET方式发送的表单信息称
为查询字符串。
• 另外,在不至于引起混淆的场合也可以
把读取表单域信息的形式简写成如下形式:
Request("表单域的名称")
GET方式发送和接收举例
• 本例中需要使用两个文件,一个文件用于显示
表单,另一个文件用于接收表单信息。
(1) 显示表单的文件L7_6.html
<html><body>
<form method="get" action="L7_6.asp">
姓名:<input type="text" name="username"><br>
口令:<input type="password“
name="userpassword"><br>
<input type="submit">
</form>
</body></html>
Get方式
GET方式发送和接收举例
• 本例中需要使用两个文件,一个文件用于显示
表单,另一个文件用于接收表单信息。
(2) 接收表单信息的文件L7_6.asp
<%
name=Request.querystring("username")
password=Request.querystring("userpassword")
%>
<html><body>
信息接受部分
你的名字是:<%=name%><br>
你的口令是:<%=password%>
</body></html>
信息回显部分
GET方式发送和接收举例
建议你把源文件放在
•验证本例时需要分别输入并保存这两个文
inetpub\wwwroot目录
件到指定目录中,如果要改用其它文件名,
中,这样你只需象图
中那样输入地址即可
则需要修改前一个文
件 的 form 标 签 中
action属性的值。
•浏览本例中网页时,
首先打开浏览器,输
入网页地址,显示如
图所示的表单。
GET方式发送和接收举例
• 接着,在表单中输入,如姓名框中输入
“abc”,口令框中输入“123”,并单击提
交,显示如图所示。
单击测试
3. 合并两个文件
• 若把这两个部分合并成一个文件后,当
文件被第一次访问时,应执行显示表单部
分,而当表单内容输入后提交时,执行接
收表单信息的部分。
• 可以使用如下形式的条件表达式:
Request.servervariables(“QUERY_STRING”)<> “”
•来判断出该网页是不是第一次访问。
3. 合并两个文件
接受信息部分
• 合并后网页文件
<% if Request.servervariables(“QUERY_STRING”)<>”” then
name=Request.querystring("username")
password=Request.querystring("userpassword")
%>
<html><body>
你的名字是:<%=name%><br>
合并后文件名
你的口令是:<%=password%>
</body></html>
为L7_7.asp
<% else %>
<html><body>
<form method="get" action="L7_7.asp">
姓名:<input type="text" name="username"><br>
口令:<input type="password" name="userpassword"><br>
<input type="submit">
</form></body>
单击测试
</html>
<%end if%>
3. 合并两个文件
• 上述代码中限定了文件名是L7_7.asp,为
了让文件名能不受文件内容的限制,可使
用如下形式求脚本文件名:
<%=Request.servervariables(“SCRIPT_NAME”)%>
•即使用Request对象的servervariables集
合中的“SCRIPT_NAME”变量来实现,对此
集合的进一步说明请参见7.2.3的内容。
3. 合并两个文件
接受信息和回显部分
•表单信息发送给网页自身
结合在一起了
<%
if Request.servervariables(“QUERY_STRING”)<>”” then
Response.write
“ 你 的 名 字 是 : ”
&
Request.querystring("xm") & "<br>"
Response.write
“ 你 的 口 令 是 : ”
&
Request.querystring("kl")
else
%>
<form action="<%=Request.servervariables(“SCRIPT_NAME”)%>"
method="get" >
姓名:<input type="text" name="xm"><br>
口令:<input type="password" name="kl"><br>
<input type="submit">
</form>
<%end if%>
3. 合并两个文件
•上述代码不管以什么文件名保存,只要扩展名为
asp,并存放到指定目录中,浏览时都能得到如图
所示结果
单击测试
4. 直接使用查询字符串
• 上例浏览时也可直接输入如下形式:
Localhost/L7_8.asp?xm=abc&kl=123
• 这时直接出现
如图画面
单击测试
5. 重定向到其它网页
• 有时,可能希望在网页中提供搜索功能,这时,
可以通过其它著名的搜索网站来实现,如
Yahoo!,实现的完整代码如下 :
获得用户输入
<%@ language=VBScript%>
的查询字符串
<% option explicit
dim searchstr,str
searchstr=Trim(Request.Querystring("Searchstr"))
if len(searchstr)<>0 then
str="http://search.yahoo.com/bin/search"
str=str & "?p=" & searchstr
Response.redirect str
重定向到Yahoo
else
%>
5. 重定向到其它网页
显示表单,等待用户
输入查询字符串
<form
action="<%=Request.servervariables("SCRIPT_NAM
E")%>" method="get" >
输 入 要 搜 索 的 字 符 串 < input type="text"
name="Searchstr"><br>
<input type="submit" value="提交">
</form>
单击测试
<%end if%>
•本例首先显示一个供输入需要搜索的字符串的表
单,当单击提交后,该表单信息发送给网页本身,
处理后再重定向到其它网站。
6. GET方式总结
• 要实现以Get方式发送表单信息,可以有两种
方法,即以表单形式发送和直接在地址栏中发
送。
• 以表单形式发送,即在网页中,通过使用GET方
法,并通过SUBMIT类型的按钮来提交。
• 直接在地址栏发送是指在地址栏中直接附加查
询字符串,或在网页中用重定向的形式并附加
查询字符串来实现发送信息。
• GET方式发送适合于传送少量信息,并可以明
码形式显示的场合。
7.2.2 接收通过POST方式发送的信息
• 先来看一下POST方式发送数据的过程,
再依次讨论如下内容:
1.
2.
3.
4.
表单设计
接收表单输入
混合发送方式
POST方式总结
POST方式图示
读出A.htm内
容发送
请求访问网
页A.htm
显示网页A.htm
等待输入后提
交给B.asp
执行B.asp,接收输入
信息,把需要的内容
形成临时文件发送
显示临时文
件内容
1. 表单设计
• 在以POST方式传递信息时一定要有表单
• 以下还是以输入姓名和口令的表单为例,
设计如下:
<form method="POST" action="abc.asp">
姓名:<input type="text" name="username"><br>
口令:<input type="password"
name="userpassword">
<input type="submit">
</form>
2. 接收表单输入
• 可以使用Request对象的form集合接收用
POST方式发送的表单信息,形式如下:
Request.form("表单域的名称")
• 例如Request.form(“username”)可用于接收
用户在名为username的表单域中填入的数
据。
2. 接收表单输入
• 为了判断用户是否用POST方式的表单发
送了信息,同GET方式类似,可以用如下
形式:
Request.servervariables(“content_length")<>0
• 当条件为真时,表示发送了信息,而当
条件为假时,表示没有发送信息,如例中
所示。
POST方式发送和接收举例
•网页内容
<%@language=VBScript%>
<%option explicit
判断是否发送了信息
dim name,age
if Request.servervariables("CONTENT_LENGTH")=0 then
%>
表单内容递交给自身
<html><body>
<form
action="<%=Request.servervariables("SCRIPT_NAME")%>"
method="POST" >
姓名:<input type="text" name="txtName"><br>
年龄:<input type="text" name="txtAge"><br>
<br>
POST方式发送和接收举例
•网页内容
<input type="submit" value=" 提交 ">
<input type="reset" value=" 重填 ">
</form>
读取表单信息
</body></html>
<%else %>
<%
name=Request.form("txtName")
age=Request.form("txtAge")
%>
<html><body>
<font size="+3"><%=name%>, 你 好 ! < br> 你 今 年 < % = age%>
岁.</font>
</body></html>
<%end if%>
POST方式发送和接收举例
•浏览结果
•浏览时,首先在浏览器窗口显示表单供用户填
写,如图所示。
POST方式发送和接收举例
•当用户输入内容后,如姓名框中输入“张
三”,年龄框中输入“23”, 单击提交
按钮,则显示结果如图所示。
•可以看出,在显示结
果时,地址栏中没有
发生变化,这就是和
GET方式形式上的不
同点。
单击测试
3. 混合发送方式
• 有时,我们希望通过表单,既以POST方
式发送一些信息,又通过GET方式传递
一些信息,这时,可以将要传递的一些
信息放在<form>标签的action属性中。
• 如例中:
<form action="L7_11.asp?bh=0001" method="POST" >
用Get方式传递的信息
混合发送方式举例
• 网页内容
强制所有使用的变量必须
事先声明
<%@language=VBScript%>
<%option explicit
dim qs,fm
if Request.servervariables("CONTENT_LENGTH")=0 then
%>
<html><body>
包含“?bh=0001”
<form
action="<%=Request.servervariables("SCRIPT_NAME")%>
?bh=0001" method="POST" >
姓名:<input type="text" name="txtName"><br>
年龄:<input type="text" name="txtAge"><br>
<br>
<input type="submit" value=" 提交 ">
<input type="reset" value=" 重填 ">
</form>
混合发送方式举例
• 网页内容
用Get方式发送的
信息集合
</body></html>
<% else %>
<html><body>
<%
Response.write "以GET方式发送的内容如下:<BR>"
for each qs in Request.querystring
Response.write qs & "=" & Request.querystring(qs) &
"<BR>"
next
Response.write "以POST方式发送的内容如下:<BR>"
for each fm in Request.form
Response.write fm & "=" & Request.form(fm)& "<BR>"
next
%>
用Post方式发送的
</body></html>
信息集合
<%end if%>
混合发送方式举例
• 浏览结果
单击测试
4. POST方式总结
• POST方式传递信息时,不把它放入地址
栏,这样相对比较安全,另外POST方式
可以传递相对较多的数据。
7.2.3 环境变量
• 环境变量是Request对象的另外一个集合,
通过它,可以获得有关服务器的一些信息
和用户发送请求时浏览器通过HTTP报头传
送的一些信息。求某个环境变量值的一般
形式为:
Request.servervariables(“ 环 境 变 量 名
称”)
• 实际上,这种形式在前面的一些例子中
已经出现过。以下分别讨论常用的各种环
境变量。
1. 获得当前脚本的虚拟路径
• 获得正在执行的脚本虚拟路径的作用是自
我引用Web页
• 求当前脚本的虚拟路径,可使用形式如下:
strURL=Requeset.servervariables(“SCRIPT_NAME”)
• 而要指出将表单发送给自身文件,可将
form标签的action属性指定如下形式:
action=“<%=Request.servervariables(“SCRIPT_NAME”)%
>”
2. 找出用POST方式发送的信息长度
• 通过服务器环境变量content_length,可以
求得服务器是否以POST方式发送了表单信
息。形式如下:
Request.servervariables(“content_length”)<>0
• 表达式为True时表示发送了信息,False
时表示没有发送信息。
3. 找出用GET方式发送的查询串
• 通过环境变量也可得到使用GET方式发送的信
息,使用形式为:
querystr=Request.ServerVariables(“query_string”)
• 若它的值不是空串,则表示有相应的信息(称
为查询串)发送了,若要写在if语句中作为条件,
可写成:
Requeset.servervariables(“query_string”)<> “”
• 或写成:
Len(Requeset.servervariables(“query_string”))<>0
4. 获取HTTP报头信息
• HTTP报头中包含客户本身的附加信息,
如:浏览器的名称和版本、用户选择的语
言、运行的平台、接受的文件类型等。要
检索HTTP报头信息可以采用两种形式,即:
获得所有信息:ALL_RAW
获得个别信息:HTTP_报头名称
• 以下分别讨论
4. 获取HTTP报头信息
• 要获得所有信息,使用形式为:
Request.ServerVariables(“ALL_RAW”)
• 得到的信息是一个包含回车的字符串,
为了将该结果以网页的形式输出,可以用
以下形式的替换函数,将所有回车换行以
<BR>代替,形式为:
Replace(原字符串,vbCrLf,“<BR>”)
4. 获取HTTP报头信息
• 以下是为了输出所有HTTP报头内容的简
单网页:
<html><body>
<%=Replace(Request.ServerVariables("ALL_RAW"),vbCrLf,"<BR
>")%>
</body></html>
单击这里看本机浏览结果
4. 获取HTTP报头信息
• 要获得个别报头的信息,可使用如下形式:
Request.ServerVariables(“HTTP_ 报 头 名
称”)
• 这种方法常常用于获得:
–
–
–
–
–
浏览器名
用户喜欢的语言
引用该页的Web页地址
客户的IP地址
服务器的域名
5. 得到引用的Web页地址
•有时,需要确定哪个Web页调用了本网页。
可以使用如下形式:
Request.ServerVariables(“HTTP_REFERER”)
6. 获取浏览器名
•要获得浏览器名,可使用如下形式:
Request.ServerVariables(“HTTP_USER_AGENT”)
•常见的结果有:
Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
•它是使用在NT上的浏览器浏览的结果 。若在
windows98上的浏览器,显示结果如下:
Mozilla/4.0 (compatible; MSIE 5.0; Windows 98;
DigExt)
7. 获取客户的IP地址
•每一个直接与Internet连接的计算机都有其
唯一的IP地址,用以和其他客户相区别,
客户的IP地址可以通过以下方式求得:
Request.ServerVariables(“REMOTE_ADDR”)
•若用户是通过代理服务器访问该网页的,
则通过这种方式得到的IP地址是代理服务
器的IP地址。
8. 获得用户喜欢的语言
•有时,为了显示符合用户语言的网页,需要了解
客户端喜欢使用的语言。实际上,在每一个请求
中,浏览器都用Accept_Language报头向服务器传
送语言的缩写,服务器可通过该属性得到客户端
使用的语言,形式为:
Request.ServerVariables(“HTTP_ACCEPT_language”)
•返回值的形式为:LA-CO,其中LA是语言的缩写,
CO是国家的缩写,中文使用ZH_CN。
9. 获取请求的域名
•可以在同一个虚拟服务器上挂接两个或两
个以上的域。这时,知道客户请求的是哪
个域就很重要了。服务器的域名可以从环
境变量SERVER_NAME检索到。
•形式如下:
Request.ServerVariables(“SERVER_NAME”)
•这里需要事先申请域名服务。
环境变量举例
• 获得全部环境变量的值
<%@ language=VBScript%>
<html><body>
<table width="100%" border="1">
<tr> <th>环境变量名</th><th>环境变量的值</th><tr>
<%for each name in Request.servervariables%>
<tr>
<td><%=name%></td>
<td><%=Request.servervariables(name)%></td>
</tr>
<%next%>
</table>
环境变量集合
</body></html>
环境变量举例
• 浏览结果如图
单击测试
7.2.4 不同类型表单域的数据接收
• 前面我们已经讨论了接收表单信息的方
法,但是当用户在表单中输入一些符号
或选择某一项时,浏览器最终向服务器
发送了什么信息呢?实际上这与表单的
设计有关,以下分别讨论各种不同类型
表单域的有关内容。
7.2.4 不同类型表单域的数据接收
• 为了验证以下叙述的内容,可以设计如下形式
的接收表单信息的网页。命名为:L7_13.asp
<html><body>
<%
Response.write " 表 单 域 fieldname 的 值 为 "
&
Request.form("fieldname") & "<br>"
Response.write "长度为" & len(Request.form("fieldname"))
& "<br>"
if isnull(Request.form("fieldname")) then
Response.write " 返回空"
end if
%>
</body></html>
1. 文本框、口令框和文本区域
• 表单中,若要放置一个单行文本框,一般有如
下几种形式:
指定初值
<input type="text" name="fieldname" >
<input type="text" name="fieldname" value="abc">
• 当表单被提交时,若文本框内容为空,则浏览
器不发送该表单域中的信息,这样接收程序若用
Request.form(“表单域名称”)
• 求该表单域值时,将返回长度为0的空字符串。
而若文本框中有内容,则接收到的就是其中的内
容。
文本框举例
•网页内容
<html><body>
<form
action="L7_13.asp"
method="POST">
请输入或选择表单域的值,然后单击提交:<BR>
<input
type="text"
name="fieldname"><BR>
<input type="submit" value="提交">
</body></html>
文本框举例
•验证本例时,必须先输入例7-13的代码,
保存成L7_13.asp,再输入本例中代码,可
以保存成htm、html或asp文件,并和asp文
件一样存放到指定的
目录,之后再启动浏
览器,在地址栏输入
本例网页地址,显示
如图所示。
文本框举例
•接着,在表单中输入内容后单击提交按钮,
如输入“abc”,则结果显示如图所示
单击测试
1. 文本框、口令框和文本区域
•口令框和文本框类似,它的设计形式如下:
<input type="password" name="fieldname">
<input
type="password"
name="fieldname"
value="abc" >
•尽 管 输 入 时 在 该 类 型 的 框 中 显 示 的 是
“*”,设置的初值也被显示为相等个数的
“*”,但内部的处理类似于文本框,即输
入了什么,将接收到什么,若没有任何输
入,则浏览器将不发送该项。
1. 文本框、口令框和文本区域
•对于文本区域,尽管设计时形式有所不同,
但还是可以分成两种,即有初值和无初值:
<
textarea
rows="5"
name="fieldname"
cols="30"></textarea>
<textarea rows="5" name="fieldname" cols="30">初
始值</textarea>
•不管是否有输入,浏览器总是将该域发送
给服务器,这样服务器接收到的就是表单
域中实际的内容。实际上它至少包含一个
换行符。
2.单选按钮
• 表单中,若要放置一组单选按钮,设计
形式主要有如下几种:
<input type=" radio" name="fieldname">
<input type=" radio" value="男" name="fieldname">
<input type=" radio" value=" 男 "
checked
name="fieldname">
• 当表单递交时,若该按钮没有被选中,
则不发送该项;若被选中,第一种形式中
发送一个“on”,第二、第三种形式中发送
其值(value属性的值)为“男”。
3.复选按钮
•表单中,复选按钮设计主要有如下几种形式:
<input type="checkbox" name="fieldname" >
<input type="checkbox" name="fieldname" value="ON">
<input type="checkbox" name="fieldname" value="A">
•当表单递交时,若该按钮没有被选中,则不发
送该项;若被选中,第一种形式发送的值为字符
串“on”,第二种形式发送的值为字符串“ON”,
第三种形式发送的值为字符串“A”。
3.复选按钮
•若一个表单中有多个同名的复选按钮被选
中时,将发送一个集合给服务器。这时,
可 以 通 过 Request.form(“fieldname”) 的
Count属性得到有多少项被同时选中,并使
用如下形式得到选中的第i项的值:
Request.form(“fieldname”)(i)
3.复选按钮
•如 果 直 接 用 Request.form(“fieldname”) 输
出,则得到的是用“,”分隔的选中各项
值的列表。
•你还可以像其它集合那样用for each循环来
输出选中的各项值。形式如下:
for each item in Request.form(“fieldname”)
Response.write item
next
多个域同名时的接收和显示例
•网页内容
<%
if Request.servervariables("CONTENT_LENGTH")<>0 then
if Request.form("fieldname").count=0 then
Response.write "您没有选择任何项目!"
else
显示方式1
Response.write "您选择的项目如下:<br>"
for i=1 to Request.form("fieldname").count
Response.write Request.form("fieldname")(i) & "
"
next
显示方式2
Response.write "<br>或表示为:<br>"
Response.write Request.form("fieldname") & "<BR>"
多个域同名时的接收和显示例
•网页内容
显示方式3
Response.write "和以下形式等价:<br>"
for each item in Request.form("fieldname")
Response.write item & " "
next
定义了三个同名
end if
的复选按钮
else %>
<FORM
action="<%=Request.servervariables("SCRIPT_NAME")%>"
method="POST">
<input type="checkbox" name="fieldname" >选项一
<input type="checkbox" name="fieldname" value="ON">选项
二
<input type="checkbox" name="fieldname" value="A">选项三
<BR>
<input type="submit" value="提交">
<% end if%>
多个域同名时的接收和显示例
•验证本例代码时,在浏览器输入地址后,
显示如图所示。
多个域同名时的接收和显示例
•若三项全部选中,则提交后显示形式如图
所示。
单击测试
4.下拉列表框
• 表单中,若列表框设计如下:
<select name="fieldname" size="1">
<option value="博士">博士</option>
<option value="研究生">研究生</option>
</select></p>
•当表单递交时,若没有一项被选中,则浏览器
不发送该项,若选中某一项时,将发送该项的值
(value属性的内容),若设置时没有指出该项的值,
则发送该项的文本(<OPTION>和</OPTION>标签
之间的内容)。
4.下拉列表框
•如果列表框设计如下:
<select name="fieldname" size="1">
<option value="A">博士</option>
<option value="B">研究生</option>
</select></p>
•当选中第一项,即“博士”时,发送的值
为“A”。
5.列表框
• 表单中,若列表框设计如下:
<select name="fieldname" size="3" Multiple>
<option value="博士">博士</option>
<option value="研究生">研究生</option>
</select></p>
• 若没有选中,浏览器不发送该项,若选中,发
送选中内容的列表,形式为“博士,研究生”。
• 此时,服务器端为了列出结果,可以使用如下
形式输出:
For nI=1 to Request.Form("fieldname" ).Count
Response.write Request.form("fieldname")(nI) & "<br>"
next
6.隐藏对象
•隐藏对象的设计形式如下:
< input type="Hidden"
value="abc">
Name="fieldname"
•它的取值取决于value属性的值,在上述形
式中,即值为"abc"。
表单域综合举例
• 网页内容
<%
if Request.servervariables("CONTENT_LENGTH")=0 then
scriptname=Request.servervariables("SCRIPT_NAME")
%>
<html><body>
<p>个人资料</p>
<form method="POST" action="<%=scriptname%>">
<p>姓名:<input type="text" name="name" value="abc">
性别:<input type="radio" name="sex">男
< input type="radio" value=" 女 " name="sex"> 女
</p>
<p>文化程度:
表单域综合举例
• 网页内容
<select name="education" multiple size="3">
<option >博士</option>
<option >研究生</option>
<option value="college">本科</option>
<option value="高中">高中</option>
<option value="middle">初中</option>
</select></p>
<p>爱好:
<input type="checkbox" name="C1" value="A"> 旅游
<input type="checkbox" name="C2" value="ON">音乐
<input type="checkbox" name="C2" value="ON">美术
<input type="checkbox" name="C2" value="ON">烹饪</p>
表单域综合举例
• 网页内容
<p>说明:</p>
<p><textarea
rows="5"
name="t1"
cols="30"></textarea></p>
<p><input
type="submit"
value="
确
定
"
name="B1">&nbsp;&nbsp;
<input type="reset" value="取消" name="B2"></p>
</form>
</body></html><% else %><html><body>
<%
Response.write "服务器端接收到的内容如下:<BR>"
for each fm in Request.form
Response.write fm & "=" & Request.form(fm)& "<BR>"
next
%>
</body></html>
<%end if%>
表单域综合举例
• 浏览时,
首先显示
如图所示
表单域综合举例
• 递交后,根据
表单中各项选
择情况不同,
显示结果也有
所不同,如图
所示。
单击测试
本章小结
• 本章讨论了在ASP网页中实现与用户交
互的方法,主要分成两个方面,即向用
户发送信息,和接收用户发送的信息。
• 网页中除了使用html文档向用户发送静
态信息外,使用ASP内置对象Response的
Write方法向用户发送动态生成的信息。
少量的静态信息也可以作为字符串,使
用Write方法发送。
本章小结
• 为了接收来自用户的信息,可以设计一
个表单,让用户填写。
• 可以指定用户表单信息以两种不同的方
式发送,即GET方式和POST方式。其中
GET方式适合于发送少量不加密的数据,
而POST方式适合于用在需要发送较多信
息的表单中。
本章小结
• 在ASP中使用内置对象Request来接收网
页中或用户在表单中填写的数据。对于
不同的发送方式,接收方式也有所不同。
• 在本章中还讨论了使用Request对象的
Servervariables集合来获得与用户有关的
一些信息,这些信息的获得有利于实现
与用户的交互。
习题
一、问答题
1.下面两行代码是否等价:
<%=“Hello User”%>
<% Response.write “Hello User”%>
2.在使用Response对象的Flush方法之前必须使
用哪一个语句?
3.用户能否被服务器端脚本重定向到另一个Web
站点上的Web页?
4.哪一个VBScript语句可防止浏览器缓存你的
Web页?
5.脚本中怎样求出自已的虚拟路径?
习题
一、问答题
6.是否能同时以GET方式和POST方式向服务器
发送信息?
7.提交的表单中不同类型的表单域是否可以有
相同的名称?
8.如果表单域中没有输入值,或没有被选中的
值,则浏览器是否还发送该项?
9.一个表单中能看到有两个被选中的单选按钮
吗?
10.能发送大量信息的是哪一种发送方式?
习题
二、设计题
1.设计一个网页,当访问日期在2002年12月30
日前重定向到名称为“old.asp”的另一网页。
2.设计一个网页,首先接收用户输入10个字符
串,再显示一个包含列表框的表单,把用户提
交的字符串作为列表框中的选项。
3.设计一个网页,首先显示一个包含姓名输入
框的表单,让用户输入姓名,使用POST方式,
表单提交时附加一个查询字符串“?
try=success”,提交后脚本显示所提交的内容。
习题
二、设计题
4.试设计一个网页,当发现用户使用的是
英文时,显示一英文字符串,当用户使
用的是中文时,显示一中文字符串。
5.自己设计一个表单,用于接收并显示你
能想到的需要提交的信息。