第2章请求和响应的处里43 下载 同时,也可根据需要对每个按钮使用不同的NAME属性。且选择其值包含在Form集合中 的控件名称。在控件没有一个完整的标记而是随后跟着较长的文本标签的情况下,极为有用, 如图2-3所示 what do you want to do now? Go on the the next page Go back to the previous page 目 Cancel and go back如 the man menu page 国国L 图2-3提交按钮屏幕 此屏幕上的界面由下列代码产生 FORM ACTION=show_request. asp.METHOD=POSt <B>What do you want to do now?</B><P> INPUT TYPE=“ SUBMIT”NAME= btnNext VALUE=" nbsp; ”> INPUT TYPE=SUBMIT. NAME=btnPrevious vALUE="&nk nbsp; Go back to the previous page<P> <INPUT TYPE="SUBMIT" NAME="btnCancel"VALUE=' > Cancel and go back to the main menu page<P> </FORM> 在ASP页面中,接收到该数据后,可以检查按钮名称提供的值来判断按下的是哪个按钮 If Len(Request Form('btnNext")) Then Response. Redirect If Len(Request Form(btnPrevious))Then Response Redirect If Len(Request Form( ncel)) Then Response. Redirect nenu. asp 这个工作是查询一个键上的ASP集合,如果不存在则返回一个空的字符串。换句话说 如果第二个按钮( previous页)按下,则 Request Form(“ btnNext”)的值是一个空字符串,则其 长度为零而不至于产生一个错误。当第二个按钮按下时,则在Form集合中这个条目的值 Request Form(“ btn Previous”),将是“  ,”其长度大于零 (5)提高使用 Request集合的效率 访问一个ASP集合来下载一个值是费时的需计算资源的过程,因为这个操作包含了一系 列对相关集合的搜索,这比访问一个局部变量要慢得多。因此,如果打算在页面中多次使用 集合中的一个值,应该考虑将其存贮成为一个局部变量,例如: strritle etre:” If Len(strTitle) Then strTitle m strritle& If strFirstName trFullName strritle s ElseIf Len(strFirstName)=1 Then strFullName strfitle strFirstN
同时,也可根据需要对每个按钮使用不同的 N A M E属性。且选择其值包含在 F o r m集合中 的控件名称。在控件没有一个完整的标记而是随后跟着较长的文本标签的情况下,极为有用, 如图2 - 3所示。 图2-3 提交按钮屏幕 此屏幕上的界面由下列代码产生: 在A S P页面中,接收到该数据后,可以检查按钮名称提供的值来判断按下的是哪个按钮。 这个工作是查询一个键上的 A S P集合,如果不存在则返回一个空的字符串。换句话说, 如果第二个按钮 ( p r e v i o u s页)按下,则R e q u e s t . F o r m (“b t n N e x t”)的值是一个空字符串,则其 长度为零而不至于产生一个错误。当第二个按钮按下时,则在 F o r m集合中这个条目的值 R e q u e s t . F o r m (“b t n P r e v i o u s”),将是“& n b s p ; & n b s p ; & n b s p ;”其长度大于零。 (5) 提高使用R e q u e s t集合的效率 访问一个A S P集合来下载一个值是费时的需计算资源的过程,因为这个操作包含了一系 列对相关集合的搜索,这比访问一个局部变量要慢得多。因此,如果打算在页面中多次使用 集合中的一个值,应该考虑将其存贮成为一个局部变量,例如: 第 2章 请求和响应的处理计计43 下载
44A3商级编程 Chinaopub.com 下载 strfitle& strFirstName&··& strlastname End if (6)搜索所有的 Request集合 在某些情况下,可能知道一个值的键名将出现在 Request集合中,但不能准确地知道是哪 个集合。例如,假如有几个页面(或一页面的不同段)发送一个值给同一个ASP脚本,它可能 在Form或者 Querystring集合中出现 本章后面部分将研究Form和 Query String集合的差异。 要看一下一个值为什么可能出现在不同的集合中,考虑一下这种情况:使用了<A>超级 链接元素请求一个页面。在这种情况下,增加一个值到请求的唯一方法是把它加到URL上 然而,同样的值可能已出现在另一个页面的<FORM>中,或同一页面不同部分 <FORM ACTION="process page. asp"METHOD=".> <INPUT TYPE="SUBMIT" NAME="page VALUE=Help> </FORM> For help go to the <A HREF=process_page. asp?page=Help">Help Page</A> 在这种情况下,按下窗体上的Help按钮,将发送 Request Form集合中一对名称/值 page=Help”。然而,按下<A>超级链接也可能发送名称/值“page=Help”,但是这次却是在 Querystring集合里。为访问这个值,可使用 ASP Request对象的一个特殊功能 strPage Request(page") 这将按序搜索全部的集合— Query String、Form、 Cookies、 ClientCertificate、 Server variables,直到发现第一个匹配值的名称。这样做比直接访问适当的集合效率低,并且 是不安全的,除非能绝对保证这个值不会出现在另外一个集合中。 例如,可能希望搜集满足客户请求的Web服务器的名称,这通过出现在每个查询中的 Request Server Varables集合中寻找“ SRVER NAME”来实现。然而,假如任一其他的集合也包含 名为“ server name”的值(记住键名不区分大小写),当使用 Request(“ server name”)时,得到的 是错误的结果。使用 Request Server Variables(“ server-name”)句法,我们将很难进行错误追踪 总而言之,使用“搜索全部集合”技术要格外小心,且只在没有其他技术能够提供你需 要的结果时使用 (7)访问其他的集合 本章的这一节里,已经集中讨论了Form集合,这可能是使用得最多的一个。然而,所有 这些技术同样适用于其他的对象。包括那些由 Request.对象提供的(即Form、 Query String、 Cookies、 Server Variables和 Client Certificate)集合,及由 Response对象提供的 cookies(及将在下 两章遇到的其他对象提供的集合)。 我们将简短了解一个值如何进入一个 Query String集合,及其优点和不足。然而,同时这 两个 Cookies集合有额外的功能,可以使使用 cookie更加方便,下面讨论这个内容。 23.2访问和更新 Cookies集合 Cookies的值比ASP其他集合(例如Form和 Server variables)的值要复杂得多。 cookie是一小
(6) 搜索所有的R e q u e s t集合 在某些情况下,可能知道一个值的键名将出现在 R e q u e s t集合中,但不能准确地知道是哪 一个集合。例如,假如有几个页面 (或一页面的不同段)发送一个值给同一个 A S P脚本,它可能 在F o r m或者Q u e r s t r i n g集合中出现。 本章后面部分将研究F o r m和Q u e r y S t r i n g集合的差异。 要看一下一个值为什么可能出现在不同的集合中,考虑一下这种情况:使用了 < A >超级 链接元素请求一个页面。在这种情况下,增加一个值到请求的唯一方法是把它加到 U R L上。 然而,同样的值可能已出现在另一个页面的 < F O R M >中,或同一页面不同部分: 在这种情况下,按下窗体上的 H e l p按钮,将发送 R e q u e s t . F o r m集合中一对名称/值 “p a g e = H e l p”。然而,按下 < A >超级链接也可能发送名称 /值“p a g e = H e l p”,但是这次却是在 Q u e rg s t r i n g集合里。为访问这个值,可使用 ASP Request对象的一个特殊功能: 这将按序搜索全部的集合 —Q u e r y S t r i n g、F o r m、C o o k i e s、C l i e n t C e r t i f i c a t e、 S e r v e r Va r i a b l e s,直到发现第一个匹配值的名称。这样做比直接访问适当的集合效率低,并且 是不安全的,除非能绝对保证这个值不会出现在另外一个集合中。 例如,可能希望搜集满足客户请求的 We b服务器的名称,这通过出现在每个查询中的 R e q u e s t . S e r v e r Va r a b l e s集合中寻找“S RV E R _ N A M E”来实现。然而,假如任一其他的集合也包含 名为“s e r v e r _ n a m e”的值(记住键名不区分大小写),当使用R e q u e s t (“s e r v e r _ n a m e”)时,得到的 是错误的结果。使用R e q u e s t . S e r v e r Va r i a b l e s (“s e r v e r- n a m e”) 句法,我们将很难进行错误追踪。 总而言之,使用“搜索全部集合”技术要格外小心,且只在没有其他技术能够提供你需 要的结果时使用。 (7) 访问其他的集合 本章的这一节里,已经集中讨论了 F o r m集合,这可能是使用得最多的一个。然而,所有 这些技术同样适用于其他的对象。包括那些由 R e q u e s t对象提供的 (即F o r m、Q u e r y S t r i n g、 C o o k i e s、S e r v e r Va r i a b l e s和C l i e n t C e r t i f i c a t e )集合,及由R e s p o n s e对象提供的c o o k i e s (及将在下 两章遇到的其他对象提供的集合 )。 我们将简短了解一个值如何进入一个 Q u e r y S t r i n g集合,及其优点和不足。然而,同时这 两个C o o k i e s集合有额外的功能,可以使使用 c o o k i e更加方便,下面讨论这个内容。 2.3.2 访问和更新C o o k i e s集合 C o o k i e s的值比A S P其他集合(例如F o r m和S e r v e r Va r i a b l e s )的值要复杂得多。 c o o k i e是一小 44计计ASP 3 高级编程 下载
第2章请求和响应的处理45 下载 块由浏览器存贮在客户端系统上的文本,且随同每次请求发往它们应用于的域中的服务器。 ASP使得应用 cookie较为容易,可以从 Request对象的 Cookies集合中获得所有随同请求发 出的 cookie的值,并可创建或修改 cookie,通过 Response对象的 Cookies集合发回给用户 ookie包含可用两种方式构造的信息,单值 cookie提供其值给代码是通过一个一般的类 ASP集合。然而,集合的每个成员可能本身也是一个集合,包含这种信息的 cookie通常称为多 fi(multiple-Value )cooki 创建一个单值的 cookie较为简单,如下所示: Response. Cookies("⊥tem-Dame")=·王ten-v1ue 创建一个多值的 cookie,可以使用如下命令: Response. Cookies('item-name')('sub-dtem-name")="gub-item-value 设置 cookie应用的域及路径及其有效期,我们使用: Response. Cookies( name"). domain = "domain-url sponse Cookies(item-name)expires date path pons ) path='virtual 通常,客户只在对创建 cookie的目录中的页面提出请求时,才将 cookie随请示发往服务器 通过指定path属性,可以指定站点中何处这个 cookie是合法的,并且这个 cookie将随请求发送 如果 cookie随对整个站点的页面请求发送,设置path为“/"。 假如 Expires属性没有设置,关闭当前的浏览器实例时, cookie将自动被消除 注意,我们在向浏览器发送任何输出时,已经创建了 cookie,因为,这些 cookie 是页面HTTP报头的一部分 在ASP3.0中,缓冲的缺省状态是打开的,且没有输出被发送,除非使用 Response. Flush指定做这个工作或者页面已到末端。这意味着创建 cookie的代码可以 在页面上的任何位置,直到任何输出“刷新”(fush)到客户端前,它都可以被执行。 要读现有的 cookie,使用 Request. Cookies集合。可以单独访问其中项目,方法类似于创建 它们时使用的方法。 strsinglevalue Request Cookies("item-name strsubItemvalue Request Cookies('item-name')('Bub-item-name) 注意 Request. Cookies集合(和所有其他 Request集合一样)是只读的。 Response. Cookies集合 是只写的,事实上可以访问这个集合中一系列 cookie的名称,而不是它们的值。 遍历 Cookies集合 为了使用 Cookies集合更加方便,可使用名称为 Haskeys的附加属性。假如访问的 cookie本 身也是个集合,即它是一个多值的 cookie,这将返回True使用 Haskeys属性,可以遍历完整 的 Request. Cookies集合,从而获得所有 cookie的列表及它们的值 For Each objItem In Request. Cookies Be another For Bach to iterate all subkeys For Each objItemkey equest Cookies (objItem) esponse. Write objItem &"(.&objItemkey &" Request Cookies(objItem)(objItemKey )&'<Br> Else Print out the cookie string aB normal e Write objItem &.=.&Request, Cookies(objItem)&<Br>
块由浏览器存贮在客户端系统上的文本,且随同每次请求发往它们应用于的域中的服务器。 A S P使得应用c o o k i e较为容易,可以从 R e q u e s t对象的C o o k i e s集合中获得所有随同请求发 出的c o o k i e的值,并可创建或修改c o o k i e,通过R e s p o n s e对象的C o o k i e s集合发回给用户。 c o o k i e包含可用两种方式构造的信息,单值 c o o k i e提供其值给代码是通过一个一般的类 A S P集合。然而,集合的每个成员可能本身也是一个集合,包含这种信息的 c o o k i e通常称为多 值( m u l t i p l e - Va l u e ) c o o k i e。 创建一个单值的c o o k i e较为简单,如下所示: 创建一个多值的c o o k i e,可以使用如下命令: 设置c o o k i e应用的域及路径及其有效期,我们使用: 通常,客户只在对创建c o o k i e的目录中的页面提出请求时,才将c o o k i e随请示发往服务器。 通过指定p a t h属性,可以指定站点中何处这个 c o o k i e是合法的,并且这个c o o k i e将随请求发送。 如果c o o k i e随对整个站点的页面请求发送,设置 p a t h为“/”。 假如E x p i r e s属性没有设置,关闭当前的浏览器实例时, c o o k i e将自动被消除。 注意,我们在向浏览器发送任何输出时,已经创建了 c o o k i e,因为,这些c o o k i e 是页面H T T P报头的一部分。 在ASP 3.0中,缓冲的缺省状态是打开的,且没有输出被发送,除非使用 R e s p o n s e . F l u s h指定做这个工作或者页面已到末端。这意味着创建 c o o k i e的代码可以 在页面上的任何位置,直到任何输出“刷新”( f l u s h )到客户端前,它都可以被执行。 要读现有的c o o k i e,使用R e q u e s t . C o o k i e s集合。可以单独访问其中项目,方法类似于创建 它们时使用的方法。 注意R e q u e s t . C o o k i e s集合(和所有其他R e q u e s t集合一样)是只读的。R e s p o n s e . C o o k i e s集合 是只写的,事实上可以访问这个集合中一系列 c o o k i e的名称,而不是它们的值。 遍历C o o k i e s集合 为了使用C o o k i e s集合更加方便,可使用名称为 H a s k e y s的附加属性。假如访问的 c o o k i e本 身也是个集合,即它是一个多值的 c o o k i e,这将返回Tr u e。使用H a s k e y s属性,可以遍历完整 的R e q u e s t . C o o k i e s集合,从而获得所有c o o k i e的列表及它们的值。 第 2章 请求和响应的处理计计45 下载