ASP编程:初级表单考证(转)-针对屡次提交表单...
asp,jsp,php是web开发的三大技术,asp简单易用且有microsoft做靠山,jsp功能强大是因为有java支持,php则开源跨平台.在国内,asp应用范围最广,jsp发展势头最猛,php则处于劣势.这可能与公司的支持以及技术的培训有关.表单考证|初级|提交表单每一个开辟职员面临的坚苦是展望用户可以或是将要做甚么--这关于收集开辟职员来讲就更加困难,由于他的展望必需思索到Web的多样性和缺少真实的session把持机制。假如你已创立过一个利用表单的ASP使用程序,大概你已碰到过一些奇异的成绩,如数据传输两次,吸收数据不完全,大概用户呈报表单显现不准确。只管你也拔出了确认数据所需的一切客户机端和服务器真个剧本,表单仍旧会产生很多非常情形。这些非常情形与不测用户举动或扫瞄器书签的误利用有关。本文将会合办理一些简单引发表单成绩的典范情形:用户不测地反复发送数据,在多步骤表单中间接利用两头表单。数据复制
经由过程表单反复发送数据是一个罕见的情形,可是它会带来成绩。在幻想的情形下,用户在一个Web站点碰到一个表单,用准确的数据范例添补它,将它提交给处置数据的服务器,然后作为回应发送给用户一个确认页,这时候用户就能够再往做其余。假如用户从头会见后面那一页,利用back按钮,然后偶然中再将数据发送一次,那将会呈现甚么情况呢?假如你没有意料到这一场景而且有所筹办,数据就将被从头传送给服务器而且再处置一次。试想这些数据是一份定单或旅店预定,那将会带来很不兴奋的了局。
停止反复数据传输
为了不那些毛病地反复发送给服务器的数据,能够在服务器侧举行一些校验,来断定用户能意想到他们正在发送数据。这里利用的例子包括一个有单一文本框的复杂表单,表单吸收一些文本,然后将其发送到一个显现它们的ASP页。为确保用户不将一样的信息发送两次,必要唆使数据已被服务器吸收到。存储这些信息的最好的中央是一个session变量。界说一个session变量Session("submitted"),当用户第一次抵达这个表单时将它初始化为False,在用户举行最后的数据传输时将它设置为true。假如用户在以后的session时代从头会见这个表单,将呈现相干反复提交信息。
以是用户只能是在成心的情形下向服务重视复发送数据。如今来看看实行这一校验的代码。创建表单而且校验已发送数据的ASP页(鄙人载处为form.asp)有以下布局:
〈HTML〉
〈HEAD〉
〈/HEAD〉
〈BODY〉
〈%IfSession("submitted")Then%〉
〈!--Codeshowingthewarningmessage--〉
...〈%Else%〉
〈!--Codeshowingtheform--〉
...〈%EndIf%〉
〈/BODY〉
〈/HTML〉
表单和告诫信息都是从统一个ASP页创立的。表单包含尺度的HTML代码,援用ManageForm.asp页作为它的ACTION属性:
〈FORMMETHOD="post"ACTION="ManageForm.asp"〉
Sendmesomedata:
〈INPUTTYPE="text"NAME="data"〉
〈P〉
〈INPUTTYPE="submit"VALUE="Submit"〉
〈INPUTTYPE="reset"VALUE="Cancel"〉
〈/FORM〉
ManageForm.asp页吸收用户发送的文本,显现它并将session变量submitted设置为True:
〈HTML〉
〈HEAD〉
〈/HEAD〉
〈BODY〉
Youhavesentthefollowinginformation:
〈P〉
〈%=Request("data")%〉
〈%Session("submitted")=True%〉
〈/BODY〉
〈/HTML〉
以是当用户又回到这个表单时,测试session变量submitted,当它的值为True时,发送给用户的是告诫信息而不是输出表单。这个告诫信息是用HTML和客户机侧的JavaScript代码组合编写的:
〈SCRIPT〉
functionSendAnswer(answer){document.AnswerForm.answer.value=answerdocument.AnswerForm.submit()}
〈/SCRIPT〉
YouhavealreadysubmittedsomeinformationtothisWebsite.
〈BR〉Doyouwantsubmitagain?
〈P〉
〈FORMNAME="AnswerForm"METHOD="post"ACTION="CheckAnswer.asp"〉
〈INPUTTYPE="button"VALUE="Yes"onClick="SendAnswer('Y')"〉
〈INPUTTYPE="button"VALUE="No"onClick="SendAnswer('N')"〉
〈INPUTTYPE="hidden"NAME="answer"VALUE=""〉
〈/FORM〉
表单包括两个按钮((Yes和No)和一个隐含把持域(answer),在个中保留用户所选择的值:Y或N。这个值由JavaScript函数SendAnswer()设置,这个函数还将它发送给CheckAnswer.asp页以实行准确的重定向。假如用户选择了No按钮,CheckAnswer.asp查验隐含把持的值,并将其重定向到一个一般welcome页,反之就将session变量submitted设置为False并再次将其重定向到表单页。
〈%IfRequest("answer")="Y"ThenSession("submitted")=FalseResponse.Redirect"form.asp"ElseResponse.Redirect"welcome.htm"EndIf%〉
把持扫瞄器缓冲器
假如你已实行了以上办法,你会发明,只要当你在扫瞄器的地点文本框内键进URL往返到这个表单时,此办法才见效。它依托的是扫瞄器的缓冲器机制。假如你利用back按钮来前往页,扫瞄器就检测它的缓冲器来找到该页的正本。它将利用缓存的页而不是向服务器收回哀求。以是服务器就不克不及在session变量submitted长进行校验。为了不这类情形,就要克制扫瞄器的页缓冲器。这经由过程在表单页中处置Response工具来完成。作废页缓冲器有多种办法。一切这些办法都要依托HTTP头文件中到扫瞄器的地点唆使。可是一切扫瞄器对服务器发送的唆使反响分歧,以是说最好能多发送一些唆使来为更多的扫瞄器克制缓冲器,按以下代码所示:
〈%Response.AddHeader"cache-control","private"Response.AddHeader"pragma","no-cache"Response.ExpiresAbsolute=#January1,199000:00:01#Response.Expires=0%〉
以上代码的头两利用用Response工具的AddHeader办法来将头信息附加到HTTP头文件中。Expires和ExpiresAbsolute属性用扫瞄器缓冲器中页的延续工夫信息来标志以后页。在表单页中,这些行必需要拔出在一切代码之前,由于她们所援用的信息安排在HTTP头文件中,在一切输入之前发送给扫瞄器。
多步骤表单
假如一个表单必要很多数据,那末最好将你请求的数据分别成多个小表单,如许利用户能够一步一步地添补表单,而不必守候表单加载很多HTML把持。别的另有一些情形,表单中的某些把持不完整需要,而且能够用已提交的数据逐行添补。利用多步骤表单同意显现倚赖于用户之前谜底的定制表单。假如用户在扫瞄器中将一其中间表单设置为书签的话就会发生成绩。在随后的一个session中,用户就试图间接抵达这个表单并提交数据,这些数据已在高低文局限以外,由于原本应当在后面表单搜集的session数据丧失了。
制止利用两头步骤表单
为了不这些成绩,能够存储以后数据搜集的形态。这个形态能够用一个session变量来代表来纪录是不是实行了一个特定的步骤---用户是不是添补了给出的表单。在一个多步骤表单中,每一个表单都能够经由过程一个Boolean型的session变量来完成。假如有关表单没有被处置,变量就为False,反之就是True。下载部分的第二个例子显现一个两步骤表单:第一个表单请求用户名,第二个表单显现一个组合框,它的列表项要依附第一个表单所供应的用户名。第一个表单与一个session变量requested1相干联,你能够设想出来,第二个表单与变量requested2相干联。当用户请求第一个表单(form1.asp)时,session变量requested1被设置为True:
〈FORMMETHOD="post"ACTION="form2.asp"〉
Yourname:〈INPUTTYPE="text"NAME="name"〉
〈P〉
〈INPUTTYPE="submit"VALUE="Submit"〉
〈INPUTTYPE="reset"VALUE="Cancel"〉
〈/FORM〉
〈%</p>帮助用户快速实现各种应用服务,ASP商有整合各方面资源的能力,可在短期内为用户提供所需的解决方案。例如,典型的ERP安装,如果要在客户端安装的话需要半年到二年的时间,但是美国的一些ASP商如USI和CORIO能在90—120天内提供ERP应用方案。 ASP的语言不仅仅只是命令格式差不多,而是包含在<%%>之内的命令完全就是VB语法。虽然ASP也是做为单独的一个技术来提出的,但他就是完全继承了VB所有的功能。 弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。 运用经典的例子。并且自己可以用他来实现一些简单的系统。如果可以对他进行进一步的修改,找出你觉得可以提高性能的地方,加上自己的设计,那就更上一个层次了,也就会真正地感到有所收获。 它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。 Request:从字面上讲就是“请求”,因此这个是处理客户端提交的东东的,例如Resuest.Form,Request.QueryString,或者干脆Request("变量名") Application:这个存储服务端的数据,如果不清除,会直到web应用程序结束才清除(例如重启站点) 掌握asp的特性而且一定要知道为什么。 我们必须明确一个大方向,不要只是停留在因为学而去学,我们应有方向应有目标. 如何更好的使自己的东西看上去很不错等等。其实这些都不是问题的实质,我们可以在实践中不断提升自己,不断充实自己。
页:
[1]