遍历Cookies集合 为了使用Cookies集合更加方便,可使用名称为Haskeys的附加属性。假如访问的cookie本身也是个集合,即它是一个多值的cookie,这将返回True。使用Haskeys属性,可以遍历完整的Request.Cookies集合,从而获得所有cookie的列表及它们的值。 For Each objItem In Request.Cookies If Request.Cookies(objItem).HasKey Then ‘Use another For Each to iterate all subkeys For Each objItemKey in Request.Cookies(objItem) Response.Write objItem & “(“ & objItemKey & “) = “_ & Request.Cookies(objItem)(objItemKey) & “<BR>” Next Else ‘PRint out the cookie string as normal Response.Write objItem & “ = ”& Request.Cookies(objItem) & “<BR>” End If Next 这非常类似于前面的从Request.Form集合中提取多个值的复杂代码。但是这里可以使用Haskeys属性来判别每个条目是否为一个集合。而在Form例子里,必须查询Request.Form(item_name).Count属性,这是因为Form集合(和所有的除cookie外的其他集合)成员不可能是真正的集合。ASP只是做了“幕后”的工作,得到了每个多条目集合的值。
在本书的后面附录中可以找到所有ServerVariables集合成员的一个列表,及其值的说明。然而,可从前面讨论的在请求页面时从客户端发出的HTTP报头中见到这些成员。当请求收到后,Web服务器也增加它本身的一些值到集合中,正如上面可以看到的运行在IIS 5.0创建的页面那样。 1) 页面是如何工作的 为了创建这个页面,使用了本章前面在对Form集合和如何访问其值的讨论中所看到的完全相同的代码。例如,遍历所有的集合(除Request.Cookies外),使用: For Each objItem In Request.collection_name Response.Write objItem & “ = “ & Request.collection_name(objItem) & “<BR>” Next 遍历Cookies集合,可以使用: For Each objItem In Request.Cookies If Request.Cookies(objItem).HasKeys Then ‘Use another For ... Each to iterate all keys of dictionary For Each objItemKey in Request.Cookies(objItem) Resonse.Write objItem objItem & “(“ & objItemKey & “) = “_ & Request.Cookies(objItem)(objItemKey) & “<BR>” Next Else ‘Print out the cookie string as normal Response.Write objItem & “ = “ & Request.Cookies(objItem) & “<BR>” End If Next 为获得TotalBytes属性,可简单地使用: Request.TotalBytes = <% = Request.TotalBytes %><P> 读者应该注意到,在两个集合中出现的某些值不是从窗体的HTML控件中直接得到的。QueryString集合包括了两个名为chapter和sample的值,如下图所示:
各种Response属性说明了将要用来创建HTTP报头的一些信息。HTTP报头页面的其他部分(HTML和文本内容)被发往到客户端。这些属性中的一些以及所有的Response对象的方法均有链接,允许读者打开另一个页面来显示其使用情况。我们稍后再回到这些页面。 页面中的属性是通过读取相应的属性并插入到页面中创建的。由于这些是动态链接,通过<A>元素来选择。 <A HREF = ”headers/expiretet_form.asp”>Response.CacheControl</A> = <% = Resposne.CacheControl %><BR> 链接到每个方法是通过<A>链接元素,页面中唯一复杂的部分是Response.Cookies集合。通过只能访问cookie,读取Request.Cookies集合中的值。当访问Response.Cookie集合时,必须在发送任何输出到客户端之前结束对它的所有引用。因此在页面的上部,通过遍历集合创建页面的HTML放在一个局部字符串变量中。 StrCookies = “” ‘We can only read the key names and not the values because ‘the Response.Cookies collection is ‘write only’ For Each objItem In Response.Cookies If Response.Cookies(objItem).HasKeys Then ‘Use another For Each to iterate all subkeys For Each objItemKey in Response.Cookies(objItem) StrCookies = strCookies & objItem & “(“ &objItemKey & “)<BR>” Next Else ‘print out the cookie as normal strCookies = strCookies & objItem & “<BR>” End If Next 然后在页面的适当点上插入结果。 <P><DIV CLASS=”subhead”>The Response.Cookies Collection</DIV> <I><A HREF=”cookies/setcookies.asp”>Response.Cookies</A> is a write-only collection so the values cannot be displayed</I><BR> <% = strCookies %>