|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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就不用说了, |
|