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集合 当用户填写页面<FORM>内容时所提供的全部值,或在浏览器地址栏输入在URL后的值, 通过Fom和 QueryString集合为ASP脚本所用。这是在ASP代码中访问值的一种简单方法 2.3.1访问ASP集合的一般技术 大多数ASP集合与在VB中见到的普通集合相差不多。实际上,它们是值的数组,但能通 过使用一个文本字符串键(对大小写不敏感)以及一个整型索引进行访问。因此,假如客户端 Web页面包含的<FORM>如下: 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集合 当用户填写页面< F O R M >内容时所提供的全部值,或在浏览器地址栏输入在 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页面包含的< F O R M >如下: 可通过访问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)&*<BR> 假如先前的窗体包含Psia和 Descartes值的两个文本框,将得到如下结果: 然而,更好的方法是使用 For each.Next结构。 For Each ob]Item In Request Form Response. Write obiTer&·=·& Request,Form( obiTer)&·<BR> Next 这带来的好处是既可以访问控件的名称又可访问其值。上述代码将得到如下结果: FirstName Priscilla Las tName n Descartes 意,一些浏览器返回到ASP的<FORM>值可能与页面上显示的顺序不尽相同。 3.集合成员的多值性 在某些情况下,ASP集合中的各个成员可能不只一个值,这种情况发生在HTML定义中有 几个控件有相同Name属性时。例如: <FORM ACTION=show_request. asp' POST> 工 NPUT TYPE=TEXT·NAME=“oth INPUT TYPE=" SUBMIT VALUE </FORM 在Fom集合中,将为键“ Other Hobby”创建一个条目。然而,它将包括从三个文本框中 得到的值。假如在提交时,用户留下了一个或多个为空,则返回的值为空字符串。假如用户 在第一和第三个文本框分别输入 Gardening和 Mountaineering,第二个文本框为空,在我们的 ASP代码中访问 Request Form(“ Other Hobby”),将返回字符串 Gardening mountaineering 了能够在这种情况下,访问单个值,可以用复杂一些的代码 For Each objItem In RequestForm If Request Form(objItem) Count >1 Then More than one value in thia item Response. Write objItem &":<BR>
注意,提供的值是以名称/值对的形式出现的 (即控件名称=控件值),并且每一对名称/ 值相互之间是用符号“ &”相分隔的。假如打算把窗体中的内容传递单独的希望得到值的标 准格式的可执行应用程序或 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的< F O R M >值可能与页面上显示的顺序不尽相同。 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)&"<BR> Next Response. write objItem Request Form(objItem)&*<BR> End if 对于前面的包含三个 Other Hobby控件的窗体实例,这将返回 yi value:Gardening 然而,由于很少给多个文本框相同的名字,因此这种技术很少用到。 (1)HTML中的单选或选项按扭控件 在HTML中,需要给几个控件相同的Name属性的情况是单选(或选项)按钮,例如: <FORM ACTION="show_request. asp.METHOD="POST"> < INPUT TYPE=· RADIO CINPUT TYPE". :? *·>E⊥ sewhere<P> <INPUT TYPE-"SUBMIT" VALUE="Send 因为用户只能选择多项中的一个(这就是给它们相同的名字的原因),将仅得到一个返回值, 浏览器只能发送所选择控件的值。因此,假如这个窗体的用户已经选择了“ Europe”,将得到 这个条目,通过遍历Form集得到其值 untry EU 由于为每个控件提供了不同的 VALUE属性,反映了每个条目所对应的国家或地区的名称 假如省略了 VALUE属性,浏览器将返回的值为“on”,因此将得到 这是不经常用到的,因此一般对使用相同名称的单选控件使用ⅴALUE属性 (2)HIML复选框控件 当一个窗体中HTML源码包含一个复选框控件时,一般都给定唯一的名称,例如: <FORM ACTION- show request. asp METHOD=POST'> KED> Reading   ating 在这种情况下,提交窗体时,假如仅是第一和第三个复选框被选中(加标记),遍历Form 集合时,会得到下列值 然而,假如为每个复选框提供一个值,把这个值发往服务器代替字符串“on”。例如窗体 如下 <FORM ACTION="show_request. asp="POST">
对于前面的包含三个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 <INPUT TYPE- 如果除第三个复选框外,全部提交,在 Request Form集合会产生下列结果: Hobby Hobby 025, Hobby 003, Hobby 010 假如编写更复杂一些集合遍历代码,如先前所述(单独显示每个子键),就得到这样结果 sabke obby 025 Subkey 3 value Hobby o1 需要注意的是两种情况,没有选中的控件根本不返回任何值。在第一种情况的结果里, 没有期骗性的逗号,第二种情况也没有空值。这与上述的使用文本框的相当的测试的结果不 一样。使用文本框时,每个文本框都返回一个值,即使是一个空字符串。这是浏览器造成这 样的结果。因此在ASP代码中访问集合时,要注意这个问题。 上述情况一个棘手的负作用是使用复选框时,复选框值的索引与在原始的HTML 中控件的位置没有任何联系,在上述的例子中第四个复选框的子键数为3,因为当窗 体提交时,第二个控件没有选中。 (3)HTML列表控件 HTML中的< SELECT>标记用来产生标准的下拉列表框,其值以一种有趣的混合方式表示 下列的窗体创建了包含5个值可供用户选择,由于包含了 MULTIPLE属性,因此可以通过选择 时按下 Shift或Curl键,选择不仅一个的条目。 <FORM ACTION=show_request. aspMETHOD-'POST"> <OPTION VALUE="Hobby001'>Programming TION VALUE=Hobby 068>Eating </SELECT><P> INPUT TYPE=SUBMIT. VALUEm" Send 图22所示为该页面,显示的是选中了三个条目 这种特殊的情况返回的是在Fom集合中单个条目,它包含选择 的值(单个的< OPTION>标记中指定的 VALUE属性,用逗号分隔: 2HTML列表控件屏幕 Hobby Hobby 025, Hobby 003, Hobby 010 假如使用更加复杂一些的集合遍历代码(单独显示每个子键),将得到 这与上述的相同名称的复选框的情况相同。事实上可以认为一个 SELECT列表是一列复选 框的列表供选择(不是选中)相应的条目 然而,列表框也有指定的值,假如在< OPTION>标记中设置 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中的< S E L E C T >标记用来产生标准的下拉列表框,其值以一种有趣的混合方式表示。 下列的窗体创建了包含 5个值可供用户选择,由于包含了 M U LT I P L E属性,因此可以通过选择 时按下S h i f t或C t r l键,选择不仅一个的条目。 图2 - 2所示为该页面,显示的是选中了三个条目。 这种特殊的情况返回的是在F o r m集合中单个条目,它包含选择 的值(单个的< O P T I O N >标记中指定的VA L U E属性),用逗号分隔: 假如使用更加复杂一些的集合遍历代码 (单独显示每个子键),将得到: 这与上述的相同名称的复选框的情况相同。事实上可以认为一个 S E L E C T列表是一列复选 框的列表供选择(不是选中)相应的条目。 然而,列表框也有指定的值,假如在 < O P T I O N >标记中设置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 当然,假如单个项目被选择,且在<OP∏ON>中提供了ⅤALUE属性,得到结果包含的仅是 如果没有提供ⅤALUE属性,得到 这允许既可以缺省(即无 VALUE)显示选项文本,也可做相应的改变。后一种情 况在某些情况下是极为有用的,如要显示(一个说明的字符串)和传递一个完全不同的 内容(如用一个短码代表一个说明性的字符串) (4)HTML提交和图像控件 复选框和单选框是布尔型控件的例子,选中或选择返回的为“on”,不像文本框和大多数 其他的HTML控件,浏览器不包含没有选中或没有选择的控件的值 还有另外一种常用的布尔型控件,称为HTML按钮。如< INPUT TYPE=“ SUBMIT”>、 < INPUT TYPE=“ RESET”>、< INPUT TYPE=“ IMAGE”>、< INPUT TYPE=“ BUTTON >和< BUTTON></ BUTTON>类型。 BUTTON类型的控件不返回任何值,因其对窗体没有直接的影响。即使使用用来调用窗 体的 Submit方法,浏览器在任何请求中将不包含 BUTTON类型控件的值。同样,一个 <Ⅰ NPUTTYPE=“ RESET”>按钮的值也决不会发往服务器。 然而,输入按钮控件 SUBMIT和 IMAGE类型实际提交窗体给服务器,其 VALUE属性包含 窗体的其他控件的值(只要在HTML定义中包含一个NAME属性)。例如,这个窗体可能是向导 类型web应用程序的一部分,允许用户一步步进行或取消进程 <FORM ACTION="show__ requ POST> <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
并且,同样,复杂一些的集合遍历代码将返回如下结果: 当然,假如单个项目被选择,且在<OPTION>中提供了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按钮。如<INPUT TYPE=“S U B M I T”>、 <INPUT TYPE=“R E S E T”>、<INPUT TYPE=“I M A G E”>、<INPUT TYPE=“B U T TO N” >和< B U T TO N > . . . </B U T TO N >类型。 B U T TO N类型的控件不返回任何值,因其对窗体没有直接的影响。即使使用用来调用窗 体的 S u b m i t方法,浏览器在任何请求中将不包含 B U T TO N类型控件的值。同样,一个 < I N P U T T Y P E=“R E S E T”>按钮的值也决不会发往服务器。 然而,输入按钮控件 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 高级编程 下载