您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页第7章 与用户交互

第7章 与用户交互

来源:爱go旅游网


第7章 与用户交互

当用户在客户端发出请求后,服务器要把用户所需信息发送到客户端,这些信息可能是静态的文本、图片等,也可能是通过执行脚本程序动态生成的。那么,在ASP网页中如何将动态信息发送给客户?以及当客户通过表单提交信息时如何接收呢?为此本章讨论以下内容:

 动态信息插入到HTML文档  缓冲输出及发送其它类型文档  重定向网页

 表单的发送和接收  获取环境变量

通过本章的学习,希望读者能掌握动态信息的输出方式,了解缓冲输出的概念及实现方法,了解输出其它类型文档的方法,学会网页的重定向,熟练掌握表单的发送和接收方法,学会常用环境变量的获取方法。

7.1 发送信息

当客户端浏览器向服务器请求一个HTML文档时,服务器直接将HTML文档发送给浏览器,由浏览器对文档中的内容进行逐项解释,并显示在客户的窗口中。

但是,如果要根据用户的请求信息动态地生成网页,就需要使用ASP的内置对象Response。它可以将来自于用户或来自于数据库、来自于文件的有关信息嵌入到HTML文档中发送到客户端。

7.1.1 将动态信息插入到HTML文档中

通过ASP中的内置对象Response可以实现将需要动态生成的信息嵌入到HTML文档中,也可以通过它向客户端浏览器传递一些其它信息。

1. 少量信息插入

为了将少量信息插入到HTML文档中,(如插入一个变量的值、一个表达式的值),可以使用如下形式:

<%=表达式%> 与之等价的形式为:

<% Response.write 表达式%>

其中,Response是ASP内置的对象名,write是该对象的一个方法。

当HTML文档中插入了这样的动态信息后,你必须将其文件的扩展名改为asp。对于这样的网页文件,当用户请求访问该网页时,服务器端首先会调用相应的脚本引擎来计算该表

VBScript+ASP动态网页制作

达式的值,并将得到的结果信息象一般文档那样插入到原来的HTML文档中,形成临时的HTML文档发送给客户端浏览器。

2. 较多信息插入

但如果一个网页文件中要插入大量的动态信息,一般直接使用一次或多次Response对象的Write方法,例如要显示当前的日期,尽管可以使用上面的方法,写成如下形式:

今天是<%=year(date())%>年<%=month(date())%>月<%=day(date())%>日。 但我们一般写成如下形式: <%

Response.write “今天是”& year(date) & “年” & month(date) & “月” & day(date) & “日” %>

从上面的讨论看出要使用Response对象将一些动态生成的信息插入到网页中,需要使用如下形式:

Response.write 表达式

其中,不管表达式的结果是什么类型,最终都作为字符串插入到网页中。另外,由于这一行是由服务器执行的脚本,它必须包含在<%和%>之间。

【例7-1】在网页中嵌入动态信息

<%@language=VBScript%> <% dim d,m,y d=day(date()) m=month(date()) y=year(date()) %>

显示日期时间

<%

Response.write \"今天是\" & y & \"年\" & m & \"月\" & d & \"日
\" %>

现在时间是<%=time()%>

本例中,第一行指定本页中所使用的脚本语言为VBScript,如果你的网站或者你的网页准备存放到的网站所用的默认脚本语言不是VBScript,则该行是必须的,否则,可以像以后各例中那样省略该行。第2行定义三个变量,第3、4、5行分别求出当前日期对应的年、月、日,赋值给这些变量。在主体部分中指定用6号字显示内容后,用Response的write方法将

• 120 •

第7章 与用户交互

包含年月日的字符串显示出来,换行后又用<%=time()%>的形式输出当前的时间。输出形式如图7-1所示。

图7-1 嵌入动态信息后的网页显示

为了验证本例中的代码,你首先要像前一章中所讨论的那样,创建一个能运行ASP文件的环境,如在Windows 98操作系统中安装个人Web服务器(PWS)。之后,把例中的代码使用文本编辑程序输入,并保存成扩展名为asp的文件,如L7_1.asp,放入到指定目录中,(由于最方便的做法是将这些文件放在Inetpub\\wwwroot目录中,因此,以后说的“指定目录”一般指的就是Inetpub\\wwwroot)。最后启动浏览器,在其地址栏中输入相应地址,如localhost/L7_1.asp。

代码中,如果把单词Response拼写错了,在浏览时,系统会显示缺少对象。如果把write拼写错误,则系统会显示该对象不支持该属性或方式。如果你把网页的扩展名写成htm,则浏览时会显示文件不存在或只显示“现在时间是”这几个汉字。

7.1.2 输出静态信息

我们经常看到如下形式的文档: <% if 条件 then %>

条件满足时发送的文档 <% else %>

条件不满足时发送的文档 <% end if %>

例如:控制某网页在星期天时不能访问的脚本如下 <%

if Weekday(date)=1 then %>

<% else

• 121 •

VBScript+ASP动态网页制作

%>

欢迎您!…

<% end if %>

上面的代码中,由<%和%>括起来的脚本和HTML文档信息几乎占有相同的篇幅,这样,来回在两种形式间进行转换,会给代码阅读带来困难。甚至有的网页中只有少量的HTML文档,这时,我们完全可以考虑把整个文件全部写成脚本形式,方法是把原有的HTML文档部分改成用Response来输出,即把上述代码改为如下:

<%

if Weekday(date)=1 then

Response.write \"\" else

Response.write \"\" Response.write \"欢迎您!„\"

Response.write \"\" end if %>

再看下面形式的一段代码: <% select case tweekday %> <% case 1%> 星期日 <% case 2%> 星期一 <% case 3%> 星期二 <% case 4%> 星期三 <% case 5%> 星期四 <% case 6%> 星期五 <% case 7%> 星期六

<% end select %> 如果改成如下形式:

• 122 •

第7章 与用户交互

<%

select case tweekday case 1

strweek=“星期日” case 2

strweek=“星期一” case 3

strweek=“星期二” case 4

strweek=“星期三” case 5

strweek=“星期四” case 6

strweek=“星期五” case 7

strweek=“星期六” end select

Response.write strweek %>

显然后面一种形式符合一般程序设计语言的表述方式。 再如以下形式的代码: <% dim I I=0 %>

<% do %>

”>使用DO … Loop 循环,  [<% if I<>0 then %>负<%end if%> <%=I%>号字]
<%I=I+1

loop until I>3%> 和如下形式比较: <% dim I I=0 Do

Response.write “使用DO…Loop 循环, [ ” If I<>0 then Response.write “负”

Response.write I & “号字]
” I=I+1

Loop until I>3

• 123 •

VBScript+ASP动态网页制作

%>

后者更象是一个脚本程序。

从上面讨论中,希望读者理解,用Response.write可以将动态的内容插入到静态HTML文档中,但反过来,静态内容也可以用Response.write动态生成,合理地选用,有利于网页文件的阅读和理解。

7.1.3 缓冲输出

有时,我们希望将已经发送给客户的信息作废掉。例如分页输出一个表格时,有可能表头已经输出,而又发现数据库中记录已经结束,此时希望把已经输出的表头删除掉。

为此,在ASP中引入了缓冲输出的概念,即把输出内容先放到服务器的缓冲区中,在适当的时候再发送到客户端。

1. 设置缓冲输出方式

使用Response对象的buffer属性可以设置缓冲输出页面的内容,形式为: Response.buffer=true

这一设置,将告诉服务器,不要把后面的内容(包括HTTP报头)直接送往客户端。这一属性的设置必须放在所有的文档输出之前,即标签之前。

一旦设置完成后,可用一般的HTML文档形式,如: Hello User

也可用Response对象的Write方法,如: <% Response.write “Hello User”%>

来缓冲输出所需内容,即将这些要输出的内容先存入缓冲区。

2. 清除缓冲区的内容

缓冲输出的缓冲区是建立在服务器中的,在缓冲输出方式中,可以把一些已经放入缓冲区的内容清除掉(作废),其形式如下:

Response.Clear

即使用Response对象的clear方法,它清除缓冲区中原有的内容。但这一方法只清除BODY标签之间的内容,所以清除后不必再送入头部信息,就可输出新的网页。

3. 输出缓冲区中的内容

在缓冲输出方式下,要将缓冲区中的内容发送到客户端,可使用Response对象的Flush方法来实现,形式如下:

Response.Flush

它把缓冲区内容立即送往客户端输出。

4. 结束输出

可以使用Response对象的end方法来结束输出,执行到该语句时,系统将已经送往缓冲区中的内容发送到客户端浏览器输出,并通知浏览器文档已经结束。形式为:

Response.End

• 124 •

第7章 与用户交互

其后的文档或脚本输出均无效。 【例7-2 】使用缓冲输出例

<%@language=VBScript%> <%

Response.buffer=true %>

这是一行客户端看不到的内容 <%

Response.write \"这是第二行看不到的内容\" Response.clear

Response.write \"这是客户端能看到的第一行内容
\" %>

这是看到的第二行内容
<% Response.flush

Response.write \"这是看到的最后一行内容
\" Response.end %>

这是结束后输出的一行内容,客户端看不到这行内容。

在验证本例中的代码时,同样要使用任一文本编辑器输入例中的代码,考虑到阅读方便,代码中用了较多的汉字,在你输入验证时,完全可以使用一些自己能理解的英文或符号代替一下。输入完成后,必须使用扩展名为asp的文件存盘,并保存到指定的目录中。之后才能打开浏览器,输入地址,观看结果。正确输出结果如图7-2所示。

图7-2 缓冲输出

• 125 •

VBScript+ASP动态网页制作

7.1.4 输出内容指定

我们常说当浏览器请求一网页时,服务器会将一个HTML文档发送给客户端浏览器,但服务器也可以使用Response对象的ContentType属性指明向浏览器发送的是其它类型的文档。指明发送给客户端浏览器的是什么类型的文档,可使用如下形式:

Response.ContentType[=内容类型] 内容类型的书写格式为:“类型/子类型”,如默认值为“text/HTML”,可以是“text/plain”表示纯文本,“application/msword”表示WORD文档,还可以是“image/GIF”表示GIF图片等。

1. 输出文本文件

要想向客户端发送文本文件,使用如下形式的指定: Response.ContentType=“text/plain”

要注意的是,这一行必须放在输出任何内容之前。 【例7-3 】输出纯文本文件

<% @LANGUAGE = VBScript %> <%

Response.ContentType = \"text/plain\" %> 你好:

你看到的是纯文本文件,它不识别HTML的标签。 请注意这里的
标志并不处理成换行。

要验证本例中的代码,你需要记住,文件的扩展名也必须用asp,并把文件存放在指定的目录中,执行结果如图7-3所示。

图7-3 输出纯文本文件

2. 输出Word文档

• 126 •

第7章 与用户交互

【例7-4 】输出Word文档

<% @LANGUAGE = VBScript %> <%

Response.ContentType = \"application/msword\" %> 用户好:

这一信息将直接使用MS Word来显示,并且你能直接修改和保存它。 注意:在这里原来的象
这样的HTML标签不被处理成换行。

验证本例中的代码时,当在浏览器中输入地址后,客户端会启动Word程序来打开具有上述内容的网页,如图7-4所示,此后你可以编辑并保存它的内容。

图7-4 发送WORD文档

7.1.5 重定向用户

当某个用户来访问你的网站时,你可能希望它首先访问某一网页,如访问用于输入用户名、口令等信息的网页。但如果他试图跳过这些必要的检查而直接去访问某些网页时怎么办。这里提供一种强制让用户转到某一页的手段。

使用Response对象的redirect方法可以把用户引导到指定的某个网页。形式如下: Response.redirect 网页地址

其中,网页地址可以是本地的,也可以是其它服务器的地址。例如: Response.redirect “Login.asp”

这里,Login.asp是已经存在的网页文件名。在网页文件名后还可以用“?”带上查询字符串,对此在下一节将进行深入的讨论。

注意:redirect方法必须在输出任何信息之前使用,即必须放在标签之前。

7.1.6 其它属性和方法

除了以上讨论的属性和方法外,Response对象还有一些其它属性和方法,分别讨论如

• 127 •

VBScript+ASP动态网页制作

下:

1. Expires属性

设置网页的失效时间,单位是分钟,形式如下: Response.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属性来判断用户是否已经离开,一旦用户离开,则网页中的脚本就不应继续执行。

【例7-5 】使用IsClientConnected属性

<% i=0 do

if i mod 10=0 then Response.write \"
\" & i/10 & \":\" i=i+1

Response.write \"Hello!\"

loop until not(Response.isclientconnected) %>

本例中重复显示Hello!,(每10个一行),直到按下浏览器的停止按钮。注意:这一属性的值实际上是在上一次使用write方法时设置的。

• 128 •

第7章 与用户交互

4. CacheControl属性

本属性用于指出是否允许代理服务器缓存该页的内容,缺省值为FALSE。允许代理服务器缓存该页能提高访问速度,但有可能让用户得到过时的内容。

5. AppendToLog方法

AppendToLog 方法用来将一个字符串添加到Web服务器日志条目的末尾。这一方法主要用于记录访问该网页的用户,及相应的访问时间等,以便于通过其它应用程序来统计。使用形式如下:

Response.AppendToLog 字符串

根据日志文件的格式要求,字符串中不能包含逗号,并且字符串最长不能超过80个字符。

7.2 接收信息

有时,你希望通过网页来接收用户的一些信息,如用户输入的用户名、口令,用户对你的网页的评价,用户请求帮助的一些信息。为此,ASP中内置了一个对象Request,它封装了所有用户的请求和表单信息。

另外,根据HTTP协议的规定,用户发送表单有两种方式,即GET和POST方式,对于这两种不同的方式,在ASP中接收信息的处理方式也有所不同,所以本节中将分别讨论这两种方式下的接收和发送问题。

7.2.1 接收用户通过GET方式发送的信息

要让用户通过GET方式向服务器发送信息,常用的形式是,首先让用户填写一个表单,用户填写完成后,单击提交按钮,由浏览器组成查询字符串发送给服务器,再由服务器中某一指定文件来接收并处理。这一过程中,涉及到两个部分的内容,一个是表单的设计与显示,另一个是接收数据部分的设计。以下分别进行讨论。

1. 表单设计

若要设计一个表单,用于输入姓名和口令,形式如下:

姓名:

口令:

从上述形式中可以看出,要想以GET方式发送表单信息,表单设计部分的FORM标签中需要指出两个方面的内容:

(1) 指出表单中填入数据后,以什么方式发送给服务器。它是用method属性指出,它可以取两种不同的值,即GET和POST,在这里它的值设置为GET,即指出以GET方式发送

• 129 •

VBScript+ASP动态网页制作

表单中填写的信息。

(2) 指出接收表单数据的文件名,它用action属性来指出,这里使用一个名为“abc.asp”的文件。如果你的网页中除了使用ASP技术外,还要使用其它技术,如CGI、IDC等,这时,在action属性中可能使用像abc.exe、abc.cgi或abc.idc等这样的文件名。

有时你还可以给表单起一个名称,使用FORM标签的name属性,形式如下: name=myform

给表单命名,在客户端脚本中是常见的。关于客户端脚本请参见第5章的有关内容。

2. 接收表单数据

浏览上述形式的网页时,将显示等待输入的一个文本框和一个密码框,如图7-5所示。 此时,若用户输入相应信息,并单击提交按钮时,浏览器将发送信息给服务器,服务器通过指定的网页文件来接收信息。对于上述表单,指定abc.asp来接收和处理数据。那么,接收数据的网页文件如何设计呢?

设计用于接收表单信息的网页文件中,关键是如何获得用户在表单域中输入的数据,对此,可以使用ASP内置对象Request来实现,要得到以GET方式发送的表单域中的信息可以使用如下形式:

Request.querystring(\"表单域的名称\")

例如使用Request.querysting(\"username\")可获得名称为username的表单域的值。其中,Request 是ASP中内置对象,querystring称为该对象的集合。由于它的中文含义是查询字符串,所以,我们常常把以GET方式发送的表单信息称为发送的查询字符串。

另外,在不至于引起混淆的场合也可以把读取表单域信息的形式简写成如下形式: Request(\"表单域的名称\")

图7-5 发送信息的表单

【例7-6 】GET方式发送和接收信息

本例中需要使用两个文件,一个文件用于显示表单,另一个文件用于接收表单信息。 (1) 显示表单的文件L7_6.html

• 130 •

第7章 与用户交互

姓名:

口令:

(2) 接收表单信息的文件L7_6.asp

<%

name=Request.querystring(\"username\")

password=Request.querystring(\"userpassword\") %>

你的名字是:<%=name%>
你的口令是:<%=password%>

验证本例时需要分别输入并保存这两个文件到指定目录中,前一个文件可以用htm或html作为扩展名,如L7_6.html,后1个文件必须用asp作为扩展名,文件名必须同前一个文件中所指定的文件名L7_6.asp一致,如果要改用其它文件名,则需要修改前一个文件的form标签中action属性的值。

浏览本例中网页时,首先打开浏览器,输入网页地址,显示如图7-5所示的表单。 接着,在表单中输入,如姓名框中输入“abc”,口令框中输入“123”,并单击提交,显示如图7-6所示。

图7-6 接收表单后的显示

注意:即使本例中第1个文件使用htm或html作为扩展名,浏览时也不能通过在文件夹窗口中双击文件图标来实现,否则,在提交表单时,将显示要求下载文件的错误提示。

• 131 •

VBScript+ASP动态网页制作

3. 合并两个文件

可以看出,实现表单显示和接收表单信息是实现交互的不可分割的部分,而用两个文件来实现,对于文件的管理将带来困难,并且不便于修改,为此,我们来考虑怎样将两个文件合并成一个文件。

首先,若把这两个部分合并成一个文件后,当文件被第一次访问时,应执行显示表单部分,而当表单内容输入后提交时,执行接收表单信息的部分。根据访问该网页时是否同时发送了表单信息,可以判断出该网页是不是第一次访问。为此,可以使用如下形式条件表达式:

Request.servervariables(“QUERY_STRING”)<> “”

当它为FALSE时,表示访问网页时没有同时发送查询信息,而当它为TRUE时,表示在请求网页时,同时发送了表单信息,可以断定很有可能该网页第二次被访问。注意,不等号右侧是不包含任何字符的空串。

【例7-7 】用同一个文件显示表单和接收表单信息

<% if Request.servervariables(“QUERY_STRING”)<>”” then name=Request.querystring(\"username\")

password=Request.querystring(\"userpassword\") %>

你的名字是:<%=name%>
你的口令是:<%=password%> <% else %>

姓名:

口令:

<%end if%>

读者在验证本例时,可能发现执行结果不正确,实际上,在设计表单时,已经假设表单的信息是发送给文件“L7_7.asp”,因此,合并后,如果你给它起的文件名不是“L7_7.asp”,当浏览网页时,表单中输入的信息实际上并没有发送给自身文件 。

为了指出表单中数据是发送给文件本身,可以使用如下形式: <%=Request.servervariables(“SCRIPT_NAME”)%> 这样,可以把上述网页改为例7-8中的形式。 【例7-8】表单信息发送给网页本身。

<%

if Request.servervariables(“QUERY_STRING”)<>”” then

Response.write “你的名字是:” & Request.querystring(\"xm\") & \"
\"

• 132 •

第7章 与用户交互

Response.write “你的口令是:” & Request.querystring(\"kl\") else %>

\" method=\"get\" >

姓名:
口令:

<%end if%>

上述代码不管以什么文件名保存,只要扩展名为asp,并存放到指定目录中,浏览时都能得到如图7-7所示结果,输入表单信息后单击提交,如姓名框输入“a”,口令框输入“1”,最终得到如图7-8的显示结果。

图7-7 发送信息到自身 图7-8 接收信息后的显示

注意:在将例7-7中的代码改为例7-8中的代码时,对内容作了较大的调整,特别要注意的是表单域的名称已经改成“xm”和“kl”了。如果没有注意这一点,接收数据部分会接收不到数据。这也说明设计表单和接收表单数据密切相关。

4. 直接使用查询字符串

在验证例7-8中代码时,当你在表单中输入信息,并提交后,会发现在显示结果的同时,浏览器的地址栏中在文件名后自动添加了“?”开始的一串字符,见图7-8,这些内容我们称为查询字符串。那么,在浏览网页时是否可以不让它显示表单,而直接在地址栏中输入查询字符串呢?答案是肯定的。对于例7-8中的网页,可以直接在地址栏中输入如下内容:

localhost/L7_8.asp?xm=abc&kl=123 其中,“?”前面部分为网页地址,也称“URL”,后面部分为查询字符串,结果如图7-9所示。

• 133 •

VBScript+ASP动态网页制作

图7-9 直接输入查询了符串

注意,这种方式发送的信息只能用Request对象的querystring集合来读取。 5. 重定向到其它网页

有时,可能希望在网页中提供搜索功能,这时,可以通过其它著名的搜索网站来实现,如Yahoo!,实现的完整代码如下:

【例7-9 】重定向到其它网站

<%@ 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 else %>

\" method=\"get\" >

输入要搜索的字符串

<%end if%>

本例中,首先显示一个供输入需要搜索的字符串的表单,当单击提交后,该表单信息发送给网页本身,处理后再重定向到其它网站。代码中通过第4行获得表单中输入的内容,即查询字符串,放入到变量searchstr中,第5行判断查询字符串是否为空,若不为空,第6、7两行构成对Yahoo!网站的请求串,第8行使用重定向方法转向Yahoo!网站,并同时发送查询字符串。

• 134 •

第7章 与用户交互

如果你使用的环境不能直接访问Yahoo!网站,则本例无法运行成功,但可以从浏览器的地址栏中看出最终向Yahoo!网站发送的信息。

6. GET方式总结

可以看出,由于GET方式是把表单中的信息附加到URL发送到服务器,这样,一方面可能有一些需要保密的东西可能被其它人发现,另一方面,这种方式只适合于发送少量信息。

7.2.2 接收通过POST方式发送的信息

当你需要让用户安全地提交大量信息时,可以使用POST发送方式。

和GET方式类似,以POST方式传递数据时也涉及到表单设计和接收表单数据两部分内容,所不同的是,在以POST方式传递信息时一定要有表单。

1. 表单设计

以下还是以输入姓名和口令的表单为例,设计如下:

姓名:
口令:

从上述形式中看出,和GET方式下不同的只时form标签的method属性的设置,它指出发送表单中数据的方式是“POST”方式。

2. 接收表单输入

为了接收使用POST方式发送的表单信息,可以使用Request对象的form集合,形式如下:

Request.form(\"表单域的名称\")

例如Request.form(“username”)可用于接收用户在名为username的表单域中填入的数据。 有时,为了判断用户是否用POST方式的表单发送了信息,同GET方式类似,可以用如下形式:

Request.servervariables(\"CONTENT_LENGTH\")<>0

当条件为真时,表示发送了信息,而当条件为假时,表示没有发送信息,如例7-10所示。

【例7-10】POST方式发送和接收表单

<%@language=VBScript%> <%option explicit dim name,age

if Request.servervariables(\"CONTENT_LENGTH\")=0 then %>

• 135 •

VBScript+ASP动态网页制作

\" method=\"POST\" >

姓名:
年龄:

<%else %> <%

name=Request.form(\"txtName\") age=Request.form(\"txtAge\") %>

<%=name%>,你好!
你今年<%=age%>岁.
<%end if%>

验证本例中的代码时,你必须先使用文本编辑程序输入并以asp 作为扩展名存放到指定目录,之后启动浏览器,输入地址。

浏览时,首先在浏览器窗口显示表单供用户填写,如图7-10所示。

图7-10 POST方式发送的表单

当用户输入内容后,如姓名框中输入“张三”,年龄框中输入“23”, 单击提交按钮,则显示结果如图7-11所示。可以看出,在显示结果时,地址栏中没有发生变化,这就是和GET方式形式上的不同点。

• 136 •

第7章 与用户交互

图7-11 表单接收后的显示

3. 混合发送方式

有时,我们希望通过表单,既以POST方式发送一些信息,又通过GET方式传递一些信息,这时,可以将要传递的一些信息放在

标签的action属性中。如例7-11所示

【例7-11 】同时使用POST方式和GET方式发送数据

<%@language=VBScript%> <%option explicit dim qs,fm

if Request.servervariables(\"CONTENT_LENGTH\")=0 then %>

?bh=0001\" method=\"POST\" >

姓名:
年龄:

<% else %> <%

Response.write \"以GET方式发送的内容如下:
\" for each qs in Request.querystring

Response.write qs & \"=\" & Request.querystring(qs) & \"
\" next

Response.write \"以POST方式发送的内容如下:
\"

• 137 •

VBScript+ASP动态网页制作

for each fm in Request.form

Response.write fm & \"=\" & Request.form(fm)& \"
\" next %>

<%end if%>

例7-11中,如果文件以L7_11.asp存盘的话,

标签中的内容相当于:

可以看出,这样的形式,将表单信息以POST方式发送给目标文件的同时,以GET方式传递了一个bh=0001的信息。

例中为了输出客户端发送过来的表单信息,使用了两个循环,前一循环对Request对象的querystring集合中的各元素进行一次循环,输出其中所有名称及对应值,这些内容实际上是以GET方式发送的信息。后一循环对Request对象的form集合中的元素进行一次循环,输出其中所有的名称及对应的值,这些内容实际上是以POST方式发送的表单内容。

运行本例时,输入地址后,首先浏览器显示如图7-12所示的表单,当在表单中输入内容后,如姓名框中输入“张三”,年龄框中输入“20”,单击提交,显示如图7-13所示。

图7-12 混合方式的初始显示 图7-13 接收表单后的显示

4. POST方式总结

POST方式传递信息时,不把它放入地址栏,这样相对比较安全,另外POST方式可以传递相对较多的数据。

7.2.3 环境变量

环境变量是Request对象的另外一个集合,通过它,可以获得有关服务器的一些信息和用户发送请求时浏览器通过HTTP报头传送的一些信息。求某个环境变量值的一般形式为:

Request.servervariables(“环境变量名称”) 实际上,这种形式在前面的一些例子中已经出现过。以下分别讨论常用的各种环境变量。

• 138 •

第7章 与用户交互

1. 获得当前脚本的虚拟路径

获得正在执行的脚本虚拟路径的作用是自我引用Web页,当要求把表单提交到Web页本身时,不管Web页放在哪个目录下,都可以使用服务器环境变量SCRIPT_NAME。要求出当前脚本的虚拟路径,可使用形式如下:

strURL=requeset.servervariables(“SCRIPT_NAME”)

而要指出将表单发送给自身文件,可将form标签的action属性指定如下形式: action=“<%=Request.servervariables(“SCRIPT_NAME”)%>” 对此,在本章的前面一节中已经使用过了,参见例7-8。

2. 找出用POST方式发送的信息长度

通过服务器环境变量,可以求得的另一项重要信息,即在请求该网页时,同时是否有以POST方式发送的表单信息,对应的环境变量名为CONTENT_LENGTH。若它的值不为零,则表示有。要获得表单中发送的信息的长度可使用如下形式:

Request.ServerVariables(“CONTENT_LENGTH”)

而要判断是否使用POST方式发送了信息,使用如下形式的条件表达式: Request.servervariables(“CONTENT_LENGTH”)<>0 表达式为真表示有,假表示没有,参见例7-10。

3. 找出用GET方式发送的查询串

通过环境变量也可得到使用GET方式发送的信息,使用形式为: querystr=Request.ServerVariables(“QUERY_STRING”)

若它的值不是空串,则表示有相应的信息(称为查询串)发送了,若要写在if语句中作为条件,可写成:

Requeset.servervariables(“QUERY_STRING”)<> “” 或写成:

Len(Requeset.servervariables(“QUERY_STRING”))<>0 请参见例7-7。

4. 获取HTTP报头信息

HTTP报头中包含客户本身的附加信息,如:浏览器的名称和版本、用户选择的语言、运行的平台、接受的文件类型等。要检索HTTP报头信息可以采用两种形式,即:

获得所有信息:ALL_RAW

获得个别信息:HTTP_报头名称 要获得所有信息,使用形式为:

Request.ServerVariables(“ALL_RAW”)

得到的信息是一个包含回车的字符串,为了将该结果以网页的形式输出,可以用以下形式的替换函数,将所有回车换行以
代替,形式为:

Replace(原字符串,vbCrLf,“
”)

以下是为了输出所有HTTP报头内容的简单网页:

• 139 •

VBScript+ASP动态网页制作

<%=Replace(Request.ServerVariables(\"ALL_RAW\"),vbCrLf,\"
\")%>

结果显示形式如下(NT上本机的浏览器)。 Accept: */*

Accept-Language: zh-cn Connection: Keep-Alive Host: 168.168.168.168

User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)

Cookie: ASPSESSIONIDQQQGQQFN=GOLPCBOAKMGKCKFBOPBJBJBJ Accept-Encoding: gzip, deflate

要获得个别报头的信息,可使用如下形式:

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. 获得用户喜欢的语言

有时,为了显示符合用户语言的网页,需要了解客户端喜欢使用的语言。实际上,在每

• 140 •

第7章 与用户交互

一个请求中,浏览器都用Accept_Language报头向服务器传送语言的缩写,服务器可通过该属性得到客户端使用的语言,形式为:

Request.ServerVariables(“HTTP_ACCEPT_LANGUAGE”) 返回值的形式为:LA-CO,其中LA是语言的缩写,CO是国家的缩写,中文使用ZH_CN。

9. 获取请求的域名

可以在同一个虚拟服务器上挂接两个或两个以上的域。这时,知道客户请求的是哪个域就很重要了。服务器的域名可以从环境变量SERVER_NAME检索到。形式如下:

Request.ServerVariables(“SERVER_NAME”) 这里需要事先申请域名服务。

【例7-12 】获得全部环境变量的值。

<%@ language=VBScript%>

<%for each name in Request.servervariables%>

<%next%>
环境变量名环境变量的值
<%=name%><%=Request.servervariables(name)%>

本例代码在浏览器上浏览结果如图7-14所示。

7.2.4 不同类型表单域的数据接收

前面我们已经讨论了接收表单信息的方法,但是当用户在表单中输入一些符号或选择某一项时,浏览器最终向服务器发送了什么信息呢?实际上这与表单的设计有关,以下分别讨论各种不同类型表单域的有关内容。

为了验证以下叙述的内容,可以设计如下形式的接收表单信息的网页进行测试。 【例7-13 】用于接收表单信息的网页

<%

Response.write \"表单域fieldname的值为\" & Request.form(\"fieldname\") & \"
\" Response.write \"长度为\" & len(Request.form(\"fieldname\")) & \"
\"

• 141 •

VBScript+ASP动态网页制作

if isnull(Request.form(\"fieldname\")) then Response.write \" 返回空\" end if %>

图7-14 显示所有环境变量的值

1. 文本框、口令框和文本区域

表单中,若要放置一个单行文本框,一般有如下几种形式:

其中第二种形式下,初始状态文本框中将出现“abc”,不管什么情况,当表单被提交时,若文本框内容为空,则浏览器不发送该表单域中的信息,这样接收程序若用如下形式Request.form(“表单域名称”)求该表单域值时,将返回长度为0的空字符串。而若文本框中有内容,则接收到的就是其中的内容。注意,有时文本框中可能已经输入了几个空格,这时服务器端接收到的是含若干空格的空白字符串。

【例7-14 】发送文本框的内容

请输入或选择表单域的值,然后单击提交:

验证本例时,必须先输入例7-13的代码,以asp作为扩展名,保存成L7_13.asp,再输

• 142 •

第7章 与用户交互

入本例中代码,可以以任一文件名保存成htm、html或asp文件,并和asp文件一样存放到指定的目录,之后再启动浏览器,在地址栏输入本例网页地址,显示如图7-15所示。

图7-15 发送文本框内容的表单

接着,在表单中输入内容后单击提交按钮,如输入“abc”,则结果显示如图7-16所示。

图7-16 接收文本框内容后的显示

有了本例中的代码后,为了验证本小节中的其它表单域的情况,只需用相应形式代替例7-14的代码中的第4行内容即可。

口令框和文本框类似,它的设计形式如下:

尽管输入时在该类型的框中显示的是“*”,设置的初值也被显示为相等个数的“*”,但内部的处理类似于文本框,即输入了什么,将接收到什么,若没有任何输入,则浏览器将不

• 143 •

VBScript+ASP动态网页制作

发送该项。

对于文本区域,尽管设计时形式有所不同,但还是可以分成两种,即有初值和无初值:

不管是否有输入,浏览器总是将该域发送给服务器,这样服务器接收到的就是表单域中实际的内容。实际上它至少包含一个换行符。

2.单选按钮

表单中,若要放置一组单选按钮,设计形式主要有如下几种:

当表单递交时,若该按钮没有被选中,则不发送该项;若被选中,第一种形式中发送一个“on”,第二、第三种形式中发送其值(value属性的值)为“男”。

3.复选按钮

表单中,复选按钮设计主要有如下几种形式:

当表单递交时,若该按钮没有被选中,则不发送该项;若被选中,第一种形式发送的值为字符串“on”,第二种形式发送的值为字符串“ON”,第三种形式发送的值为字符串“A”。 若一个表单中有多个同名的复选按钮被选中时,将发送一个集合给服务器。这时,你可以通过Request.form(“fieldname”)的Count属性得到有多少项被同时选中,并使用如下形式得到选中的第i项的值:

Request.form(“fieldname”)(i)

如果直接用Request.form(“fieldname”)输出,则得到的是用“,”分隔的选中各项值的列表。

你还可以像其它集合那样用for each循环来输出选中的各项值。形式如下: for each item in Request.form(“fieldname”) Response.write item next

【例7-15 】多个表单域同名时的接收和显示。

<%

if Request.servervariables(\"CONTENT_LENGTH\")<>0 then if Request.form(\"fieldname\").count=0 then Response.write \"您没有选择任何项目!\" else

Response.write \"您选择的项目如下:
\" for i=1 to Request.form(\"fieldname\").count

• 144 •

第7章 与用户交互

Response.write Request.form(\"fieldname\")(i) & \" \" next

Response.write \"
或表示为:
\"

Response.write Request.form(\"fieldname\") & \"
\" Response.write \"和以下形式等价:
\"

for each item in Request.form(\"fieldname\") Response.write item & \" \" next end if else %>

\" method=\"POST\"> 选项一

选项二 选项三
<% end if%>

验证本例代码时,在浏览器输入地址后,显示如图7-17所示。若不选中任何项直接提交,显示不变,即代码中第2行的条件仍为假,若三项全部选中,则提交后显示形式如图7-18所示。

图7-17 多个域同名的表单 图7-18 多个域同名的表单的接收

4.下拉列表框

表单中,若列表框设计如下:

当表单递交时,若没有一项被选中,则浏览器不发送该项,若选中某一项时,将发送该

• 145 •

VBScript+ASP动态网页制作

项的值(value属性的内容),若设置时没有指出该项的值,则发送该项的文本(标签之间的内容)。

如果列表框设计如下:

当选中第一项,即“博士”时,发送的值为“A”。

5.列表框

表单中,若列表框设计如下:

若没有选中,浏览器不发送该项,若选中,发送选中内容的列表,形式为“博士,研究生”。此时,服务器端为了列出结果,可以使用如下形式输出:

For nI=1 to Request.Form(\"fieldname\" ).Count

Response.write Request.form(\"fieldname\")(nI) & \"
\" next

6.隐藏对象

隐藏对象的设计形式如下:

它的取值取决于value属性的值,在上述形式中,即值为\"abc\"。 【例7-16 】各种形式的表单域

<%

if Request.servervariables(\"CONTENT_LENGTH\")=0 then scriptname=Request.servervariables(\"SCRIPT_NAME\") %>

个人资料

\">

姓名: 性别:

文化程度:

爱好:

旅游 音乐 美术 烹饪

说明:

  

<% else %> <%

Response.write \"服务器端接收到的内容如下:
\" for each fm in Request.form

Response.write fm & \"=\" & Request.form(fm)& \"
\" next %>

<%end if%>

浏览时,首先显示如图7-19所示,根据表单中各项选择情况不同,显示结果也有所不同,如图7-20所示。

本章小结

本章讨论了在ASP网页中实现与用户交互的方法,主要分成两个方面,即向用户发送信息,和接收用户发送的信息。

网页中除了使用HTML文档向用户发送静态信息外,使用ASP内置对象Response的Write方法向用户发送动态生成的信息。少量的静态信息也可以作为字符串,使用Write方法发送。

为了接收来自用户的信息,可以设计一个表单,让用户填写。在网页中,可以指定用户表单信息以两种不同的方式发送,即GET方式和POST方式。其中GET方式适合于发送少量不加密的数据,而POST方式适合于用在需要发送较多信息的表单中。在ASP中使用内

• 147 •

VBScript+ASP动态网页制作

置对象Request来接收网页中或用户在表单中填写的数据。对于不同的发送方式,接收方式也有所不同。

在本章中还讨论了使用Request对象的Servervariables集合来获得与用户有关的一些信息,这些信息的获得有利于实现与用户的交互。

图7-19 多个表单域的表单 图7-20多个表单域的接收

习题

一、问答题

1.下面两行代码是否等价: <%=“Hello User”%>

<% Response.write “Hello User”%>

2.在使用Response对象的Flush方法之前必须使用哪一个语句? 3.用户能否被服务器端脚本重定向到另一个Web站点上的Web页? 4.哪一个VBScript语句可防止浏览器缓存你的Web页? 5.脚本中怎样求出自已的虚拟路径?

6.是否能同时以GET方式和POST方式向服务器发送信息? 7.提交的表单中不同类型的表单域是否可以有相同的名称?

8.如果表单域中没有输入值,或没有被选中的值,则浏览器是否还发送该项? 9.一个表单中能看到有两个被选中的单选按钮吗? 10.能发送大量信息的是哪一种发送方式?

二、设计题

• 148 •

第7章 与用户交互

1.设计一个网页,当访问日期在2002年12月30日前重定向到名称为“old.asp”的另一网页。

2.设计一个网页,首先接收用户输入10个字符串,再显示一个包含列表框的表单,把用户提交的字符串作为列表框中的选项。 3.设计一个网页,首先显示一个包含姓名输入框的表单,让用户输入姓名,使用POST方式,表单提交时附加一个查询字符串“?try=success”,提交后脚本显示所提交的内容。

4.试设计一个网页,当发现用户使用的是英文时,显示一英文字符串,当用户使用的是中文时,显示一中文字符串。

5.自己设计一个表单,用于接收并显示你能想到的需要提交的信息。

• 149 •

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务