首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

ASP+JS处理复杂表单的生成与验证[2]解决思路

2012-01-28 
ASP+JS处理复杂表单的生成与验证[2]上述过程结束之后,表单的HTML代码和验证用JavaScript函数分别保存到了

ASP+JS处理复杂表单的生成与验证[2]
上述过程结束之后,表单的HTML代码和验证用JavaScript函数分别保存到了变量sHTML和sJavaScript中。在把这些内容写入页面之前,程序检查客户端是否要求执行JavaScript验证,如果不要求执行这类验证,则清除sJavaScript变量:

  If   iValType   =   0   Or   iValType   =   2   Then   sJavaScript   =   " "

  在输出BODY标记之后,程序输出如下JavaScript函数:

以下是引用片段:
    <   SCRIPT   LANGUAGE= "JavaScript "   >    
    <   !--    
    function   validate(TheForm){    
    //客户端表单验证    
    <   %=sJavaScript%   >    
    return   true;    
    }    
       
    function   CheckRadio(objRadio){    
    //单选按钮中是否有某个值被选中    
    for(var   n   =   0;   n   <   objRadio.length;   n++){    
    if(objRadio[n].checked){    
    return   true;    
    }    
    }    
    return   false;    
    }    
       
    function   CheckList(objList){    
    //是否已经在选择列表中选择了某个值    
    for(var   n   =   1;   n   <   objList.length;   n++){    
    if(objList.options[n].selected){    
    return   true;    
    }    
    }    
    return   false;    
    }    
    //--   >    
    <   /Script   >  


  如果客户端不需要JavaScript验证,则validate函数只剩下一个“return   true”语句。上面代码中的后面两个静态JavaScript函数(CheckRadio和CheckList)用于验证单选按钮和下拉列表框,当这两种输入域需要验证时validate函数将调用它们。

  现在可以开始把表单写入页面:

   <   FORM   ACTION= "./dform.asp "   METHOD= "POST "   NAME= "MyForm "   onSubmit= "return   validate(this) "   >

  在这里,只有当validate函数返回true时才执行表单提交操作。因此当客户端JavaScript验证功能关闭时,validate函数将自动返回true。

  接下来要加入的是名为val的隐藏域。如前所述,该值指示表单的验证模式。

   <   INPUT   TYPE= "HIDDEN "   NAME= "val "   VALUE= " <   %=iValType%   > "   >

  当用户提交表单时,处理脚本将根据该值确定是否执行服务器端验证。

  然后输出的是表格标记以及表格标题。标题保存在变量sTitleLabel中,该值在脚本开始执行时初始化:

以下是引用片段:
    <   TABLE   BORDER= "0 "   >    
    <   TR   >    
    <   TD   COLSPAN= "2 "   ALIGN= "CENTER "   >    
    <   H2   > <   %=sTitleLable%   > <   /H2   >    
    <   /TD   >    
    <   /TR   >  


  作为改进措施,可以在表Definitions、Lists和Records中增加一个字段FormID。FormID唯一标识一个表单,这样程序就可以同时地定义多个表单、保存多个表单的用户应答结果。至于上面的sTitleLabel,我们可以用另外一个表(比如Forms)来保存。

  紧接着表格标记和表格标题,程序输出的是HTML表单以及“提交”、“清除”按钮的代码。在此之后,程序检查sHTML字符串中是否包含“*”,如包含的话说明表单中存在必须输入的内容,此时就输出一个脚注以说明该星号的含义。

以下是引用片段:
    <   %=sHTML%   >    
    <   TR   >    
    <   TD   COLSPAN= "2 "   ALIGN= "CENTER "   >    
    <   INPUT   TYPE= "SUBMIT "   VALUE= "提交表单 "   >   <   INPUT   TYPE= "reset "   VALUE= "清除 "   >    


    <   /TD   >    
    <   %    
    '是否存在必需输入的表单域,如存在,则输出表单脚注解释 '* '的含义    
    If   InStr(sHTML, "* ")   Then    
    %   >    
    <   /TR   >    
    <   TD   COLSPAN= "2 "   ALIGN= "CENTER "   >    
    <   FONT   SIZE= "2 "   > 注意:有星号标记的值必需输入。 <   /FONT   >    
    <   /TD   >    
    <   /TR   >    
    <   %    
    End   If    
    %   >    
    <   /TABLE   >    
    <   /FORM   >  


  至此为止,表单的生成任务已经完成。

  四、处理提交结果  
  ASP脚本剩下的任务是服务器端的表单处理,包括验证、将结果保存到数据库以及“提交成功/失败”页面的显示。在这部分表单验证代码中用到了一个字符串变量sBadForm,程序用它来保存错误信息。如果在验证过程结束时sBadForm为空,说明用户提交的表单是合法的;否则,拒绝该表单的提交并把sBadForm返回给浏览器。

  不管表单采用哪种验证模式,检查HTTP_REFERER都是一种好的习惯。这种检查可以防止脚本被盗用。要检查某个POST是否来自本网站的页面或脚本,只需比较两个服务器变量即可:

以下是引用片段:
  If   InStr(Request.ServerVariables( "HTTP_REFERER "),   _  
  Request.ServerVariables( "HTTP_HOST "))   =   0   Then  
  sBadForm   =   " <   LI   > 表单提交自不正确的位置。 "   &   vbCrlf  
  End   If  


  如果表单的隐藏域指示必须进行服务器端验证,则程序遍历表单定义数据库记录作相应的检查,其过程与表单的生成非常相似,只不过此时程序是验证表单,且把输入值非法信息加入到sBadForm中去而已。具体代码见dForm.asp。

  程序最后检查sBadForm是否为空。如不为空,则拒绝表单提交并将sBadForm写入浏览器。如果sBadForm为空,则在Records表增加一个记录保存表单数据。在保存表单内容之前需要删除隐藏域val,这个隐藏域总是表单的第一个输入域:

以下是引用片段:
  If   Len(sBadForm)   =   0   Then  
  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)  
  End   If  
  End   If  


  这就是服务器端表单处理的全部过程。根据是否存在已经提交的表单,我们可以把前面生成表单的代码和这里表单处理的代码用If语句封装,使得这两部分脚本共享部分公用代码,比如HTML文档的头、数据库对象的创建和资源释放等。

  总地看来,dForm.asp只具备了动态表单生成、验证所必需的核心功能,忽略了许多细节问题的处理。比如前面已经提到的多表单问题:增加一个表管理多个表单,使得脚本具有管理、生成、处理指定表单的能力。另外一个明显的缺乏是表单定义数据的增加、删除和更新功能,以及用户提交结果数据的访问,这类功能可以在一个独立的程序中实现,而且在大多数情况下可以做成传统的应用程序(非B/S结构的应用)。最后,dForm.asp支持的输入域类型也有限,在实践中可能会有其他的表单输入要求,比如专用的e-mail地址输入框等。然而,对于那些经常要更新表单的网站来说,本文所讨论的表单动态生成、动态验证功能确实是非常有用的。


http://help.csai.cn/html/200701121622261806.htm

[解决办法]
不多,顶了
接分...

热点排行