hinapub.com 下载 第2章请求和响应的处理 上一章介绍了安装设置的一些基本问题和ASP的使用,以及其所提供的内置对象。本章 将进一步研究两个最常用的对象。在浏览器(或其他用户代理)和web服务器之间,请求与响应 中发生的信息交流可以通过ASP中的两个内置对象来进行访问和管理,这两个对象称为 Request和 Response对象。 在ASP页中所要进行的工作几乎都要访问这两个对象,使用这两个对象的方式将影响页 面的效率及可靠性。当然,它们的主要用途是访问用户发回到服务器的值,即从HTML页的 段获得或附在URL后面作为查询字符串,并创建合适的输出返回给用户,且它们可 以共享很多相同的因素。例如两个对象都可以使用存储在客户端计算机上的 cookie 因此,我们把本章分成两个独立的部分(每个对象一部分),并且首先从客户端与服务器之 间的信息交流入手,然后再研究每一个对象。这将更有助于理解它们之间的关系及其重要性。 因此,本章研究的内容是 ·客户端与服务器如何交流以传递Web页或其他资源 Request和 Response对象的细节,以及它们之间的共同点 如何通过一个窗体和查询字符串访问相应的值。 如何读入或创建 cookie并存放在客户端的计算机上 服务器的变量是什么?如何访问和修改HTTP报头 ·说明其他相关条目的变化,如客户的证书使用。 首先看一下客户浏览器(或“用户代理”)和ASP的web服务器之间交流的情况 2.1客户端和服务器的交流 当浏览器或其他的用户代理访问Web站点请求页面时,在客户服务器和web服务器之间就 产生了一个对话,我们将仔细研究这个问题,因为理解这个问题有助于掌握使用ASP Request和 Response对象的基本知识,进而才能进一步掌握ASP的更多知识 为节省篇幅,在本章及本书后面的内容中使用“浏览器”( browser)一词。但需要记 住的是,能够访问Web页面的应用程序绝不仅只有浏览器,有许多特殊的应用程序从站 点上下载网页,如为那些视力有缺陷用户设计的特殊的客户端程序或者是用通常的浏 览器有其他困难的人。最显而易见的例子是搜索引擎用来访问Web上的站点的 robot。全 面考虑这些因素,包括普通的web浏览器,淮确的词汇应该是用户代理( user agent)k 页面请求的对话 当一个浏览器向Web站点提出页面请求时,显然必须告诉服务器,其请求的是哪一个页 面。首先要做的是通过域名与服务器建立连接,然后提供所请求页面的全路径和名称。为什 么要全路径和名称?Web是一个无国界的环境,所以必须创造一个会话标识每个客户(将在下
下载 第2章 请求和响应的处理 上一章介绍了安装设置的一些基本问题和 A S P的使用,以及其所提供的内置对象。本章 将进一步研究两个最常用的对象。在浏览器 (或其他用户代理)和We b服务器之间,请求与响应 中发生的信息交流可以通过 A S P中的两个内置对象来进行访问和管理,这两个对象称为 R e q u e s t和R e s p o n s e对象。 在A S P页中所要进行的工作几乎都要访问这两个对象,使用这两个对象的方式将影响页 面的效率及可靠性。当然,它们的主要用途是访问用户发回到服务器的值,即从 H T M L页的 段获得或附在U R L后面作为查询字符串,并创建合适的输出返回给用户,且它们可 以共享很多相同的因素。例如两个对象都可以使用存储在客户端计算机上的 c o o k i e。 因此,我们把本章分成两个独立的部分 (每个对象一部分),并且首先从客户端与服务器之 间的信息交流入手,然后再研究每一个对象。这将更有助于理解它们之间的关系及其重要性。 因此,本章研究的内容是: • 客户端与服务器如何交流以传递 We b页或其他资源。 • Request和R e s p o n s e对象的细节,以及它们之间的共同点。 • 如何通过一个窗体和查询字符串访问相应的值。 • 如何读入或创建c o o k i e并存放在客户端的计算机上。 • 服务器的变量是什么?如何访问和修改 H T T P报头。 • 说明其他相关条目的变化,如客户的证书使用。 首先看一下客户浏览器(或“用户代理”)和ASP 的We b服务器之间交流的情况。 2.1 客户端和服务器的交流 当浏览器或其他的用户代理访问 We b站点请求页面时,在客户服务器和 We b服务器之间就 产生了一个对话,我们将仔细研究这个问题,因为理解这个问题有助于掌握使用 A S P的 R e q u e s t和R e s p o n s e对象的基本知识,进而才能进一步掌握 A S P的更多知识。 为节省篇幅,在本章及本书后面的内容中使用“浏览器”( b r o w s e r )一词。但需要记 住的是,能够访问We b页面的应用程序绝不仅只有浏览器,有许多特殊的应用程序从站 点上下载网页,如为那些视力有缺陷用户设计的特殊的客户端程序或者是用通常的浏 览器有其他困难的人。最显而易见的例子是搜索引擎用来访问We b上的站点的r o b o t。全 面考虑这些因素,包括普通的We b浏览器,准确的词汇应该是用户代理(user agent)。 页面请求的对话 当一个浏览器向 We b站点提出页面请求时,显然必须告诉服务器,其请求的是哪一个页 面。首先要做的是通过域名与服务器建立连接,然后提供所请求页面的全路径和名称。为什 么要全路径和名称? We b是一个无国界的环境,所以必须创造一个会话标识每个客户 (将在下
34Asp;高编程 Chinaopub.com 下载 章介绍ASP如何做到这点) 这就意味着每当服务器完成向客户发送页面后,服务器就彻底忘记了这个客户。因此, 当客户请求下一个页面时,与一个新的访问者是完全相同的。服务器无法记住这个客户,相 应的,也就无法判断它们上次请求的页面是哪一个。因此,不能使用相对路径来提供一个页 面,即使页面包含一个相对的链接也不行,例如: Next Page 浏览器将自动建立完整的新页面的URL,方法是使用当前页的域和路径:或使用页面 段中的元素,告诉浏览器一个页面中所有链接的基URL是什么。例如 Professional\ 当把鼠标指向一个页面的链接时,可在浏览器 Source ode Ofice 2000 Pr 的状态栏中看到如图2-1所示的情况。当前页面的路 Excel 2000 VE Suppo 径和当前域名或基域名已经与请求的页面名结合在 llahttp://www.wrox.com/store/downioada 起了。 1.客户请求的细节 图2-1状态栏中显示的当前页面路径 所请求页面的全路径和名称的组合是浏览器请求页面时发往服务器的唯一信息。浏览器 的请求也能包含浏览器宿主的信息和客户端运行的操作系统。实际的信息内容将随着浏览器 的不同而有相应的变化,只有很少一部分能够由其他的应用程序如搜索引擎 robot!提供。为了 更清楚地了解该信息,下面是从IE5.0发出的一个对页面htp://www.wrox.com/Store/ Download. asp的请求信息 7/8/99 10: 27: 16 Sent Get /storE/dowmload. asp Http/1.1 Accept: application/msword, application/vnd. ms-excel, application/vnd. m. owerpoint, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x Referer:http://www.wroxcom/main_menu.asp User-Agent: Mozilla/4.0(compatible: MSIE 5.0: Windows 98) 50.238 Connection: Ke 从中可以看出,这些信息中有关于用户代理和用户连接的细节(如缺省的语言),也有能够 接受的文件或应用程序的类型列表,这些都是MIME类型的,在后面将会见到更多。浏览器能 够接受几种图像文件及多种 Microsoft office文件类型。“标准”的文件类型,如 text/html和 text/text没有列在其中。文件列表中**表示可向浏览器发回任何类型的文件,由浏览器解释或 通过一个插件(plug-in)应用程序来进行解释。 cookie:条目包含的 cookie存放在客户端的计算机上,并仅对该域有效。假如请求是点击 链接的结果,而不是在浏览器的地址栏直接输入URL,则 Referer:条目被显示,它包含了 接页面的完整的URL Host:条目包含客户计算机的IP地址或名称。然而,这还不足以准确辨别客户机 因为它们通过ISP连接时,IP地址是动态分配的,或者通过一个代理服务器连接时 IP地址是代理机的而不是实际的客户机的 2.服务器响应的细节信息 为响应上述的请求,并对匿名的浏览器(即用户不必提供用户名和访问口令)提供请求的页
一章介绍A S P如何做到这点)。 这就意味着每当服务器完成向客户发送页面后,服务器就彻底忘记了这个客户。因此, 当客户请求下一个页面时,与一个新的访问者是完全相同的。服务器无法记住这个客户,相 应的,也就无法判断它们上次请求的页面是哪一个。因此,不能使用相对路径来提供一个页 面,即使页面包含一个相对的链接也不行,例如: 浏览器将自动建立完整的新页面的 U R L,方法是使用当前页的域和路径;或使用页面 段中的元素,告诉浏览器一个页面中所有链接的基 U R L是什么。例如: 当把鼠标指向一个页面的链接时,可在浏览器 的状态栏中看到如图 2 - 1所示的情况。当前页面的路 径和当前域名或基域名已经与请求的页面名结合在 一起了。 1. 客户请求的细节 所请求页面的全路径和名称的组合是浏览器请求页面时发往服务器的唯一信息。浏览器 的请求也能包含浏览器宿主的信息和客户端运行的操作系统。实际的信息内容将随着浏览器 的不同而有相应的变化,只有很少一部分能够由其他的应用程序如搜索引擎 r o b o t提供。为了 更清楚地了解该信息,下面是从 IE 5.0 发出的一个对页面 h t t p : / / w w w. w r o x . c o m / S t o r e / D o w n l o a d . a s p的请求信息: 从中可以看出,这些信息中有关于用户代理和用户连接的细节 (如缺省的语言),也有能够 接受的文件或应用程序的类型列表,这些都是 M I M E类型的,在后面将会见到更多。浏览器能 够接受几种图像文件及多种 Microsoft Off i c e文件类型。“标准”的文件类型,如 t e x t / h t m l和 t e x t / t e x t没有列在其中。文件列表中 * / *表示可向浏览器发回任何类型的文件,由浏览器解释或 通过一个插件( p l u g - i n )应用程序来进行解释。 c o o k i e:条目包含的c o o k i e存放在客户端的计算机上,并仅对该域有效。假如请求是点击 链接的结果,而不是在浏览器的地址栏直接输入 U R L,则R e f e r e r:条目被显示,它包含了链 接页面的完整的U R L。 H o s t:条目包含客户计算机的I P地址或名称。然而,这还不足以准确辨别客户机。 因为它们通过 I S P连接时,I P地址是动态分配的,或者通过一个代理服务器连接时, I P地址是代理机的而不是实际的客户机的。 2. 服务器响应的细节信息 为响应上述的请求,并对匿名的浏览器 (即用户不必提供用户名和访问口令 )提供请求的页 34计计ASP 3 高级编程 下载 图2-1 状态栏中显示的当前页面路径
chinaopubcomm. 第2章请求和响应的处里35 下载 面,下面的内容是从服务器发往客户机的 7/8/9910:27:16 Received httP/1.1200OK licrosoft-IIS/5. 0 Date: Thu, 8 Jul 1999 10: 27: 16 GMT pe: text/html t-Modi fied: Thu, 8 Jul 1999 10: 27: 16 GMT ookie: visitcountx 3&LASTDATE=782F892F99+10%3A2763A16+AM est of pag 可以看出服务器向客户端说明自己所用的软件及版本,第一行表明所使用的是HTTP协议, 及返回码的状态。信息“200OK”表示请求被接受并得到了满足。后面的信息是被返回的页 面的细节,包括MIME类型( Content- Length)、大小(字节)、最近更改的时间,和返回客户端 存储的 cookie。响应中的其他信息是页面内容的信息流 在某些情况下,服务器响应一个请求后,不能返回一个页面,也许因为页面不存在,或 者客户没有相应权限来访问它。我们将在本书后续章节讨论安全问题。现在,对于请求页面 不存在的情况(例如用户在浏览器的地址栏输入了错误的URL),返回的信息开头为 7/8/99 14: 27: 16 Received Http/1.1 404 Not Found Server: Microsoft-IIS/5. 0 这里,状态码和信息表明客户请求的页面无法找到。浏览器可使用这个信息向用户显示 相应的信息(这种情况在IE50中不显示服务器的响应信息,而显示相应“帮助性”的错误提 示页面),也可显示服务器创建的缺省页面(依赖于服务器的设置) 至此,我们已经看到了客户机与服务器交互作用中的一些细节,下面介绍ASP对象 Request和 Response如何把这些转换成相应的值。 22 Request和 Response对象 在ASP中能够应用客户请求和服务器响应的细节是通过ASP内置的 Request和 Response对 象来实现的 Request对象:为脚本提供了当客户端请求一个页面或者传递一个窗体时,客户端提供 的全部信息。这包括能指明浏览器和用户的HTTP变量,在这个域名下存放在浏览器中 的 cookie,任何作为查询字符串而附于URL后面的字符串或页面的段中的 HIML控件的值。也提供使用 Secure Socket Layer(SSL或其他加密通信协议的授权访问, 及有助于对连接进行管理的属性。 Response对象:用来访问服务器端所创建的并发回到客户端的响应信息。为脚本提供 HTTP变量,指明服务器和服务器的功能和关于发回浏览器的内容的信息以及任何将为 这个域而存放在浏览器里新的 cookie。它也提供了一系列的方法用来创建输出,例如无 处不在的 Response. Write方法 在这一节中,首先概述 Request和 Response对象的成员,然后继续探讨如何使用它们完成 创建任务,以及如何使用每个对象的成员的细节 221 Request对象成员的概述 本节将给出 Request对象的所有成员的主要说明
面,下面的内容是从服务器发往客户机的: 可以看出服务器向客户端说明自己所用的软件及版本,第一行表明所使用的是H T T P协议, 及返回码的状态。信息“ 200 OK”表示请求被接受并得到了满足。后面的信息是被返回的页 面的细节,包括 M I M E类型( C o n t e n t - L e n g t h : )、大小(字节)、最近更改的时间,和返回客户端 存储的c o o k i e。响应中的其他信息是页面内容的信息流。 在某些情况下,服务器响应一个请求后,不能返回一个页面,也许因为页面不存在,或 者客户没有相应权限来访问它。我们将在本书后续章节讨论安全问题。现在,对于请求页面 不存在的情况(例如用户在浏览器的地址栏输入了错误的 U R L ),返回的信息开头为: 这里,状态码和信息表明客户请求的页面无法找到。浏览器可使用这个信息向用户显示 相应的信息(这种情况在IE 5.0中不显示服务器的响应信息,而显示相应“帮助性”的错误提 示页面),也可显示服务器创建的缺省页面 (依赖于服务器的设置)。 至此,我们已经看到了客户机与服务器交互作用中的一些细节,下面介绍 A S P对象 R e q u e s t和R e s p o n s e如何把这些转换成相应的值。 2.2 Request和R e s p o n s e对象 在A S P中能够应用客户请求和服务器响应的细节是通过 A S P内置的R e q u e s t和R e s p o n s e对 象来实现的。 • R e q u e s t对象:为脚本提供了当客户端请求一个页面或者传递一个窗体时,客户端提供 的全部信息。这包括能指明浏览器和用户的 H T T P变量,在这个域名下存放在浏览器中 的c o o k i e,任何作为查询字符串而附于 U R L后面的字符串或页面的 段中的 H T M L控件的值。也提供使用Secure Socket Layer (SSL)或其他加密通信协议的授权访问, 及有助于对连接进行管理的属性。 • R e s p o n s e对象:用来访问服务器端所创建的并发回到客户端的响应信息。为脚本提供 H T T P变量,指明服务器和服务器的功能和关于发回浏览器的内容的信息以及任何将为 这个域而存放在浏览器里新的 c o o k i e。它也提供了一系列的方法用来创建输出,例如无 处不在的R e s p o n s e . Wr i t e方法。 在这一节中,首先概述 R e q u e s t和R e s p o n s e对象的成员,然后继续探讨如何使用它们完成 创建任务,以及如何使用每个对象的成员的细节。 2.2.1 Request对象成员的概述 本节将给出R e q u e s t对象的所有成员的主要说明。 第 2章 请求和响应的处理计计35 下载
36Ap3高程 下载 1. Request对象的集合 Request对象提供了5个集合,可以用来访问客户端对web服务器请求的各类信息,这些集 合如表2-1所示 表2-1 Request对象的集合及说明 集合名称 ClientCertificate 当客户端访问一个页面或其他资源时,用来向服务器表明身份的客户证书的所 有字段或条目的数值集合,每个成员均是只读 Cookies 根据用户的请求,用户系统发出的所有 cookie的值的集合,这些 Cookie仅对相 应的域有效,每个成员均为只读 METHOD的属性值为POST时,所有作为请求提交的段中的HTML控 件单元的值的集合,每个成员均为只读 Query String 依附于用户请求的URL后面的名称/数值对或者作为请求提交的且 METHOD 属性值为GET(或者省略其属性)的,或中所有HTML控件单元的值,每 个成员均为只读 随同客户端请求发出的HTP报头值,以及Web服务器的几种环境变量的值的 集合,每个成员均为只读 2. Request对象的属性 Request对象唯一的属性及说明如表2-2所示,它提供关于用户请求的字节数量的信息,它 很少用于ASP页,我们通常关注指定值而不是整个请求字符串。 表2-2 Request.对象的属性及说明 属性 TotalBytes 只读,返回由客户端发出的请求的整个字节数量 3 Request.对象的方法 Request对象唯一的方法及说明如表2-3所示,它允许访问从一个段中传递给服务 器的用户请求部分的完整内容。 表2-3 Request对象的方法及说明 当数据作为POST请求的一部分发往服务器时,从客户请求中获得con 据,返回一个 Variant数组(或者 Safe Array)。如果ASP代码已经引用了 Form 集合,这个方法就不能用。同样,如果用了 Binary Read方法,就不能访问 Request. Forn集合 2.2.2 Response对象成员概述 这一节概要介绍所有的 Response对象成员,及每个成员的主要说明。 1. Response对象的集合 Response对象只有一个集合,如表2-4所示,该集合设置希望放置在客户系统上的 cookie 的值,它直接等同于 Request. Cookies集合。 表24 Response对象的集合及说明 集合名称 Cookies 在当前响应中,发回客户端的所有 cookie的值,这个集合为只写
1. Request对象的集合 R e q u e s t对象提供了5个集合,可以用来访问客户端对 We b服务器请求的各类信息,这些集 合如表2 - 1所示。 表2-1 Request对象的集合及说明 集合名称 说 明 C l i e n t C e r t i f i c a t e 当客户端访问一个页面或其他资源时,用来向服务器表明身份的客户证书的所 有字段或条目的数值集合,每个成员均是只读 C o o k i e s 根据用户的请求,用户系统发出的所有 c o o k i e的值的集合,这些C o o k i e仅对相 应的域有效,每个成员均为只读 F o r m M E T H O D的属性值为P O S T时,所有作为请求提交的 段中的H T M L控 件单元的值的集合,每个成员均为只读 Q u e r y S t r i n g 依附于用户请求的U R L后面的名称/数值对或者作为请求提交的且 M E T H O D 属性值为 G E T (或者省略其属性 )的,或中所有H T M L控件单元的值,每 个成员均为只读 S e r v e r Va r i a b l e s 随同客户端请求发出的HTTP 报头值,以及We b服务器的几种环境变量的值的 集合,每个成员均为只读 2. Request对象的属性 R e q u e s t对象唯一的属性及说明如表 2 - 2所示,它提供关于用户请求的字节数量的信息,它 很少用于A S P页,我们通常关注指定值而不是整个请求字符串。 表2-2 Request对象的属性及说明 属 性 说 明 To t a l B y t e s 只读,返回由客户端发出的请求的整个字节数量 3. Request对象的方法 R e q u e s t对象唯一的方法及说明如表 2 - 3所示,它允许访问从一个 段中传递给服务 器的用户请求部分的完整内容。 表2-3 Request对象的方法及说明 方 法 说 明 B i n a r y R e a d (c o u n t) 当数据作为P O S T请求的一部分发往服务器时,从客户请求中获得 c o u n t字节的数 据,返回一个Va r i a n t数组(或者S a f e A r r a y )。如果A S P代码已经引用了R e q u e s t . F o r m 集合,这个方法就不能用。同样,如果用了 B i n a r y R e a d方法,就不能访问 R e q u e s t . F o r m集合 2.2.2 Response对象成员概述 这一节概要介绍所有的R e s p o n s e对象成员,及每个成员的主要说明。 1. Response对象的集合 R e s p o n s e对象只有一个集合,如表 2 - 4所示,该集合设置希望放置在客户系统上的 c o o k i e 的值,它直接等同于R e q u e s t . C o o k i e s集合。 表2-4 Response对象的集合及说明 集合名称 说 明 C o o k i e s 在当前响应中,发回客户端的所有 c o o k i e的值,这个集合为只写 36计计ASP 3 高级编程 下载
第2请求和响应的处里37 下载 2. Response对象的属性 Response对象也提供一系列的属性,可以读取(多数情况下)和修改,使响应能够适应请求 这些由服务器设置,我们不需要设置它们。需要注意的是,当设置某些属性时,使用的语法 可能与通常所使用的有一定的差异。这些属性如表2-5所示。 表2-5 Response对象的属性及说明 Buffer=True False 读/写,布尔型,表明由一个ASP页所创建的输出是否一直存放在IS缓冲区, 直到当前页面的所有服务器脚本处理完毕或 Flush、End方法被调用。在任何 输出(包括HTTP报头信息)送往IS之前这个属性必须设置。因此在asp文件中, 这个设置应该在语句后面的第一行。ASP3.0缺省设 置缓冲为开(True),而在早期版本中缺省为关( False) Cache Control"setting 读/写,字符型,设置这个属性为“ Public”允许代理服务器缓存页面,如 为“ Private”则禁止代理服务器缓存的发生 读/写,字符型,在由服务器为每个响应创建的 Http Content-type报头中 附上所用的字符集名称(例如:ISO- LATIN-7) Content Type ="MIME-type 读/写,字符型,指明响应的HTTP内容类型,标准的MIME类型(例如 “ text/xml”或者“ Image/gif”)。假如省略,表示使用MIME类型“ text/html 内容类型告诉浏览器所期望内容的类型 读/写,数值型,指明页面有效的以分钟计算的时间长度,假如用户请求其 有效期满之前的相同页面,将直接读取显示缓冲中的内容,这个有效期间过 后,页面将不再保留在私有(用户)或公用(代理服务器)缓冲中 Expires Absolute# date/time读/写,日期/时间型,指明当一个页面过期和不再有效时的绝对日期和时间 Is ClientConnected 只读,布尔型,返回客户是否仍然连接和下载页面的状态标志。在当前的 页面已执行完毕之前,假如一个客户转移到另一个页面,这个标志可用来中 上处理(使用 Response.End方法) PICS("PICS.Label-string 只写,字符型,创建一个PCS报头并将之加到响应中的HTTP报头中 PCS报头定义页面内容中的词汇等级,如暴力、性、不良语言等 Status="Code 读/写,字符型,指明发回客户的响应的HTP报头中表明错误或页面处理 是否成功的状态值和信息。例如“200K”和“404 Not Found” 3. Response对象的方法 最后, Response对象提供一系列的方法,如表2-6所示,允许直接处理为返给客户端而创 建的页面内容。 表26 Response对象的方法及说明 AddHeader("name","content")通过使用name和Content值,创建一个定制的HTTP报头,并增加到响应之 中。不能替换现有的相同名称的报头。一旦已经增加了一个报头就不能被删 除。这个方法必须在任何页面内容(即text和HTML被发往客户端前使用 g("string") 当使用“W3 C Extended log file format”文件格式时,对于用户请求的 Web服务器的日志文件增加一个条目。至少要求在包含页面的站点的 Binary Write( Safe Array) 在当前的HTTP输出流中写入Variant类型的SafeArray,而不经过任何字符 转换。对于写入非字符串的信息,例如定制的应用程序请求的二进制数据或 组成图像文件的二进制字节,是非常有用的
2. Response对象的属性 R e s p o n s e对象也提供一系列的属性,可以读取(多数情况下)和修改,使响应能够适应请求。 这些由服务器设置,我们不需要设置它们。需要注意的是,当设置某些属性时,使用的语法 可能与通常所使用的有一定的差异。这些属性如表 2 - 5所示。 表2-5 Response对象的属性及说明 属 性 说 明 B u ff e r = Tr u e | F a l s e 读/写,布尔型,表明由一个A S P页所创建的输出是否一直存放在 I I S缓冲区, 直到当前页面的所有服务器脚本处理完毕或 F l u s h、E n d方法被调用。在任何 输出(包括H T T P报头信息)送往I I S之前这个属性必须设置。因此在 . a s p文件中, 这个设置应该在语句后面的第一行。 ASP 3.0缺省设 置缓冲为开( Tr u e ),而在早期版本中缺省为关 ( F a l s e ) CacheControl "s e t t i n g" 读/写,字符型,设置这个属性为“ P u b l i c”允许代理服务器缓存页面,如 为“P r i v a t e”则禁止代理服务器缓存的发生。 C h a r s e t = "v a l u e" 读/写,字符型,在由服务器为每个响应创建的 HTTP Content-Type 报头中 附上所用的字符集名称(例如:I S O - L AT I N - 7 ) Content Type ="M I M E - t y p e" 读/写,字符型,指明响应的 H T T P内容类型,标准的M I M E类型(例如 “t e x t / x m l”或者“I m a g e / g i f”)。假如省略,表示使用M I M E类型“t e x t / h t m l”, 内容类型告诉浏览器所期望内容的类型 Expires m i n u t e s 读/写,数值型,指明页面有效的以分钟计算的时间长度,假如用户请求其 有效期满之前的相同页面,将直接读取显示缓冲中的内容,这个有效期间过 后,页面将不再保留在私有(用户)或公用(代理服务器)缓冲中 Expires Absolute # d a t e [ t i m e ]# 读/写,日期/时间型,指明当一个页面过期和不再有效时的绝对日期和时间 I s C l i e n t C o n n e c t e d 只读,布尔型,返回客户是否仍然连接和下载页面的状态标志。在当前的 页面已执行完毕之前,假如一个客户转移到另一个页面,这个标志可用来中 止处理(使用R e s p o n s e . E n d方法) P I C S ( " P I C S -L a b e l - s t r i n g" 只写,字符型,创建一个PICS 报头并将之加到响应中的HTTP 报头中, PICS 报头定义页面内容中的词汇等级,如暴力、性、不良语言等 S t a t u s = "Code message" 读/写,字符型,指明发回客户的响应的 HTTP 报头中表明错误或页面处理 是否成功的状态值和信息。例如“ 200 OK”和“404 Not Found” 3. Response对象的方法 最后,R e s p o n s e对象提供一系列的方法,如表 2 - 6所示,允许直接处理为返给客户端而创 建的页面内容。 表2-6 Response对象的方法及说明 方 法 说 明 A d d H e a d e r (" n a m e " , " c o n t e n t ") 通过使用n a m e和C o n t e n t值,创建一个定制的H T T P报头,并增加到响应之 中。不能替换现有的相同名称的报头。一旦已经增加了一个报头就不能被删 除。这个方法必须在任何页面内容 (即t e x t和H T M L )被发往客户端前使用 A p p e n d To L o g (" s t r i n g ") 当使用“W3C Extended Log File Format”文件格式时,对于用户请求的 We b服务器的日志文件增加一个条目。至少要求在包含页面的站点的 “Extended Properties”页中选择“URI Stem” B i n a r y Wr i t e (S a f e A rr a y) 在当前的H T T P输出流中写入Va r i a n t类型的S a f e A r r a y,而不经过任何字符 转换。对于写入非字符串的信息,例如定制的应用程序请求的二进制数据或 组成图像文件的二进制字节,是非常有用的 第 2章 请求和响应的处理计计37 下载
38A5p高编程 Chinapub.com 下载 续 当 Response.Buer为Tue时,从IS响应缓冲中删除现存的缓冲页面内容 但不删除HTTP响应的报头,可用来放弃部分完成的页面 Endo 让ASP结束处理页面的脚本,并返回当前已创建的内容,然后放弃页面的 任何进一步处理 Flush 发送IS缓冲中所有当前缓冲页给客户端。当 Response buffer为True时,可 以用来发送较大页面的部分内容给个别的用户 Redirect("url") 通过在响应中发送一个“302 Object Moved”HITP报头,指示浏览器根据 符串url下载相应地址的页面 Write("string") 在当前的HTTP响应信息流和IS缓冲区写入指定的字符,使之成为返回页 面的一部分 在本书中源代码的例子里,读者会发现一系列的页面,演示如何使用这些由 equest和 Response对象提供的属性、方法和集合。在从 Wrox Web站点下载的 Chapter02目录下,有本章其余部分的示例页面 23使用Form和 Query String集合 当用户填写页面内容时所提供的全部值,或在浏览器地址栏输入在URL后的值, 通过Fom和 QueryString集合为ASP脚本所用。这是在ASP代码中访问值的一种简单方法 2.3.1访问ASP集合的一般技术 大多数ASP集合与在VB中见到的普通集合相差不多。实际上,它们是值的数组,但能通 过使用一个文本字符串键(对大小写不敏感)以及一个整型索引进行访问。因此,假如客户端 Web页面包含的如下: D="PosT”> LastName'3> 可通过访问ASP的Form集合来访问其控件内的值 strFirstName Request Form('FirstName strLastName Request Form("LastName " 也可使用窗体中控件的整型索引,索引的范围从在HTML中第一个定义的控件开始,然 后根据定义的顺序排序: Name Request Form(2) 然而,后面的这种以整型为索引的技术不推荐使用,因为一旦HTML中的控件发生了变 化,或者插入一个新的控件,则ASP代码将得到错误的值。进一步而言,对于阅读代码的人 来讲,极容易混淆 1.访问集合的全部值 可以通过引用集合把整个Fom上的一系列值变成单个的字符变量,且不用提供键或索引。 strAllFormContent s Request Form 假如文本框包含值 Priscilla和 Descartes,则 Request Form语句将返回下列字符
(续) 方 法 说 明 C l e a r ( ) 当Response .Buff e r为Tr u e时,从I I S响应缓冲中删除现存的缓冲页面内容。 但不删除H T T P响应的报头,可用来放弃部分完成的页面 E n d ( ) 让A S P结束处理页面的脚本,并返回当前已创建的内容,然后放弃页面的 任何进一步处理 F l u s h ( ) 发送I I S缓冲中所有当前缓冲页给客户端。当 R e s p o n s e . b u ff e r为Tr u e时,可 以用来发送较大页面的部分内容给个别的用户 R e d i r e c t ( " u r l " ) 通过在响应中发送一个“302 Object Moved”H T T P报头,指示浏览器根据 字符串u r l下载相应地址的页面 Wr i t e ( " s t r i n g " ) 在当前的H T T P响应信息流和I I S缓冲区写入指定的字符,使之成为返回页 面的一部分 在本书中源代码的例子里,读者会发现一系列的页面,演示如何使用这些由 R e q u e s t和R e s p o n s e对象提供的属性、方法和集合。在从 Wrox We b站点下载的 C h a p t e r 0 2目录下,有本章其余部分的示例页面。 2.3 使用F o r m和Q u e r y S t r i n g集合 当用户填写页面内容时所提供的全部值,或在浏览器地址栏输入在 U R L后的值, 通过F o r m和Q u e r y S t r i n g集合为A S P脚本所用。这是在A S P代码中访问值的一种简单方法。 2.3.1 访问A S P集合的一般技术 大多数A S P集合与在V B中见到的普通集合相差不多。实际上,它们是值的数组,但能通 过使用一个文本字符串键 (对大小写不敏感 )以及一个整型索引进行访问。因此,假如客户端 We b页面包含的如下: 可通过访问A S P的F o r m集合来访问其控件内的值: 也可使用窗体中控件的整型索引,索引的范围从在 H T M L中第一个定义的控件开始,然 后根据定义的顺序排序: 然而,后面的这种以整型为索引的技术不推荐使用,因为一旦 H T M L中的控件发生了变 化,或者插入一个新的控件,则 A S P代码将得到错误的值。进一步而言,对于阅读代码的人 来讲,极容易混淆。 1. 访问集合的全部值 可以通过引用集合把整个F o r m上的一系列值变成单个的字符变量,且不用提供键或索引。 假如文本框包含值P r i s c i l l a和D e s c a r t e s,则R e q u e s t . F o r m语句将返回下列字符: 38计计ASP 3 高级编程 下载
第2请求和响应的处里39 FirstName=PriscillasLastName Descartes 注意,提供的值是以名称/值对的形式出现的(即控件名称=控件值),并且每一对名称 值相互之间是用符号“&”相分隔的。假如打算把窗体中的内容传递单独的希望得到值的标 准格式的可执行应用程序或DLL,这个技术是很有用的。然而,一般说来,都是通过以窗体 中控件名称为文本键来访问集合中的内容。 2.遍历一个ASP集合 有两种方式遍历一个ASP集合中的所有成员,方式与普通ⅤB集合的基本相同。每个集合 提供一个 Count属性,返回的是集合中条目数量。可通过使用一个整型索引使用 count属性来 遍历集合 For intLoop =1 To Request Form. Count Response. Write Request Form(intLoop)&* 假如先前的窗体包含Psia和 Descartes值的两个文本框,将得到如下结果: 然而,更好的方法是使用 For each.Next结构。 For Each ob]Item In Request Form Response. Write obiTer&·=·& Request,Form( obiTer)&· Next 这带来的好处是既可以访问控件的名称又可访问其值。上述代码将得到如下结果: FirstName Priscilla Las tName n Descartes 意,一些浏览器返回到ASP的值可能与页面上显示的顺序不尽相同。 3.集合成员的多值性 在某些情况下,ASP集合中的各个成员可能不只一个值,这种情况发生在HTML定义中有 几个控件有相同Name属性时。例如: 工 NPUT TYPE=TEXT·NAME=“oth INPUT TYPE=" SUBMIT VALUE 1 Then More than one value in thia item Response. Write objItem &":
注意,提供的值是以名称/值对的形式出现的 (即控件名称=控件值),并且每一对名称/ 值相互之间是用符号“ &”相分隔的。假如打算把窗体中的内容传递单独的希望得到值的标 准格式的可执行应用程序或 D L L,这个技术是很有用的。然而,一般说来,都是通过以窗体 中控件名称为文本键来访问集合中的内容。 2. 遍历一个A S P集合 有两种方式遍历一个 A S P集合中的所有成员,方式与普通 V B集合的基本相同。每个集合 提供一个C o u n t属性,返回的是集合中条目数量。可通过使用一个整型索引使用 c o u n t属性来 遍历集合。 假如先前的窗体包含P r i s i l l a和D e s c a r t e s值的两个文本框,将得到如下结果: 然而,更好的方法是使用For Each...Next结构。 这带来的好处是既可以访问控件的名称又可访问其值。上述代码将得到如下结果: 注意,一些浏览器返回到A S P的值可能与页面上显示的顺序不尽相同。 3. 集合成员的多值性 在某些情况下,A S P集合中的各个成员可能不只一个值,这种情况发生在 H T M L定义中有 几个控件有相同N a m e属性时。例如: 在F o r m集合中,将为键“O t h e r H o b b y”创建一个条目。然而,它将包括从三个文本框中 得到的值。假如在提交时,用户留下了一个或多个为空,则返回的值为空字符串。假如用户 在第一和第三个文本框分别输入 G a r d e n i n g和M o u n t a i n e e r i n g,第二个文本框为空,在我们的 A S P代码中访问Request. Form(“O t h e r H o b b y”),将返回字符串: 为了能够在这种情况下,访问单个值,可以用复杂一些的代码: 第 2章 请求和响应的处理计计39 下载
40A5p高程 Chinaopub.com 下载 oop= 1 To Request Form(objItem)Count Response. write *Subkey '&intLoop & value Request Form(objItem)(intLoop)&" Next Response. write objItem Request Form(objItem)&* End if 对于前面的包含三个 Other Hobby控件的窗体实例,这将返回 yi value:Gardening 然而,由于很少给多个文本框相同的名字,因此这种技术很少用到。 (1)HTML中的单选或选项按扭控件 在HTML中,需要给几个控件相同的Name属性的情况是单选(或选项)按钮,例如: E⊥ sewhere KED> Reading   ating 在这种情况下,提交窗体时,假如仅是第一和第三个复选框被选中(加标记),遍历Form 集合时,会得到下列值 然而,假如为每个复选框提供一个值,把这个值发往服务器代替字符串“on”。例如窗体 如下
对于前面的包含三个O t h e r H o b b y控件的窗体实例,这将返回: 然而,由于很少给多个文本框相同的名字,因此这种技术很少用到。 (1) HTML中的单选或选项按扭控件 在H T M L中,需要给几个控件相同的 N a m e属性的情况是单选(或选项)按钮,例如: 因为用户只能选择多项中的一个 (这就是给它们相同的名字的原因 ),将仅得到一个返回值, 浏览器只能发送所选择控件的值。因此,假如这个窗体的用户已经选择了“ E u r o p e”,将得到 这个条目,通过遍历F o r m集得到其值: 由于为每个控件提供了不同的 VA L U E属性,反映了每个条目所对应的国家或地区的名称。 假如省略了VA L U E属性,浏览器将返回的值为“ o n”,因此将得到: 这是不经常用到的,因此一般对使用相同名称的单选控件使用 VA L U E属性。 (2) HTML复选框控件 当一个窗体中H T M L源码包含一个复选框控件时,一般都给定唯一的名称,例如: 在这种情况下,提交窗体时,假如仅是第一和第三个复选框被选中 (加标记),遍历F o r m 集合时,会得到下列值: 然而,假如为每个复选框提供一个值,把这个值发往服务器代替字符串“ o n”。例如窗体 如下: 40计计ASP 3 高级编程 下载
第2请求和响应的处里41 下载 TYPE= TYPE= 量排盛摇需 eading 标记用来产生标准的下拉列表框,其值以一种有趣的混合方式表示 下列的窗体创建了包含5个值可供用户选择,由于包含了 MULTIPLE属性,因此可以通过选择 时按下 Shift或Curl键,选择不仅一个的条目。 Programming TION VALUE=Hobby 068>Eating INPUT TYPE=SUBMIT. VALUEm" Send 图22所示为该页面,显示的是选中了三个条目 这种特殊的情况返回的是在Fom集合中单个条目,它包含选择 的值(单个的标记中指定的 VALUE属性,用逗号分隔: 2HTML列表控件屏幕 Hobby Hobby 025, Hobby 003, Hobby 010 假如使用更加复杂一些的集合遍历代码(单独显示每个子键),将得到 这与上述的相同名称的复选框的情况相同。事实上可以认为一个 SELECT列表是一列复选 框的列表供选择(不是选中)相应的条目 然而,列表框也有指定的值,假如在标记中设置 VALUE属性,将得到的是选 择的选项的文本内容, Request Form集将包含这样一个项目: Hobby Swimming, Reading, sleepi
如果除第三个复选框外,全部提交,在 R e q u e s t . F o r m集合会产生下列结果: 假如编写更复杂一些集合遍历代码,如先前所述 (单独显示每个子键),就得到这样结果: 需要注意的是两种情况,没有选中的控件根本不返回任何值。在第一种情况的结果里, 没有期骗性的逗号,第二种情况也没有空值。这与上述的使用文本框的相当的测试的结果不 一样。使用文本框时,每个文本框都返回一个值,即使是一个空字符串。这是浏览器造成这 样的结果。因此在A S P代码中访问集合时,要注意这个问题。 上述情况一个棘手的负作用是使用复选框时,复选框值的索引与在原始的 H T M L 中控件的位置没有任何联系,在上述的例子中第四个复选框的子键数为 3,因为当窗 体提交时,第二个控件没有选中。 (3) HTML列表控件 H T M L中的标记用来产生标准的下拉列表框,其值以一种有趣的混合方式表示。 下列的窗体创建了包含 5个值可供用户选择,由于包含了 M U LT I P L E属性,因此可以通过选择 时按下S h i f t或C t r l键,选择不仅一个的条目。 图2 - 2所示为该页面,显示的是选中了三个条目。 这种特殊的情况返回的是在F o r m集合中单个条目,它包含选择 的值(单个的标记中指定的VA L U E属性),用逗号分隔: 假如使用更加复杂一些的集合遍历代码 (单独显示每个子键),将得到: 这与上述的相同名称的复选框的情况相同。事实上可以认为一个 S E L E C T列表是一列复选 框的列表供选择(不是选中)相应的条目。 然而,列表框也有指定的值,假如在 标记中设置VA L U E属性,将得到的是选 择的选项的文本内容,R e q u e s t . F o r m集将包含这样一个项目: 第 2章 请求和响应的处理计计41 下载 图2-2 HTML列表控件屏幕
42Asp3高程 Chinapub.com 下载 并且,同样,复杂一些的集合遍历代码将返回如下结果: 1 value= Swimming Subkey 3 value Sleeping 当然,假如单个项目被选择,且在中提供了ⅤALUE属性,得到结果包含的仅是 如果没有提供ⅤALUE属性,得到 这允许既可以缺省(即无 VALUE)显示选项文本,也可做相应的改变。后一种情 况在某些情况下是极为有用的,如要显示(一个说明的字符串)和传递一个完全不同的 内容(如用一个短码代表一个说明性的字符串) (4)HTML提交和图像控件 复选框和单选框是布尔型控件的例子,选中或选择返回的为“on”,不像文本框和大多数 其他的HTML控件,浏览器不包含没有选中或没有选择的控件的值 还有另外一种常用的布尔型控件,称为HTML按钮。如、 、、和类型。 BUTTON类型的控件不返回任何值,因其对窗体没有直接的影响。即使使用用来调用窗 体的 Submit方法,浏览器在任何请求中将不包含 BUTTON类型控件的值。同样,一个 按钮的值也决不会发往服务器。 然而,输入按钮控件 SUBMIT和 IMAGE类型实际提交窗体给服务器,其 VALUE属性包含 窗体的其他控件的值(只要在HTML定义中包含一个NAME属性)。例如,这个窗体可能是向导 类型web应用程序的一部分,允许用户一步步进行或取消进程 <INPUT TYPEu VALUE UT TYPE= SUBMIT VALUE= 在一个窗体中,可以包括多个 SUBMIT按钮。在这种情况下,应该给每一个按钮唯一的 VALUE属性,如上所示。当一个窗体被提交时,遍历 Request Form集合的值,将产生一个值 这个值依赖于按下哪个按钮用于提交这个窗体。假如用户按下的“ Previous”按钮,将得到 因此,可查询 Request Form集合来决定下一个显示的页面,例如: Select Case Request Form('btnSubmit' onse Redirect page_3. asp' pageI asp esponse Redirect main_menu. asp
并且,同样,复杂一些的集合遍历代码将返回如下结果: 当然,假如单个项目被选择,且在中提供了VALUE属性,得到结果包含的仅是: H o b b y = H o b b y 0 2 5 如果没有提供VA L U E属性,得到: H o b b y = S w i m m i n g 这允许既可以缺省 (即无VA L U E )显示选项文本,也可做相应的改变。后一种情 况在某些情况下是极为有用的,如要显示 (一个说明的字符串)和传递一个完全不同的 内容(如用一个短码代表一个说明性的字符串 )。 (4) HTML提交和图像控件 复选框和单选框是布尔型控件的例子,选中或选择返回的为“ o n”,不像文本框和大多数 其他的H T M L控件,浏览器不包含没有选中或没有选择的控件的值。 还有另外一种常用的布尔型控件,称为 H T M L按钮。如、 、、和 . . . 类型。 B U T TO N类型的控件不返回任何值,因其对窗体没有直接的影响。即使使用用来调用窗 体的 S u b m i t方法,浏览器在任何请求中将不包含 B U T TO N类型控件的值。同样,一个 按钮的值也决不会发往服务器。 然而,输入按钮控件 S U B M I T和I M A G E类型实际提交窗体给服务器,其 VA L U E属性包含 窗体的其他控件的值(只要在H T M L定义中包含一个N A M E属性)。例如,这个窗体可能是向导 类型We b应用程序的一部分,允许用户一步步进行或取消进程: 在一个窗体中,可以包括多个 S U B M I T按钮。在这种情况下,应该给每一个按钮唯一的 VA L U E属性,如上所示。当一个窗体被提交时,遍历 R e q u e s t . F o r m集合的值,将产生一个值, 这个值依赖于按下哪个按钮用于提交这个窗体。假如用户按下的“ P r e v i o u s”按钮,将得到: 因此,可查询R e q u e s t . F o r m集合来决定下一个显示的页面,例如: 42计计ASP 3 高级编程 下载