ASP为动态网页编程提供的一个环境。这个“环境”,怎么讲呢,是这样的,在ASP中,你可以使用VBScript、JavaScript,甚至是你喜欢的别的语言,你可以使用这些语言本身来进行运算和流程处理、对象创建和操作,同时通过ASP所提供的环境来和客户端进行交互。
如果将整个的过程比作一个人来讲,那么我想,ASP所提供的对象环境就是人的四肢和感官,VBScript就是人的大脑,大脑通过神经从感官获得信号,作出判断后,指挥四肢来完成反馈。
在上一章,我们简单介绍了大脑—VBScript的一些编程特性,这章我们就来讲一讲ASP的网站特性,即ASP的内部对象和常见组件的使用。
简而言之,Respose对象是ASP的“嘴”,使用Response对象可以从服务器向用户发送输出的结果。
在ASP中Response对象可以用于控制向客户端传输信息,这个信息不仅仅是我们看到的网页,另外Response对象还可以发送HTTP头信息。HTTP头信息是什么呢,打个比方来说,在HTTP头中包含了浏览器缓存当前获得的网页的时间标志,那么我们可以通过Respoonse对象来向浏览器发送禁止缓存的标志,再如,我们常见的Cookies信息,也是通过Response来发送的。
在讲解对象的方法和属性前,我先告诉你这两者有什么不同,用一种便于理解的方式形容,那么“方法”是一个“动词”性的操作,“属性”是一个“名词”或者“形容词”性的描述。请允许我用书本前面的你来举例,你会走,会跑,会说话,那么“走”、“跑”和“说话”就是你所具有的方法,而你今年20岁,正值风华正茂,你身高180cm,那么这里我所说的20岁、180cm就是你所具有的属性。
我们以Response对象来说,它具有这样几种常用的方法:
l BinaryWrite 向浏览器输出二进制(Binary)的内容。
l Clear 清除已缓冲的HTML输出。
l End 停止处理当前的页面,并返回当前的结果。
l Flush 立即发送已缓冲的HTML输出。
l Redirect 把用户重定向到另一个URL。
l Write 向输出写指定的字符串。
他还有这样几种常用的属性:
l Buffer 规定是否缓冲页面的输出
l Charset 将字符集的名称追加到Response对象中的content-type头部。
l ContentType 设置Response对象的HTTP内容类型。
l Expires 设置页面在失效前的浏览器缓存时间。
l ExpiresAbsolute 设置页面缓存失效的日期和时间。
l IsClientConnected 指示客户端是否已从服务器断开。
下面我们来看下这些方法和属性具体是如何使用的,注意这里与上面不同的是,我不再以英文字母的排序来讲解上面的方法和属性,我将以我平时使用它们的频繁程度来依次说明,你可以从此对各种方法属性的使用频繁程度有一个简单的了解。
首先来看Response对象的Write方法,他用于向浏览器输出一个字符串,在前面你已经接触过他了,他是这样使用的:
Response.Write("这里是输出的字符串。")
这样一个语句,会向浏览器输出“这里是输出的字符串。”字样,你可以将这段语句保存为write.ASP浏览器中浏览,此时你将看到如上的字样,同时,使用浏览器的“查看源代码”功能,你也可以发现,这个源代码除了“这里是输出的字符串。”之外什么都没有,他并不包含HTML代码的任何部分,因此,如果你想向客户输出完整的HTML代码,则需要一并写在Response.Write中。
而后我们再来对比的看Response.BinaryWrite方法,他与Write方法类似,也是向浏览器端输出信息,不过他们二者的不同在于,Response.Write方法输出文本,而Response.BinaryWrite方法输出二进制内容。这个方法使用的比较少,他一般用于向浏览器端传输文件时使用,比如某些下载网站的防盗链功能,就是通过将文件链接到一个ASP文件,在这个文件中首先检测是不是盗链,如果不是盗链,那么从服务器读出文件的二进制代码,并通过Response.BinaryWrite方法输出给客户端的。
下面来看Response.Redirect方法,Redirect方法顾名思义,他的作用是将浏览器的访问重定向到另一个页面,我们在实际的编程中,经常用到经过某些操作后,将用户导入另一个页面,比如,我们对用户的年龄进行了判断,如果他的年龄大于18岁,那么将其导向到adult.ASP页面,这时使用Response.Redirect方法的代码如下:
Response.Redirect("adult.ASP")
当使用Response.Redirect方法后,实际上ASP向浏览器发送了一个HTTP 301的重定向的HTTP头,浏览器会根据这个HTTP头重新请求新的页面,请你记住这个特征,在后面我们还会提到并将其与Server.Transfer方法进行比较。
接下来我们要提到一组方法,他们是Flush、End以及clear方法。
为什么将这三者放在一起讲解呢,因为他们都涉及了IIS的缓存操作。你已经知道,IIS是运行ASP的网站服务器软件,当ASP对网页内容进行输出处理时,实际上是将网页的输出事先放置在在IIS的一个缓冲区内,等到需要发送给用户的时候才统一发送,这样做的好处是毫无疑问的,他避免了多次输出的通讯开销,这个过程可以用图8.1来清晰的对比出来。
图8.1
当不使用缓存时,每次使用Response.Write方法时,都会向客户端传送一段信息,在这个传送的过程中,就要重新的进行一次tcp通讯,因此,通讯的开销就包括了要传送的信息本身以及服务器和浏览器通信的开销,而将信息缓存下来并在需要的时候发送,此时相当于仅进行了一次的通信,相对多次输出来说,节省了很多的连接的开销。
下面回到我们的讲解中来,这三个方法的含义分别是,Flush—立即输出当前缓冲内容,并继续进行页面后续代码的处理,End—立即输出当前缓冲内容,并终止后续处理,Clear—清除当前的缓冲内容。
我用代码来说明这三者的用法,在这之前我们做两个假设,首先是,假设当前页面已经开启了缓冲,另外的假设是,当我的代码中出现wait()这个函数时,程序将会暂停5秒钟再继续下面的处理(很遗憾的,在ASP中我们无法使用这样的等待函数,这里仅为了讲解方便而模拟了程序需要长时间的处理)。
<%
For i = 1 To 10
Response.Write(i)
Next
%>
这段程序由于使用了缓冲,会将输出的字符串“12345678910”同时输出到浏览器。
<%
For i = 1 To 10
Response.Write(i) '输出内容会被加入到缓冲区
Response.Flush '缓冲区的内容会被立即传送给客户端
Wait() '假设系统有5秒钟的停顿
Next
%>
这段程序由于在每一次输出到客户端时都调用了Flush方法,因此当你输出一个数字后,浏览器将会立即得到这个数字,这段程序运行时,会首先输出1,然后停顿5秒钟,然后输出2……
<%
For i = 1 To 10
Response.Write(i) '输出
If i >5 Then '如果i大于5
Response.End() '则终止
End If
Next
%>
这段代码中使用了End方法,他的运行结果是这样的,你只会看到“12345”,当循环进入i=6这个环节时,当进入If的判断处,则会进入判断内的流程,此时执行了Response.End方法,那么ASP的处理将会把当前缓冲区的“12345”输出到客户端,而后终止了当前页面的运行,循环当然被终止了,因此你不会看到输出5以上的数字。
<%
For i = 1 To 10
Response.Write(i) '输出
If i = 5 Then '如果i等于5
Response.Clear() '则清空缓冲
End If
Next
%>
这段代码演示了Clear方法的效果,它运行的最终效果是输出“678910”,当循环进入i=5这个环节时,将进入判断内的流程,执行Response.Clear,当执行这个语句时,当前缓冲区内的“12345”字符串会被清空,并继续后面的执行,因此最终只会输出“678910”。
现在我们再来回到刚刚我所说的测试这几个方法的条件,我假设开启了缓冲,那么这里的缓冲如何开启呢,一起走进我讲解Response对象的属性的环节吧。
首先承接上面,我们先来看Buffer这个属性,这个属性用于指定当前页面的处理是否缓冲,例如,开启缓冲的代码如下:
Response.Buffer = True
这里指定了Buffer属性的值为True,意为开启缓冲,那么关闭缓冲就是:
Response.Buffer = False
在指定这个方法的属性时,有一个需要注意的问题,就是,必须在服务器向客户端传输任何内容之前指定,比如,如下代码就会出现错误:
Response.Write("已经传送一段字符")
Response.Buffer = True
这是很好理解的,因为当内容已经传送到客户端,那么他就无法缓存在服务器端的处理了,在实际的编码过程中,要特别注意,可能有时你并没有意识到已经有数据传输到客户端了,从而使用了开启或者关闭缓冲的代码,这时就会出现错误,因此,为了保险起见,一般会把开启或者关闭缓冲的代码放在页面的顶端。另外我需要说明的是,IIS6默认是开启缓冲的,这可以在IIS的应用程序配置中更改,如图8.2所示。
图8.2
Response.CharSet这个属性用于指定输出内容的编码,我们知道,网页可以有gb2312、utf-8等编码,如果指定的编码与实际使用的编码不同,则会在网页中出现乱码,这个属性就是用来动态的指定这个编码的,它有时在AJAX形式调用的网页中用到,如,可以使用以下代码来指定当前的编码为utf-8。
Response.CharSet = "utf-8"
Response.Expires和Response. ExpiresAbsolute两个属性用来控制浏览器对于当前网页的缓存时间,在缓存时间之内,重复访问网页将直接从浏览器的缓存中调用而不再从服务器上获取。二者的区别在于Expires指定过期时间据当前时间的间隔,例如10分钟,而ExpiresAbsolute用于指定过期的绝对时间,例如2007年5月1日 19:20:20。
有时,我们可能不知道由于客户端的配置而导致的网页是否会在客户端被缓存,因此可能是用这两个缓存控制方法,通常是这样使用的:
Response.Expires = -1
这表示将网页缓存-1分钟,也就是不缓存。
当然,缓存控制本身的目的还是为了将不经常改变的内容缓存在客户端,从而减低服务器的压力,例如一个技术站点,他的技术文章一般很少变动,因此有必要使得在访问者某次访问后使得其浏览器缓存文章的内容。这时我们可能直接指定文章的过期时间,如:
Response.ExpiresAbsolute = DateAdd('d',10,Date())
这样即使得文章在10天后过期。
指定过期缓存时间和过期的绝对时间所达到的目的是相同的,具体使用哪种可以由自己的喜好和编码的方便,计算10天是几个小时自然比直接指定10天后的绝对时间要麻烦一些。
Response.IsClientConnected属性可以获得客户当前是否还在连接,它通常用来在进行耗费服务器资源的操作之前,检测是否有必要进行下面的操作。比如,我制作了一个页面,用于将服务器某个目录的1000个文件都读出来给客户显示,在进行这个操作时,我就希望时不时检测客户是否还在打开我的网页,如果他已经由于显示时间很长,不耐烦而放弃了页面的打开,那么程序就没有必要再继续读取文件并传送给客户了,请看下面的代码实例。
For i = 1 To 1000
ReadAndShowText(i) '这是我自己写的读取并显示文章内容的函数
If Response.IsClientConnected = False Then '如果客户端已经断开了连接
Exit For '那么就退出循环
End If
Next
这样写是可以达到我们的目的的,但是缺点在于,每次循环都需要检测IsClientConnected,无疑给运行程序的服务器又增大了不少的负担,那么我们不妨每读取10个文件检测一次,如下。
For i = 1 To 1000
ReadAndShowText(i) '这是我自己写的读取并显示文章内容的函数
If i Mod 10 = 0 Then '如果循环了10次
If Response.IsClientConnected = False Then '如果客户端已经断开了连接
Exit For '那么就退出循环
End If
End If
Next
Response.ContentType这个属性用于告诉客户端的浏览器,现在程序输出的内容的MIME类型,例如,HTML文件的MIME类型就是text/html,jpg文件的MIME类型是image/jpeg等。这个属性经常和Response.BinaryWrite方法配合使用,例如,在服务器上读取了一个jpg图片文件的二进制代码并输出到客户端之前,一般需要使用:
Response.ContentType="image/jpeg"
代码来使得浏览器正确得到所获得内容的类型,以便进行处理,否则,用浏览器获得图片文件的时候,将可能直接显示图片的二进制代码,而并非图片本身了。
那么,如何获得某种类型文件的MIME类型呢,第一种方法,你可以在搜索引擎上搜索:“扩展名+MIME类型”这样的关键字并查找结果网页中的相应说明,另外你也可以打开注册表的HKEY_CLASSES_ROOT项查看下面的相应扩展名的键值,如图8.3就显示了png图片的MIME类型。
图8.3
下面我们再来一起学习Response对象的集合,Response对象有一个Cookies的集合,这个集合用于向浏览器输出Cookies。
为什么要使用Cookies呢,我们知道,HTTP协议是一个无状态的协议,换言之,服务器并不知道客户端两次请求之间的联系,而Cookies的设计使得服务器可以通过Cookies在客户端存储一些信息,并在服务器端读取,从而实现例如用户登录保存等功能。
Cookies的使用方法是:
Response.Cookies(cookie)[(key)|.attribute] = 值
这个公式化的语句你可能看起来有些麻烦,我们来用实例代码演示一下,请看下面的例子并比较。
Response.Cookies("ASPversion") = "ASP3.0" '发送一个名为ASPversion
'值为ASP3.0的Cookies
Response.Cookies("ASPversion").Expires = "2008-1-1 15:23:21" '设定该Cookies的过期时间
Response.Cookies("ASPversion")("last") = "ASP2.0" '发送一个名为ASPversion,“关键字”为last的cookies
请注意这里我们所提到的“关键字”的用法,通过设定某个cookies的关键字,我们可以获得类似哈希数组的用法,在某些特殊功能时会比较方便。
[NextPage]
这里你将看到本书的第一个完整的使用了VBScript和ASP相关对象的小案例,我们来一起写一个使用ASP来显示出生日期选择的一组select控件,以减轻在创建相应控件时手动输入年份月份的麻烦。
首先我们明确,出生年份在1950年到2000年,当然,月份就是1-12月,日期就是1-31日了,当然,日期会随着月份有所改变,但是这里由于我们重点是联系如何使用Response对象,因此在ASP中我们不做处理,如果需要,那么可以在JavaScript中进行选择框值范围的改变。
在这个案例中,你可以学到如何使用Response.Write代码和对IIS缓冲的相应控制。
代码比较简单,首先我把它列出,如下:
<%
Option Explicit '强制变量声明
Response.Buffer = True '先开启缓冲
Dim i '定义循环变量
'先开始输出年份的选择框
Response.Write("<select id=""year"" name=""year"">")
For i = 1950 To 2000
Response.Write("<option value=""" & i & """>" & i & "</option>")
Next
Response.Write("</select>")
Response.Flush() '输出缓冲区中年份的选择框
'输出月份的选择框
Response.Write("<select id=""month"" name=""month"">")
For i = 1To 12
Response.Write("<option value=""" & i & """>" & i & "</option>")
Next
Response.Write("</select>")
Response.Flush() '输出缓冲区中月份的选择框
'输出日期的选择框
Response.Write("<select id=""year"" name=""year"">")
For i = 1 To 31
Response.Write("<option value=""" & i & """>" & i & "</option>")
Next
Response.Write("</select>")
Response.Flush() '输出缓冲区中日期的选择框
%>
这个案例中我们一共使用了三次循环,在每次循环中,都根据我们之前设定的范围,输出相应的option的HTML字符,这里我希望引起你注意的是Flush方法配合Buffer属性的使用,我们首先开启了缓冲,以避免在循环中每Write一次就向客户端输出一次信息而耗费大量连接资源,而后为了避免循环耗费的时间过长使得用户长时间等待而没有任何信息,我们在循环显示完毕每一个选择框后都使用Response.Flush方法来输出缓冲。
这段代码的最终效果如图8.4所示。
图8.4
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛