精灵巫婆 发表于 2015-1-16 22:56:09

ASP网页设计利用Form和QueryString汇合

ASP.NET和ASP的比较,技术上比较已经没什么可说的了.新一代在大部分程度来说当然是比旧一代好了.关键看你对所做软件的理解了.因人而定.会写的话也可能比ASP.NET写得更有效率和更方便重用汇合
当用户填写页面<FORM>内容时所供应的全体值,或在扫瞄器地点栏输出在URL后的值,经由过程Form和QueryString汇合为ASP剧本所用。这是在ASP代码中会见值的一种复杂办法。
1、会见ASP汇合的一样平常手艺
年夜多半ASP汇合与在VB中见到的一般汇合相差未几。实践上,它们是值的数组,但能经由过程利用一个文本字符串键(对巨细不敏感)和一个整型索引举行会见。因而,假设客户端Web页面包括的<FORM>以下:
<FORMACTION=”show_request.asp”METHOD=”POST”>
FirstName:<INPUTTYPE=”TEXT”NAME=”FirstName”>
LastName:<INPUTTYPE=”TEXT”NAME=”LastName”>
<INPUTTYPE=”SUBMIT”VALUE=”Send”>
</FORM>
可经由过程会见ASP的Form汇合来会见其控件内的值:
strFirstName=Request.Form(“FirstName”)
strLastName=Request.Form(“LastName”)
也可以使用窗体中控件的整型索引,索引的局限从在HTML中第一个界说的控件入手下手,然后依据界说的按次排序:
strFirstName=Request.Form(1)
strLastName=Request.Form(2)
但是,前面的这类以整型为索引的手艺不保举利用,由于一旦有HTML中的控件产生了变更,大概拔出一个新的控件,则ASP代码将失掉毛病的值。进一步而言,关于浏览代码的人来说,极简单搅浑。
1)会见汇合的全体值
能够经由过程援用汇合把全部Form上的一系列值酿成单个的字符变量,且不必供应键或索引。
StrAllFormContent=Request.Form
假设文本框包括值Priscilla和Descartes,则Request.Form语句将前往以下字符:
FirstName=Priscilla&LastName=Descartes
注重,供应的值是以称号/值对的情势呈现的(即控件称号=控件值),而且每对称号/值互相之间是用标记“&”相分开的。假设盘算把窗体中的内容传送独自的,但愿失掉值的尺度格局的可实行使用程序或DLL,这个手艺是很有效的。但是,一样平常说来,都是经由过程以窗体中控件的称号为文本键来会见汇合中的内容。
2)遍历一个ASP汇合
有两种体例遍历一个ASP汇合中的一切成员,体例与一般VB汇合的基础不异。每一个汇合供应一个Count属性,前往的是汇合中条目数目。可经由过程利用一个整型索引利用Count属性来遍历。
ForintLoop=1ToRequest.Form.Count
Response.WriteRequest.Form(intLoop)&“<BR>”
Next
假设先前的窗体包括Priscilla和Descartes值的两个文本框,将失掉以下了局:
Priscilla
Descartes
但是,更好的办法是利用ForEach...Next布局。
ForEachobjItemInRequest.Form
Response.WriteobjItem&“=”&Request.Form(objItem)&“<BR>”
Next
这带来的优点是既能够会见控件的称号又可会见其值。上述代码将失掉以下了局:
FirstName=Priscilla
LastName=Descartes
注重,一些扫瞄器前往到ASP的<FORM>值大概与页面上显现的按次不尽不异。
3)汇合成员的多值性
在某些情形下,ASP汇合中的各个成员大概不止一个值,这类情形产生在HTML界说中有几个控件有不异Name属性时。比方:
<FORMACTION=”Show_request.asp”METHOD=”POST”>
<INPUTTYPE=”TEXT”NAME=”OtherHobby”>
<INPUTTYPE=”TEXT”NAME=”OtherHobby”>
<INPUTTYPE=”TEXT”NAME=”OtherHobby”>
<INPUTTYPE=”SUBMIT”VALUE=”Send”>
</FORM>
在Form汇合中,将为“OtherHobby”创立一个条目。但是,它将包含从三个文本框中失掉的值。假设在提交时,用户留下了一个或多个为空,则前往的值为空字符串。假设用户在第一和第三个文本框分离输出Gardening和Mountaineering,第二个文本框为空,在我们的ASP代码中会见Request.Form(“OtherHobby”),将前往字符串:
Gardening,,Mountaineering
为了可以在这类情形下,会见单个值,能够用庞大一些的代码:
ForEachobjItemInRequest.Form
IfRequest.Form(objItem).Count>1Then‘Morethanonevalueinthisitem
Response.WriteobjItem&“:<BR>”
ForintLoop=1ToRequest.Form(objItem).Count
Response.Write“Subkey”&intLoop&“value=“_
&Request.Form(objItem)(intLoop)&“<BR>”
Next
Else
Response.WriteobjItem&“=”&Request.Form(objItem)&“<BR>”
EndIf
Next
关于后面的包括三个OtherHobby控件的窗体实例,这将前往:
OtherHobby:
Subkey1value=Gardening
Subkey2value=
Subkey3value=Mountaineering
但是,因为很少给多个文本框不异的名字,因而这类手艺很罕用到。
a)HTML中的单选或选页按钮控件
在HTML中,必要给几个控件不异的Name属性的情形是单选(或选项)按钮,比方:
<FORMACTION=”show_request.asp”METHOD=”POST”>
Ilivein:
<INPUTTYPE=”RADIO”NAME=”Country”VALUE=”AM”>America<BR>
<INPUTTYPE=”RADIO”NAME=”Country”VALUE=”EU”>Europe<BR>
<INPUTTYPE=”RADIO”NAME=”Country”VALUE=”AS”>Asia<BR>
<INPUTTYPE=”SUBMIT”VALUE=”Send”>
</FORM>
由于用户只能选择多项中的一个(这就是给它们不异的名字的缘故原由),将仅失掉一个前往值,扫瞄器只能发送所选择控件的值。因而,假设这个窗体的用户已选择了“Europez”,将失掉这个条目,经由过程遍历Form集失掉其值:
Country=EU
因为为每一个控件供应了分歧的VALUE属性,反应了每一个条目所对应的国度或区域的称号。假设省略了VALUE属性,扫瞄器将前往的值为“on”,因而将失掉:
Country=on
这是不常常用到的,因而一样平常对利用不异称号的单选控件利用VALUE属性。
b)HTML复选框控件
当一个窗体中HTML源码包括一个复选框控件时,一样平常都给定独一的称号,比方:
<FORMACTION=”show_request.asp”METHOD=”POST”>
Ienjoy:
<INPUTTYPE=”CHECKBOX”NAME=”Reading”CHECKED>Reading
<INPUTTYPE=”CHECKBOX”NAME=”Eating”>Eating
<INPUTTYPE=”CHECKBOX”NAME=”Sleeping”>Sleeping
<INPUTTYPE=”SUBMIT”VALUE=”Send”>
</FORM>
在这类情形下,提交窗体时,假设仅是第一和第三个复选框被选中(加标志),遍历Form汇合时,会失掉以下值:
Reading=on
Sleeping=on
但是,假设为每一个复选框供应一个值,把这个值发往服务器取代字符串“on”。比方窗体以下:


假如除第三个复选框外,全体提交,在Request.Form汇合会发生以下了局:
Hobby=Hobby025,Hobby003,Hobby010
假设编写更庞大一些汇合遍历代码,如先前所述(独自显现每一个子键),就失掉如许了局:

必要注重的是两种情形,没有选中的控件基本不前往任何值。在第一种情形的了局里,没有棍骗性的逗号,第二种情形也没有空值。这与上述的利用文本框的相称的测试的了局纷歧样。利用文本框时,每一个文本框都前往一个值,即便是一个空字符串。这是扫瞄器形成如许的了局。因而在ASP代码中会见汇合时,要注重这个成绩。
上述情形一个辣手的负感化是利用复选框时,复选框值的索引与在原始的HTML中控件的地位没有任何接洽,在上述的例子中第四个复选框的子键数为3,由于当窗体提交时,第二个控件没有选中。
c)HTML列表控件
HTML中的<SELECT>标志用来发生尺度的下拉列表框,其值以一种风趣的夹杂体例暗示。以下的窗体创立了包括5个值可供用户选择,因为包括了MULTIPLE属性,因而能够经由过程选择时按下Shift或Ctrl键,选择不但一个的条目。

下图所示为该页面,显现的是选中了三个条目。

这类特别的情形前往的是在Form汇合中单个条目,它包括选择的值(单个的<OPTION>标志中指定的VALUE属性),用逗号分开:

假设利用加倍庞大一些的汇合遍历代码(独自显现每一个子键),将失掉:
Hobby:
Subkey1value=Hobby025
Subkey2value=Hobby003
Subkey3value=Hobby010
这与上述不异称号的复选框的情形不异。现实上能够以为一个SELECT列表是一列复选框的列表供选择(不是选中)响应的条目。
但是,列表框也有指定的值,假设在<OPTION>标志中设置VALUE属性,将失掉的是选择的选项的文本内容,Request.Form集将包括如许一个项目:
Hobby=Swimming,Reading,Sleeping
而且,一样,庞大一些的汇合遍历代码将前往以下了局:
Hobby:
Subkey1value=Swimming
Subkey2value=Reading
Subkey3value=Sleeping
固然,假设单个项目被选择,且在<OPTION>中供应了VALUE属性,失掉了局包括的仅是:
Hobby=Hobby025
假如没有供应VALUE属性,失掉:
Hobby=Swimming
这同意既能够缺省(即无VALUE)显现选项文本,也可做响应的改动。后一种情形在某些情形下是极其有效的,如要显现(一个申明的字符串)和传送一个完整分歧的内容(如用一个短码代表一个申明性的字符串)。
d)HTML提交和图象控件
复选框和单选框是布尔型控件的例子,选中或选择前往的为“on”,不像文本框和年夜多半其他的HTML控件,扫瞄器不包括没有选中或没有选择的控件的值。
另有别的一种经常使用的布尔型控件,称为HTML按钮。如<INPUTTYPE=”SUBMIT”>、<INPUTTYPE=”RESET”>、<INPUTTYPE=”IMAGE”>、<INPUTTYPE=”BUTTON”>和<BUTTON>...</BUTTON>范例。
BUTTON范例的控件不前往任何值,因其对窗体没有间接的影响。即便利用用来挪用窗体的Submit办法,扫瞄器在任何哀求中将不包括BUTTON范例控件的值。一样,一个<INPUTTYPE=”RESET”>按钮的值也决不会发往服务器。
但是,输出按钮控件SUBMIT和IMAGE范例实践提交窗体给服务器,其VALUE属性包括窗体的其他控件的值(只需在HTML界说中包括一个NAME属性)。比方,这个窗体多是导游范例Web使用程序的一部分,同意用户一步步举行或作废历程:
<FORMACTION=”show_request.asp”METHOD=”POST”>
<INPUTTYPE=”SUBMIT”NAME=”btnSubmit”VALUE=”Next”>
<INPUTTYPE=”SUBMIT”NAME=”btnSubmit”VALUE=”Previous”>
<INPUTTYPE=”SUBIMT”NAME=”btnSubmit”VALUE=”Cancel”>
</FORM>
在一个窗体中,能够包含多个SUBMIT按钮。在这类情形下,应当给每个按钮独一的VALUE属性,如上所示。当一个窗体被提交时,遍历Request.Form汇合的值,将发生一个值,这个值依附于按下哪一个按钮用于提交这个窗体。假设用户按下的“Previous”按钮,将失掉:
btnSubmit=Previous
因而,可查询Request.Form汇合来决意下一个显现的页面,比方:
SelectCaseRequest.Form(“btnSubmit”)
Case“Next”
Response.Redirect“page_3.asp”
Case“Previous”
Response.Redirect“page_1.asp”
Case“Cancel”
Response.Redirect“main_menu.asp”
EndSelect
同时,也可依据必要对每一个按钮利用分歧的NAME属性。且选择其值包括在Form汇合中的控件称号。在控件没有一个完全的标志而是随后随着较长的文本标签的情形下,极其有效,以下图所示。

此屏幕上的界面由以下代码发生:
<FORMACTION=”show_request.asp”METHOD=”POST”>
<B>Whatdoyouwanttodonow?</B><P>
<INPUTTYPE=”SUBMIT”NAME=”btnNext”VALUE=”>Goonthenextpage<P>
<INPUTTYPE=”SUBMIT”NAME=”btnPrevious”Value=””>GObacktothepreviouspage<P>
<INPUTTYPE=”SUBMIT”NAME=”btnCancel”VALUE=””>Cancelandgobacktothemainmenupage<P>
</FORM>
在ASP页面中,吸收到数据后,能够反省按扭称号供应的值来判别按下的是哪一个按钮。
IfLen(Request.Form(“btnNext”))ThenResponse.Redirect“page_3.asp”
IfLen(Request.Form(“btnPrevious”))ThenResponse.Redirect“page_1.asp”
IfLen(Request.Form(“btnCancel”))ThenResponse.Redirect“main_menu.asp”
这个事情是查询一个键上的ASP汇合,假如不存在则前往一个空的字符串。换句话说,假如第二个按钮(previous页)按下,则Request.Form(“btnNext”)的值是一个空字符串,则其长度为零而不至于发生一个毛病。当第二个按钮按下时,则在Form汇合中这个条目标值Request.Form(“btnPrevious”),将是“”其长度年夜于零。
e)进步利用Request汇合的效力
会见一个ASP汇合来下载一个值是费时的需盘算资本的历程,由于这个操纵包括了一系列对相干汇合的搜刮,这比会见一个部分变量要慢很多。因而,假如盘算在页面中屡次利用汇合中的一个值,应当思索将其存贮成为一个部分变量,比方:
strTitle=Request.Form(“Title”)
strFirstName=Request.Form(“FirstName”)
strLastName=Request.Form(“LastName”)
IfLen(stTitle)ThenstrTitle=strTitle&““
IfstrFirstName=““Then
StrFullName=strTitle&““&strLastName
ElseIfLen(strFirstName)=1Then
StrFullName=strTitle&strFirstName&“・“&strLastName
Else
StrFullName=strTitle&strFirstName&“”&strLastName
EndIf
f)搜刮一切的Request汇合
在某些情形下,大概晓得一个值的键名将呈现在Request汇合中,但不克不及正确地晓得是哪个汇合。比方,假设有几个页面(或一个页面的分歧段)发送一个值给统一个ASP剧本,它大概在Form大概QueryString汇合中呈现。
本章前面部分将研讨Form和QueryString汇合的差别。
要看一下一个值为何大概呈现在分歧的汇合中,思索一下这类情形:利用了<A>超等链接元素哀求一个页面。在这类情形下,增添一个值到哀求的独一办法是把它加到URL上。但是,一样的值大概已呈现在另外一个页面的<FORM>中,或统一页面分歧部分:
...
<FORMACTION=”process_page.asp”METHOD=”POST”>
<INPUTTYPE=”SUBMIT”NAME=”page”VALUE=”Next”>
<INPUTTYPE=”SUBMIT”NAME=”page”VALUE=”Previous”>
<INPUTTYPE=”SUBMIT”NAME=”page”VALUE=”Help”>
</FORM>
...
...
Forhelpgotothe<AHREF=”process_page.asp?page=Help”>HelpPage</A>
...
在这类情形下,按下窗体上的Help按钮,将发送Request.Form汇合中一对称号/值“page=Help”。但是,按下<A>超等链接也大概发送称号/值“Page=Help”,可是此次倒是在QueryString汇合里。为会见这个值,可以使用ASPRequest工具的一个特别功效:
strPage=Request(“page”)
这将顺次搜刮全体的汇合――QueryString、Form、Cookies、ClientCertificate、ServerVariables,直到发明第一个婚配值的称号。如许做比间接会见得当的汇合效力低,而且是不平安的,除非能相对包管这个值不会呈现在别的一个汇合中。
比方,大概但愿汇集满意客户哀求的Web服务器的称号,这经由过程呈现在每一个查询中的Request.ServerVariables汇合中寻觅“SERVER_NAME”来完成。但是,假设任一其他的汇合也包括名为“server_name”的值(记着键名不辨别巨细写),当利用Request(“server_name”)时,失掉的是毛病的了局。利用Reqeust.ServerVariables(“server_name”)句法,我们将很难举行毛病追踪。
总而言之,利用“搜刮全体汇合”手艺要分外当心,且只在没有其他手艺可以供应你必要的了局时利用。
g)会见其他的汇合
本章的这一节里,已会合会商了Form汇合,这多是利用得最多的一个。但是,一切这些手艺一样合用于其他的工具。包含那些由Request工具供应的(即Form、QueryString、Cookies、ServerVariables和ClientCertificate)汇合,及由Response工具供应的cookies(及将鄙人两章碰到的其他工具供应的汇合)。
我们将冗长懂得一个值怎样进进一个QueryString汇合,及其长处和不敷。但是,同时这两个Cookies汇合有分外的功效,可使利用cookie加倍便利,上面会商这个内容。
会见和更新Cookies汇合
Cookies的值比ASP其他汇合(比方Form和ServerVariables)的值要庞大很多。Cookie是一小块由扫瞄器存贮在客户端体系上的文本,且伴同每次哀求发往它们使用于的域中的服务器。
ASP使得使用cookie较为简单,能够从Request工具的Cookies汇合中取得一切伴同哀求收回的cookie值,并可创立或修正cookie,经由过程Response工具的Cookies汇合发还给用户。
Cookie包括可用两种体例机关的信息,单值cookie供应其值给代码是经由过程一个一样平常的类ASP汇合。但是,汇合的每一个成员大概自己也是一个汇合,包括这类信息的cookie经由过程称为多值(multiple-Value)cookie。
创立一个单值的cookie较为复杂,以下所示:
Response.Cookies(“item-name”)=“item-value”
创立一个多值的cookie,可使用以下命令:
Response.Cookies(“item-name”)(“sub-item-name”)=“sub-item-value”
设置cookie使用的域及路径及其无效期,我们利用:
Response.Cookies(“item-name”).domain=“domain-url”
Response.Cookies(“item-name”).path=“virtual-path”
Response.Cookies(“item-name”).expires=#date#
一般,客户只在对创立cookie的目次中的页面提出哀求时,才将cookie随叨教发住服务器。经由过程指定path属性,能够指定站点中那边这个cookie是正当的,而且这个cookie将随哀求发送。假如cookie随对全部站点的页面哀求发送,设置path为“/”。
假设Expires属性没有设置,封闭以后的扫瞄器实例时,cookie将被主动打消。
注重,我们在向扫瞄器发送任何输入时,已创立了cookie。由于,这些cookie是页面HTTP报头的一部分。

在ASP3.0中,缓冲的缺省形态是翻开的,且没有输入被发送,除非利用Response.Flush指定做这个事情大概页面已到末了。这意味着创立cookie的代码能够在页面上的任何地位,直就任何输入“革新”(flush)到客户端前,它都能够被实行。

要读现有的cookie,利用Request.Cookies汇合。能够独自会见个中的项目,办法相似于创立它们时利用的办法。
StrSingleValue=Request.Cookies(“item-name”)
StrSubItemValue=Request.Cookies(“item-name”)(“sub-item-name”)
注重Request.Cookies汇合(和一切其他Request汇合一样)是只读的。Response.Cookies汇合是只写的,现实上能够会见这个汇合中一系列cookie的称号,而不是它们的值。

遍历Cookies汇合
为了利用Cookies汇合加倍便利,可以使用称号为Haskeys的附加属性。假设会见的cookie自己也是个汇合,即它是一个多值的cookie,这将前往True。利用Haskeys属性,能够遍历完全的Request.Cookies汇合,从而取得一切cookie的列表及它们的值。
ForEachobjItemInRequest.Cookies
IfRequest.Cookies(objItem).HasKeyThen
‘UseanotherForEachtoiterateallsubkeys
ForEachobjItemKeyinRequest.Cookies(objItem)
Response.WriteobjItem&“(“&objItemKey&“)=“_
&Request.Cookies(objItem)(objItemKey)&“<BR>”
Next
Else
‘Printoutthecookiestringasnormal
Response.WriteobjItem&“=”&Request.Cookies(objItem)&“<BR>”
EndIf
Next
这十分相似于后面的从Request.Form汇合中提取多个值的庞大代码。可是这里可使用Haskeys属性来辨别每一个条目是不是为一个汇合。而在Form例子里,必需查询Request.Form(item_name).Count属性,这是由于Form汇合(和一切的除cookie外的其他汇合)成员不成能是真实的汇合。ASP只是做了“幕后”的事情,失掉了每一个多条目汇合的值。

Form和QueryString的差别
懂得了会见各类ASP汇合的手艺今后,必要办理另外一个成绩是:Form和QueryString汇合之间的差别是甚么?假设筹办利用ASP,毫无疑问应当分明这类差别,但必要参考HTTP事情体例来从头熟悉,了解它们。
经由过程HTTP从Web服务器哀求页面或其他资本,有两个通用的办法。可以使用GET办法间接取得资本,也可以使用POST把值传给响应资本。GET办法是缺省的,能够看一下本章后面的一个HTTP哀求的实例:
7/8/9910:27:16SentGET/Store/Download.aspHTTP/1.1
假设把一个或多个成对的称号/值附在哀求页面的URL后,就酿成哀求的查询字符串,且在QueryString汇合中供应给ASP页面。单击Web页面、Email动静或别的文档的超链接,或在扫瞄器的地点栏中输出地点并按回车,或单击扫瞄器中的Links或Favorites按钮,一切这些都要利用GET办法。
因而,对这些举措中传送值给ASP的独一办法是经由过程QueryString汇合,把值附在URL后。
呈现在Request.QueryString汇合中并被会见的值,与后面看到的Form汇合实例中的事情体例不异。URL和查询字符串的分离:
http://mysite.com/process_page.asp?FirstName=Priscilla&LastName=Descartes
能够接纳以下体例会见在QueryString汇合中供应的值:
strFirstName=Request.QueryString(“FirstName”)‘Return“Priscilla”
strLastName=Request.QueryString(“LastName”)‘Return“Descartes”
strRaw=Request.QueryString
‘Return“FirstName=Priscilla&LastName=Descartes”

窗体的GET和POST办法
在一个页面内利用<FORM>段时,能够设置翻开的FORM标志的METHOD属性值为“GET”或“POST”,缺省值为“GET”。假设利用“GET”或省略其属性,扫瞄器将该值绑定在页面一切控件上,成为一个查询字符串,且附在被哀求页面的URL上。
当这个哀求抵达Web服务器时,其值由ASP的Request.QueryString汇合供应。但是,假设设置METHOD属性为“POST”,扫瞄器将值包装进发送服务器的HTTP报头中,经由过程Request.Form汇合供应给ASP。
经由过程来讲,能够在一切的HTML窗体中利用POST办法。但是,扫瞄器或服务器的URL字符串长度存在必定的限定。因而,附有长的字符串大概会引发溢出和某些字符串的字符被截失落。同时,查询字符串呈现在扫瞄器的地点栏和一切的保留的链接和保藏夹中。不但云云,还显现了经由过程Web服务器时在HTTP哀求中不想显现的值,它也大概呈现你的服务器和其他路由服务器的日记文件中。在HTTP哀求报头中的值很少是可见的,而且不呈现在日记文件中。
利用POST办法必要注重的小成绩是,当用户从头下载<FORM>时,窗体的值将不再保存,其值为空且必需从头输出。但是,当附在URL上时,其值被存储为一个链接,将被保存,因而将呈现在一切的URL与字符串分离的哀求中,这也许是个长处也多是个弱点,这依据使用而定(一些扫瞄器在客户端上可以在必定局限内主动保存一个页面上的值)。
另外一点是URL与查询字符串的分离体不克不及包括任何空格或其他不法字符,不然的话,Navigator和一些其他的扫瞄器将呈现成绩。不法字符是那些用来分开URL和查询字符串的部分,比方“/”、“:”、“?”和“&”(IE可以主动将空格转换为准确的格局――加号“+”,但其他的不法字符不克不及处置)。ASP服务器工具供应URLEncode办法处置这类变更,今后章节会商相干内容。

检察Request和Response工具内容
到今朝,次要会商了一些实际成绩,没有枚举出格的实例。由于已会商过的内容多半情形下相互之间是亲切相干的。但是本书为这一章供应了一系列的实例页面,申明Request和Response工具的年夜多半属性。使用所讲过的实例,可以了解这些页面,并可举行响应的修正,用它们作为实验实例。
本章及其他一切章节的代码样例均供应给用户,能够从Wrox出书社站点下载。
http://webdev.wrox.co.uk/books/2610
http://www.wrox.com/Store/Details.asp?Code=2610
必需起首在Web服务器的WWWRoot内的子目次下安装实例,然后利用扫瞄器会见Chapter02子目次,利用:
http://your_server_name_or_IP/subdirectory_name/Chapter02/Default.asp
这里your_server_name_or_IP/subdirectory_name是安装下载文件的当地路径。
1、检察Request工具成员
这供应一个包括选页的菜单用来实验Request和Response工具,起首选择UsingtheRequestObject,以下图所示:

下图显现一个HTML窗体的实例,包括一些事后设置好的值,能够按本人的设法编纂这些值,然后点击“Submit”按钮。

这将翻开一个页面,以下图所示,显现汇合和TotalBytes属性的全体内容。第一屏显现的是Form、QueryString和Cookies汇合。

注重,假设在窗体页中编纂了HTML控件的值,关于Cookies汇合和其他的汇合,在读者的盘算机上的页面上大概显现分歧的值。
能够从“FormCollection”段中看到窗体上的HTML控件的值怎样在ASP的Request.Form汇合中暗示。也能够用原始的<FORM>页(称号为request_form.asp)来实验和检测,以懂得创立窗体的HTML和怎样与响应值相接洽。
这个页面前面是ClientCertificate汇合。这里是空的,由于服务器不请求客户端供应证书。上面是的ServerVariables汇合,下图的屏幕图显现的是汇合中包括的有效的值。

在本书的前面附录中能够找到一切ServerVariables汇合成员的一个列表,及其值的申明。但是,可夙昔面会商的在哀求页面时从客户端收回的HTTP报头中见到这些成员。当哀求收到后,Web服务器也增添它自己的一些值到汇合中,正如下面能够看到的运转在IIS5.0创立的页面那样。
1)页面是怎样事情的
为了创立这个页面,利用了本章后面在对Form汇合和怎样会见其值的会商中所看到的完整不异的代码。比方,遍历一切的汇合(除Request.Cookies外),利用:
ForEachobjItemInRequest.collection_name
Response.WriteobjItem&“=“&Request.collection_name(objItem)&“<BR>”
Next
遍历Cookies汇合,可使用:
ForEachobjItemInRequest.Cookies
IfRequest.Cookies(objItem).HasKeysThen
‘UseanotherFor...Eachtoiterateallkeysofdictionary
ForEachobjItemKeyinRequest.Cookies(objItem)
Resonse.WriteobjItemobjItem&“(“&objItemKey&“)=“_
&Request.Cookies(objItem)(objItemKey)&“<BR>”
Next
Else
‘Printoutthecookiestringasnormal
Response.WriteobjItem&“=“&Request.Cookies(objItem)&“<BR>”
EndIf
Next
为取得TotalBytes属性,可复杂地利用:
Request.TotalBytes=<%=Request.TotalBytes%><P>
读者应当注重到,在两个汇合中呈现的某些值不是从窗体的HTML控件中间接失掉的。QueryString汇合包含了两个名为chapter和sample的值,以下图所示:

为在哀求中创立这两个值,将一个字符串附在窗体的ACTION属性的URL上,这是能够承受的。事情体例与附在一个<A>元素的HREF属性上相相似。查询字符的值呈现在QueryString汇合中,且被POST的窗体控件值呈现在Form汇合中。
<FORMACTION=”show_request.asp?chapter=2&sample=The+Request+Object”METHOD=”POST”>
为避免非IE类的扫瞄器呈现毛病,必需将查询字符串中的空格用加号“+”来取代,读者将在第4章的Server工具的URLEncode办法中看到更多这类情形。
2)创立客户真个cookie
为了确保最少有些值呈现在Request.Cookies汇合中,增添一些客户端剧本代码到原始的<FORM>页面request_form.asp。将创立称号为VisitCount的多值cookie。另外一个cookie是由另外一个页面创立的,且已存在于扫瞄器中。以下图所示,读者能够看到别的的cookie。

这是一段窗体被装载时设置文档工具的cookies属性的客户端代码:
<SCRIPTLANGUAGE=”JavaScript”>
<!--
documet.cookie=VisitCount=VISITS=3&LASTDATE=6%2F4%2F99+10%3A10%3A13+AM;
//-->
</SCRIPT>
别的,必需将内容举行编码,以便它能被准确地传送到服务器(一样的划定规矩也合用于将查询字符串附到URL上)。在第4章中,会商Server工具的URLEncode办法时,读者将懂得到更多细节。
2、检察Response工具的成员
回到Chapter02实例的最后的Default.asp页面,此次选择“UsingtheResponseObject”链接,这个页面显现的是Response工具的汇合和属性的内容,且供应到一切Response工具办法的链接。
下图是利用扫瞄器NetsapeCommunicator4.61的屏幕,用来证实利用的是纯服务器端和跨平台兼容手艺。必要注重的是Cookies汇合是为Response工具而创建的,仅显现cookie的称号而不显现其值。扫瞄该页时,大概得不到cookie或失掉与这个页面分歧的cookie。

各类Response属性申明了将要用来创立HTTP报头的一些信息。HTTP报头页面的其他部分(HTML和文本内容)被发往到客户端。这些属性中的一些和一切的Response工具的办法均有链接,同意读者翻开另外一个页面来显现其利用情形。我们稍后再回到这些页面。
页面中的属性是经由过程读取响应的属性并拔出到页面中创立的。因为这些是静态链接,经由过程<A>元从来选择。
<AHREF=”headers/expiretet_form.asp”>Response.CacheControl</A>
=<%=Resposne.CacheControl%><BR>
链接到每一个办法是经由过程<A>链接元素,页面中独一庞大的部分是Response.Cookies汇合。经由过程只能会见cookie,读取Request.Cookies汇合中的值。当会见Response.Cookie汇合时,必需在发送任何输入到客户端之前停止对它的一切援用。因而在页面的上部,经由过程遍历汇合创立页面的HTML放在一个部分字符串变量中。
StrCookies=“”
‘Wecanonlyreadthekeynamesandnotthevaluesbecause
‘theResponse.Cookiescollectionis‘writeonly
ForEachobjItemInResponse.Cookies
IfResponse.Cookies(objItem).HasKeysThen
‘UseanotherForEachtoiterateallsubkeys
ForEachobjItemKeyinResponse.Cookies(objItem)
StrCookies=strCookies&objItem&“(“&objItemKey&“)<BR>”
Next
Else
‘printoutthecookieasnormal
strCookies=strCookies&objItem&“<BR>”
EndIf
Next
然后在页面的得当点上拔出了局。
<P><DIVCLASS=”subhead”>TheResponse.CookiesCollection</DIV>
<I><AHREF=”cookies/setcookies.asp”>Response.Cookies</A>
isawrite-onlycollectionsothevaluescannotbedisplayed</I><BR>
<%=strCookies%>

ASP中的cookie的利用
在后面所看到页面中,一些汇合、属性和办法已链接到其他的页面,用来显现Request和Response工具的各个特征细节,我们将在本章的其他的部分研讨这些内容,我们将进修那些供应给ASP代码利用的汇合、办法和属性的各类手艺。
在本章后面已看到了怎样利用Request.Cookies和Response.Cookies汇合来创立和浏览cookie,点击下面两个页面中的任一个的“Cookies”链接时,这个页面包括一些设置了三个cookie的值的ASP代码,且在页面上显现被实行的代码,以下图所示:

点击“ShowCookies”的链接时,cookie的内容就显现出来了。这是经由过程遍历Request.Cookies汇合而失掉的,这与在上一页所用的体例完整不异,以下图所示:

这个屏幕图显现的是运转后面看到的设置cookie值的代码的了局。大概会看到其他已存贮在盘算机体系里的cookie。但是,假设如今封闭扫瞄器然后从头翻开扫瞄器,然后运转显现cookie的页面,除TimedCookie外,一切的cookie都不见了,这是因为只要这个TimedCookie具有无效期的设置,其他的在扫瞄器封闭时,主动消散了。
1)cookie中存储用户的细节情形
可使用cookie来存储这两类值:当扫瞄器封闭时我们不想保留的值(比方用户的注册信息)和在用户会见站点时要保存的值。在每种情形下cookie的值关于来自用户扫瞄器的每一个页面哀求的ASP都是可用的。
但是,必要记着的是,cookie只要在对Cookie中的假造路径(path)内的页面收回哀求时,才会发往服务器。缺省时,假设path的值在cookie中没有设置,则其值为创立cookie的页面的假造路径。为使一个cookie发往一个站点的一切页面,必要利用path=“/”。
这里是个实例,从自界说的Login页面中,将用户的注册信息存贮在一个cookie中,因为没有使用无效期,cookie值仅在封闭这个扫瞄器这前保存:
...
Request.Cookies(“User”)(“UID”)=“<%=Request(“UserName”)%>”
Request.Cookies(“User”)(“PWD”)=“<%=Request(“Password”)%>”
Request.Cookies(“User”).Path=“/adminstuff”‘Onlyappliestoadminpages
...
如今,在用户从adminstuff目次或其子目次哀求的每一个页面中,都能够找到这个cookie。假设它不存在,能够将用户重定向到注册页面:
If(Request.Cookies(“User”)(“UID”)“alexhomer”)_
Or(Request.Cookies(“User”)(“PWD”)“secret”)Then
Response.Redirect“login.asp?UserName=”&Request.Cookies(“User”)(“UID”)
EndIf
...
因为把cookie中的用户名放在Response.Redirect的URL查询字符串中,假设在口令输出时呈现毛病且但愿用户不用从头键进用户名,能够在login.asp页面中利用它:
<FORMACTION=”check_user.asp”METHOD=”POST”>
<INPUTTYPE=”TEXT”NAME=”UserName”
VALUE=”<%=Request.QueryString(“UserName”)%>”><P>
<INPUTTYPE=”SUBMIT”VALUE=”LOGIN”>
</FORM>
2)修正现有的cookie
可使用ASP修正现有的cookie,但不克不及只修正cookie中的一个值。当更新一个在Response.Cookies汇合中的Cookie时,现有的值将丧失。我们能够用以下代码创立一个cookie,可使用:
Response.Cookies(“VisitCount”)(“StartDate”)=dtmStart
Response.Cookies(“VisitCount”)(“LastDate”)=Now
Response.Cookies(“VisitCount”)(“Visits”)=CStr(intVisits)
Response.Cookies(“VisitCount”).Path=“/”‘Applytoentiresite
Response.Cookies(“VisitCount”).Expires=DateAdd(“m”,3,Now)
假设想要更新Visits和LastDate的值,必需先不需改动的一切值,然后重写全部的cookie:
datDtart=Response.Cookies(“VisitCount”)(“StartDate”)
intVisits=Response.Cookies(“VisitCount”)(“Visits”)
Response.Cookies(“VisitCount”)(“StartDate”)=dtmStart
Response.Cookies(“VisitCount”)(“LastDate”)=Now
Response.Cookies(“VisitCount”)(“Visits”)=Cstr(intVisits)
Response.Cookies(“VisitCount”).Path=“/”
Response.Cookies(“VisitCount”).Expires=DateADD(“m”,3,Now+1)且关于几近一切的其他Response办法和属性,应当在写进任何内容(即翻开<HTML>标志或任何文本或其他的HTML)到呼应之前完成这个事情。


大家可以自己去看一看.可以说看得想呕吐.以前有次下了个动网来看.里面连基本内置函数的保护措施(函数没防御性)都没有.难怪经常补这个补那个了.可能现在.NET版会好点吧

简单生活 发表于 2015-1-20 06:13:47

我可以结合自己的经验大致给你说一说,希望对你有所帮助,少走些弯路。

爱飞 发表于 2015-1-28 21:00:31

尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性,比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。

仓酷云 发表于 2015-2-5 22:53:47

跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组

透明 发表于 2015-2-14 01:40:49

我们必须明确一个大方向,不要只是停留在因为学而去学,我们应有方向应有目标.

莫相离 发表于 2015-3-4 03:50:58

完全不知道到底自己学的是什么。最后,除了教程里面说的几个例子,还是什么都不会。

第二个灵魂 发表于 2015-3-11 16:08:23

以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。

若相依 发表于 2015-3-27 03:10:37

学习是为了用的,是为了让你的程序产生价值,把握住这个原则会比较轻松点。除此之外,课外时间一定要多参加一些社会实践活动,来锻炼自己的能力。
页: [1]
查看完整版本: ASP网页设计利用Form和QueryString汇合