仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 480|回复: 8
打印 上一主题 下一主题

[学习教程] ASP教程之庞大表单的静态天生与静态考证

[复制链接]
金色的骷髅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:32:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
因为现在数据库都使用标准的SQL语言对数据库进行管理,所以如果是标准SQL语言,两者基本上都可以通用的。SQLServer还有更多的扩展,可以用存储过程,数据库大小无极限限制。这里所谓的庞大表单,是指表单中包括多种分歧的输出范例,好比下拉列表框、单行文本、多行文本、数值等。在常常必要改换这类表单的场所,必要有一个表单的静态天生程序。本文先容的恰是如许一个体系,它以数据库保留表单界说数据,使用ASP剧本静态天生表单HTML代码和考证表单输出的剧本。
1、界说数据库表布局

  在Web上常常能够看到“每周查询拜访”之类的表单,这就是一种必要常常更新的表单。假如有一个静态天生表单及其考证剧本的程序,能够年夜年夜削减制造这些表单的事情量。

  在本文的静态表单天生与考证示例中,我们利用一个Access数据库来存储有关表单的界说信息,同时为复杂计,用户在表单中输出的数据也保留到统一数据库。界说表单必要两个表:第一个表(Definitons)用于表单输出域的界说,第二个表(Lists)保留各个输出域的附加信息,好比选择列表的选择项。

  表Definitons包括以下字段:

FieldName――付与表单输出域的变量名字
Label――即文本标签,显现在输出域后面的提醒性笔墨
Type――单个字符,该字符暗示表单输出域的情势和输出值的范例,详细以下:
(t)文本输出框,即<INPUTTYPE="TEXT">。
(n)文本输出框,但请求输出数字值。
(m)备注型内容,用于正文或其他大批文本的输出,它是一个多行文本编纂框。
(b)请求输出“是”或“否”。本完成中将用复选框来猎取这类输出,复选框的文本标签为“是”。假如用户选中它,则前往值是“on”。
(r)单选按钮。
(l)下拉列表框。
Min――仅对数字型输出值无效,在这里给出最小值。在本例中有一个“Age”(岁数)数字型输出框,它的最小值设定为1。
Max――该字段的值与输出域情势有关。关于数字型输出框,它暗示的是同意的最年夜值。比方“Age”的Max值为100。关于文本输出框,Max暗示同意的最多字符个数。关于多行文本编纂框,Max暗示可见地区的文本行数。
Required――暗示是不是必需输出。这类范例的值假如没有输出,则输出考证程序将呈报毛病。在表单中,必需输出的值以星号标志,并以脚注的情势提醒用户该类值必需输出。
  本文的示例表单是一个ASP程序员查询拜访表,在Definitons表中该表单的界说次要以下:

FieldNameLabelTypeMinMaxRequired
Name姓名文本(t)-50否
Age岁数数字(n)1100否
Sex性别单选按钮(r)--是
E-mail邮件地点文本(t)--是
Language编程言语下拉列表框(l)--否

  表Lists用于保留输出域界说的一些附加信息,本例有“Sex”和“Languages”两个输出值要用到它。表Lists十分复杂,只包括以下三个字段:

FieldName――以后纪录属于哪一个表单输出域
Value――选择项的值
Label――用户所看到的选择项的提醒文本
  输出域“Sex”只能从两个值拔取:“男”或“女”。“Language”列出了几种可使用于ASP情况的编程言语,包含:VBScript,JavaScript,C,Perl和“其他”。

  第三个表“Records”保留用户提交的内容,它也包括三个字段,每一个纪录对使用户的一次提交:

Record――备注范例,以查询字符串情势保留的用户输出。
Created――用户提交该表单的日期和工夫。RemoteIP――表单提交者的IP地点。
  在实践使用中大概要搜集更多有关用户的信息,为复杂计,本例只纪录提交工夫和用户IP地点这两个附加信息。

  2、筹办事情

  在完成上述数据布局和表单的界说以后,接上去就能够编写剧本。剧本的义务是天生表单和处置用户提交的表单。

  不管是表单的天生仍是处置,以下三个历程(义务)都是必不成少的:第一是断定考证范例,在天生表单时考证范例值经由过程查询字符串取得,在处置表单时从表单埋没域读取。程序撑持的表单考证体例共有以下四品种型:不举行考证,客户端JavaScript考证,服务器端ASP剧本考证,客户端和服务器端都举行考证(代号分离为0到3)。假如没有在查询字符串中指定正当的考证体例,则默许第四种考证体例。这类考证处置体例使得我们能够天真地使用这个表单天生、处置体系,当客户端克制利用JavaScript考证时就能够仅在服务器端实行考证历程。上面是断定考证范例的代码:

 反省考证范例
 iValType=Request.QueryString("val")
 IfIsNumeric(iValType)=FalseTheniValType=3
 IfiValType>3OriValType<0TheniValType=3
  第二个义务是翻开数据库毗连,创立两个纪录集工具:RS工具,这是本程序中的次要纪录集工具,用来操纵Definitions表;RSList工具,次要用于从Lists表读取数据。示例程序供应两种数据库毗连办法:利用ODBCDSN或不利用ODBCDSN(利用DSN时必要先创立名为Dynamic的DSN,利用DSN毗连数据库的代码已被正文失落)。

  第三个义务是在天生(或处置)表单剧本的后面(和前面)输入一些静态的HTML代码,好比<HEAD></HEAD>,和在剧本运转停止的时分开释RS、RSList等工具占用的资本。
  除完成上述义务的代码外,示例使用中其他ASP剧本大概天生的页面有两品种型:发问表单(见上图)和表单提交后呈现的了局页面(后者同时还卖力用户提交了局的纪录)。要断定事实运转哪一部分剧本,最复杂的办法就是反省是不是已提交表单:如是,则处置表单;不然天生表单。

 是天生表单仍是处置表单?
 IfLen(Request.Form)=0Then
 天生表单
 ...略...
 Else
 处置表单
 ...略...
 EndIf
  3、静态天生表单

  天生表单时,程序依照Definitons表中的各个输出域界说纪录,顺次天生响应的表单HTML代码和JavaScript代码。HTML代码中起首要天生的是文本标签:

 sHTML=sHTML&vbTab&"<TR>"&vbCrLf&vbTab&vbTab
 sHTML=sHTML&"<TDVALIGN="&Chr(34)&"TOP"&Chr(34)
 sHTML=sHTML&">"&vbCrLf&vbTab&vbTab&vbTab
 sHTML=sHTML&"<B>"&RS.Fields("Label")
  然后程序反省以后输出域是不是必需输出。假如必需,则在标签文本以后加一个星号(暗示该值必需输出),同时关于必需输出的值,还要天生响应的JavaScript代码来考证它。关于单选按钮或选择列表,需进一步反省用户的确选择了某个选项;关于一切其他输出范例,只需反省输出值不为空便可。

  紧接文本标签的是表单的输出元素,这些元素的HTML代码依据Definitions表中指定的范例和属性天生。再接上去就是依据输出值请求天生实行客户端考证义务的JavaScript代码。关于本例,只要数字型的值必要进一步反省以包管用户的输出的确是数字,并且数字值在允许的最年夜值和最小值之间。天生上述代码以后,就能够停止一个表格行(也就是一个输出域)持续处置Definitions表的下一个纪录。一旦一切的数据库纪录处置终了,下一步就能够到场“提交”按钮和“扫除”按钮的HTML代码。假如换个角度来看,程序在这里的义务就是依据数据库纪录天生各个输出域,每一个输出域占用一个表格行,每一个表格行二个单位:第一个单位用来显现文本标签,第二个单位显现输出元素自己(代码见dForm.asp)。

  上述历程停止以后,表单的HTML代码和考证用JavaScript函数分离保留到了变量sHTML和sJavaScript中。在把这些内容写进页面之前,程序反省客户端是不是请求实行JavaScript考证,假如不请求实行这类考证,则扫除sJavaScript变量:

 IfiValType=0OriValType=2ThensJavaScript=""
  在输入BODY标志以后,程序输入以下JavaScript函数:

 <SCRIPTLANGUAGE="JavaScript">
 <!--
 functionvalidate(TheForm){
 //客户端表单考证
 <%=sJavaScript%>
 returntrue;
 }
 
 functionCheckRadio(objRadio){
 //单选按钮中是不是有某个值被选中
 for(varn=0;n<objRadio.length;n++){
 if(objRadio[n].checked){
 returntrue;
 }
 }
 returnfalse;
 }
 
 functionCheckList(objList){
 //是不是已在选择列表当选择了某个值
 for(varn=1;n<objList.length;n++){
 if(objList.options[n].selected){
 returntrue;
 }
 }
 returnfalse;
 }
 //-->
 </Script>
  假如客户端不必要JavaScript考证,则validate函数只剩下一个“returntrue”语句。下面代码中的前面两个静态JavaScript函数(CheckRadio和CheckList)用于考证单选按钮和下拉列表框,当这两种输出域必要考证时validate函数将挪用它们。

  如今能够入手下手把表单写进页面:

 <FORMACTION="./dform.asp"METHOD="POST"NAME="MyForm">
  在这里,只要当validate函数前往true时才实行表单提交操纵。因而当客户端JavaScript考证功效封闭时,validate函数将主动前往true。

  接上去要到场的是名为val的埋没域。如前所述,该值唆使表单的考证形式。

 <INPUTTYPE="HIDDEN"NAME="val"VALUE="<%=iValType%>">
  当用户提交表单时,处置剧本将依据该值断定是不是实行服务器端考证。

  然后输入的是表格标志和表格题目。题目保留在变量sTitleLabel中,该值在剧本入手下手实行时初始化:

 <TABLEBORDER="0">
 <TR>
 <TDCOLSPAN="2"ALIGN="CENTER">
 <H2><%=sTitleLable%></H2>
 </TD>
 </TR>
  作为改善措施,能够在表Definitions、Lists和Records中增添一个字段FormID。FormID独一标识一个表单,如许程序就能够同时地界说多个表单、保留多个表单的用户应对了局。至于下面的sTitleLabel,我们能够用别的一个表(好比Forms)来保留。

  紧接着表格标志和表格题目,程序输入的是HTML表单和“提交”、“扫除”按钮的代码。在此以后,程序反省sHTML字符串中是不是包括“*”,如包括的话申明表单中存在必需输出的内容,此时就输入一个脚注以申明该星号的寄义。

 <%=sHTML%>
 <TR>
 <TDCOLSPAN="2"ALIGN="CENTER">
 <INPUTTYPE="SUBMIT"VALUE="提交表单"><INPUTTYPE="reset"VALUE="扫除">
 </TD>
 <%
 是不是存在必须输出的表单域,如存在,则输入表单脚注注释*的寄义
 IfInStr(sHTML,"*")Then
 %>
 </TR>
 <TDCOLSPAN="2"ALIGN="CENTER">
 <FONTSIZE="2">注重:有星号标志的值必须输出。</FONT>
 </TD>
 </TR>
 <%
 EndIf
 %>
 </TABLE>
 </FORM>
  至此为止,表单的天生义务已完成。

  4、处置提交了局

  ASP剧本剩下的义务是服务器真个表单处置,包含考证、将了局保留到数据库和“提交乐成/失利”页面的显现。在这部分表单考证代码顶用到了一个字符串变量sBadForm,程序用它来保留毛病信息。假如在考证历程停止时sBadForm为空,申明用户提交的表单是正当的;不然,回绝该表单的提交并把sBadForm前往给扫瞄器。

  不论表单接纳哪一种考证形式,反省HTTP_REFERER都是一种好的习气。这类反省能够避免剧本被盗用。要反省某个POST是不是来自本网站的页面或剧本,只需对照两个服务器变量便可:

 IfInStr(Request.ServerVariables("HTTP_REFERER"),_
 Request.ServerVariables("HTTP_HOST"))=0Then
 sBadForm="<LI>表单提交自不准确的地位。"&vbCrlf
 EndIf
  假如表单的埋没域唆使必需举行服务器端考证,则程序遍历表单界说数据库纪录作响应的反省,其历程与表单的天生十分类似,只不外此时程序是考证表单,且把输出值不法信息到场到sBadForm中往罢了。详细代码见dForm.asp。

  程序最初反省sBadForm是不是为空。如不为空,则回绝表单提交并将sBadForm写进扫瞄器。假如sBadForm为空,则在Records表增添一个纪录保留表双数据。在保留表单内容之前必要删除埋没域val,这个埋没域老是表单的第一个输出域:

 IfLen(sBadForm)=0Then
 RS.Open"Records",DB,3,2,&H0002
 RS.AddNew
 RS.Fields("Record")=Mid(Request.Form,InStr(Request.Form,"&")+1)
 RS.Fields("Created")=Now()
 RS.Fields("RemoteIP")=Request.ServerVariables("REMOTE_ADDR")
 RS.Update
 Response.Write("<H1>感谢.</H1>")
 RS.Close
 Else
 Response.Write("<H1>表单提交失利。</H1>")
 Response.Write(vbCrLf&sBadForm)
 EndIf
 EndIf
  这就是服务器端表单处置的全体历程。依据是不是存在已提交的表单,我们能够把后面天生表单的代码和这里表单处置的代码用If语句封装,使得这两部分剧本共享部分公用代码,好比HTML文档的头、数据库工具的创立和资本开释等。

  总地看来,dForm.asp只具有了静态表单天生、考证所必须的中心功效,疏忽了很多细节成绩的处置。好比后面已提到的多表单成绩:增添一个表办理多个表单,使得剧本具有办理、天生、处置指定表单的才能。别的一个分明的缺少是表单界说数据的增添、删除和更新功效,和用户提交了局数据的会见,这类功效能够在一个自力的程序中完成,并且在年夜多半情形下能够做成传统的使用程序(非B/S布局的使用)。最初,dForm.asp撑持的输出域范例也无限,在理论中大概会有其他的表单输出请求,好比公用的e-mail地点输出框等。但是,关于那些常常要更新表单的网站来讲,本文所会商的表单静态天生、静态考证功效的确长短常有效的。
对于中小型web应用来说,php有很强的竞争力,linux+apache+mysql+php(lamp)的组合几乎可以胜任绝大多数网站的解决方案,对于大型应用来讲,对于系统架构要求更高,需要有成熟的框架支持,jsp的struts是个不错的框架,国内介绍它的资料也非常多,应用逐渐广泛起来。asp就不用说了,
山那边是海 该用户已被删除
沙发
发表于 2015-1-19 16:23:29 | 只看该作者
Session:这个存储跟客户端会话过程的数据,默认20分钟失效
板凳
发表于 2015-1-26 05:15:27 | 只看该作者
Request:从字面上讲就是“请求”,因此这个是处理客户端提交的东东的,例如Resuest.Form,Request.QueryString,或者干脆Request("变量名")
活着的死人 该用户已被删除
地板
发表于 2015-2-4 13:30:29 | 只看该作者
最近在学asp,不要问我为什么不直接学.net,因为公司网站是asp做的所以有这个需要,卖了本书asp入门到精通,对里面的六大内置对象老是记不住,还有很多属性和方法看的头晕。
不帅 该用户已被删除
5#
发表于 2015-2-9 23:48:07 | 只看该作者
还有如何才能在最短的时间内学完?我每天可以有效学习2小时,双休日4小时。
深爱那片海 该用户已被删除
6#
发表于 2015-2-28 09:25:30 | 只看该作者
如何学好ASP,以前也有人问过,把回答给你转过来看看能否对你有帮助:
灵魂腐蚀 该用户已被删除
7#
发表于 2015-3-9 22:07:48 | 只看该作者
还有如何才能在最短的时间内学完?我每天可以有效学习2小时,双休日4小时。
精灵巫婆 该用户已被删除
8#
发表于 2015-3-17 02:09:20 | 只看该作者
下面简单介绍一下我学习ASP的方法,希望对想学习ASP的朋友有所帮助...
admin 该用户已被删除
9#
发表于 2015-3-23 17:10:36 | 只看该作者
Server:这个表示的服务器,操作服务器的一些东西使用这个,如Server.Mappath转换服务器路径,Server.CreateObject实例化一个组件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 04:18

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表