struts验证框架

2023-11-18

关于validation.xml

 

在validator.xml中使用了validation-rules.xml的验证规则
注意一定要加其已经定义好的出错消息考到你的资源包里去,否则出错的时候,显示错误对话框
里面却什么错误消息都没有,不允许发生这样的错误


---------------------------------------------------------------------------------
<arg>:一共可定义4个(arg0..arg3),作用是向资源文件提供参数的值。属性同<msg>
<arg1 key="${var:min}" resource="false"/>
        <var>
          <var-name>min</var-name>
          <var-value>10</var-value>
        </var>
既是代替资源包中{1}的参数值
又是在验证规则中传进了参数
记住将resource="false"(当设为false时,key值可自定义)

---------------------------------------------------------------------------------
11月15日
Validator验证框架
validator.xml
在validator.xml 文件中定义formset 元素时,需要使用校验器和消息关键字,如清单12.3formset 元素
<!—① -->
<formset>
<!—②-->
<form name="logonForm">
<!—③,④ -->
<field
property="username"
depends="required,mask">
<!—⑤-->
<msg name key="logon.username.maskmsg"/>
<!—⑥-->
<arg0 key="logon.userName.displayName"/>
<!—⑦,⑧-->
<var>
<var-name>mask</var-name>
<var-value>^[a-zA-Z0-9]*$</var-value>
</var>
</field>
<!—⑨ -->
<field property="password"
depends="required,minlength">
<arg0 key="logon.password.displayName"/>
<var>
<var-name>minlength</var-name>
<var-value>5</var-value>
</var>
</field>
</form>
<!-- ... -->
</formset>
○1 formset 是一个或者多个form的包装器.
○2 每个form 元素都要给定其自身的名称。这应该对应于Struts 配置中的form bean 名称或
者 action 的路径。
○3 每个form 元素有一些field 元素组成
○4 field 元素通过depends 属性指出要使用哪个校验器。
○5 可选的msg 元素允许你指定针对一个校验器的定制消息和用于替换参数的消息关键字
○6 arg0 元素指定了那些需要它们的消息所用的第一个替换参数
○7 var 元素用于传递变量属性到校验器中。
○8 这里传递了一个正则表达式到mask 校验器。表达式意思是用户名称只可以包含字母和
数字。.
○9 这里我们设置password 是必须的,并且至少有5个字符的长度。password 长度是一个业
务需求,帮助使用户账户更加安全。
password 校验消息使用了缺省 minlength or required 消息,该消息定义于
validation-rules.xml (errors.minlength and errors.required)。


<form>:指定要校验的ActionForm
属性 描述 name 指定要校验的ActionForm的名字  <field>:指定要校验ActionForm的哪一个属性
属性 描述 property 指定要校验的ActionForm中的属性名 depends 所用的校验规则,在validation-rules中定义 page ?当此属性的值小于或等于与此form相关的javabean的page值时,此field才会被处理 indexedListProperty ?The method name that will return an array or a Collection used to retrieve the list and then loop through the list, performing the validations for this field.  
 
<msg>:校验失败时加到Action Errors中的信息,用来替代validator-rules中默认的错误信息
属性 描述 name 使用校验的规则名 key 资源文件中的key或自定义的值 Resource 当设为false时,key值可自定义
 
<arg>:一共可定义4个(arg0..arg3),作用是向资源文件提供参数的值。属性同<msg>

 


---------<msg>的重要作用---------------------------------------------------------
在某些情况下,您可能想提供一个更具体的错误消息而不是在资源束文件中定义的缺省错误消息。
例如,如果您有一个 Mask 验证器,缺省错误消息是,该值是无效的,而没有关于无效性的详细情况。
您可以用另一个消息覆盖 Mask 验证器的错误消息,
方式是将如下一行代码添加到 validator.xml 中:
  <msg name="mask" key="some.other.error.msg"/>。

将如下一行代码添加到文件 ApplicationResources.properties 中并保存:
some.other.error.msg = {0} is not a 5-digit number

如下编辑 validation.xml 并保存:

<form-validation>
   <formset>
    <form name="submitForm">
     <field property="name" depends="required,mask">
     <msg name="mask" key="some.other.error.msg"/> !!!!!在这里加上这么一句,替换mask的消息,
     !!!这里可以用多个<msg>来替换所有的原始消息,比如再加一个<msg>替换required
     <msg>的name属性必需来自上面的depends,因为它要替换其中验证规则的错误消息
     <arg0 key="submitForm.name"/>
         <var>
           <var-name>mask</var-name>
           <var-value>^//d{5}//d*$</var-value>
         </var>
     </field>
    </form>
   </formset>
</form-validation>

------一些验证规则的用法------------------------------------------------------------
你depends引用任何一个validator-rules.xml中的规则,它都对应一个默认的错误信息
如:xxx{0}xxxxx
如果你引用了很多个规则,则有以下错误信息
   xxx{0}xxx
   xxx{0}xxx{1}xxx{2}xxx...
则你需要<arg0 <arg1 <arg2
因为你验证的是一个页面的组件,则<arg0 一定是此组件的名字
为了实现国际化,此组件的名字可能在资源包中,如xx.xx
则从xx.xx中获得键的值,然后又赋给资源包中的{0}参数(就是<arg0>)

记住不论引用几种验证规则,{0}可以重复,它代表组件名,它以上的不能重复
   xxx{0}xxx       
   xxx{0}xxx{1}xxx            第二个验证规则
   xxx{0}xxx{1}xxx{2}xxx...   第三个验证规则
这样的情况应该是不存在的
因为如果写了第二个验证规则的<arg1
        <arg1 key="${var:minlength}" resource="false"/>
        <var>
          <var-name>minlength</var-name>
          <var-value>8</var-value>
        </var>
又写第三个验证规则的<arg1
同时出现两个<arg1
这怎么说也非常不适合逻辑


检查是不是字母的正则表达式:^[a-zA-Z]*$

验证minlength(输入的最小长度)
      <field property="userName" depends="required,minlength">
        <arg0 key="label.username"/>
        <arg1 key="${var:minlength}" resource="false"/>
        <var>
          <var-name>minlength</var-name>
          <var-value>8</var-value>
        </var>
      </field>
验证intRange(取值范围)
      <field property="age" depends="required,intRange">
        <arg0 key="label.age"/>
        <arg1 key="${var:min}" resource="false"/>
        <arg2 key="${var:max}" resource="false"/>
        <var>
          <var-name>min</var-name>
          <var-value>10</var-value>
        </var>
        <var>
          <var-name>max</var-name>
          <var-value>70</var-value>
        </var>
      </field>
验证信用卡号
      <field property="idCard" depends="required,creditCard">
        <arg0 key="label.idcard"/>
      </field>
验证日期格式(比如出生日期)
      <field property="birthday" depends="required,date">
        <arg0 key="label.birthday"/>
        <var>
          <var-name>datePatternStrict</var-name>
          <var-value>yyyy-MM-dd</var-value>
        </var>
      </field>
验证email和url
    depends="email">
  <arg0 key="prompt.email" />
</field>
<field property="url"
    depends="url">
  <arg0 key="prompt.url" />
</field>

使用mask验证(可以使用各种正则表达式)
    depends="required,mask">
  <arg0 key="prompt.phone" />
  <var>
    <var-name>mask</var-name>
    <var-value>^/(?(/d{3})/)?[-| ]?(/d{3})[-| ]?(/d{4})$</var-value>
  </var>
</field>
但是,可以容易地在多个地方使用同一个掩码。每次使用时不必重新定义,只要把掩码定义移动到 global constant 即可。
请把下面的内容添加到 validation.xml 文件中的 global 元素内(靠近文件顶部):
<global>
  <constant>
    <constant-name>phone</constant-name>
    <constant-value>^/(?(/d{3})/)?[-| ]?(/d{3})[-| ]?(/d{4})$</constant-value>
  </constant>
</global>
然后在下面使用${phone} <field property="phone"
    depends="required,mask">
  <arg0 key="prompt.phone" />
  <var>
     <var-name>mask</var-name>
     <var-value>${phone}</var-value>
  </var>
</field>

 

-------------------------------------------------

关于 validator-rules.xml

分析一下validator-rules.xml中已经配置好的验证规则
<form-validation>

   <global>

      <validator name="required"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateRequired"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionErrors,
                       javax.servlet.http.HttpServletRequest"
                  msg="errors.required">

         <javascript><![CDATA[
            function validateRequired(form) {
                var isValid = true;
                var focusF......

属性
 描述
 
name
 指定一个规则名,用来被其它规则引用
 
ClassName
 包含校验规则的类
 
method
 此校验规则在类中实际对应的方法
 
methodParams
 Method方法的参数
 
depends
 引用其它的规则(在当前规则之前被调用)
 
msg
 资源文件中的关键字,当校验不通过时,此关键字中的信息将加入到errors集合中。
 
jsFunctionName
 指定一个JavaScript函数名
 
----------------------------------------------------------

validator验证

1.1 组成与配置
配置文件: validator-rules.xml、validation.xml
由于validation.xml是要自定义的,所以里面的元素希望都能够记下来
并且能够将validation.xml手写出来
当然validator-rules.xml不要求你会手写,但是请记住里面有哪些元素与属性

验证需要用到的库
commons-beanutils.jar: Commons BeanUtils
commons-collections.jar: Commons Collections
commons-digester.jar: Commons Digester
commons-logging.jar: Commons Logging
commons-validator.jar: Commons Validator
jakarta-oro.jar: Jakarta ORO
 
validator验证分服务器端验证和客户端验证
用了哪一种验证很好区别
如果是在注册页面上出文字(使用了<html:errors/>),则是服务器端验证
如果是弹出了一个对话框,则是使用了客户端验证

---------------------------------------------------------------------------------
服务器端的验证

为了使用服务器端验证,Action Form 实现类应该扩展 ValidatorForm 而不是 ActionForm。当提交表单时,会执行 ValidatorForm 中的 validate() 方法,它将根据 validation-rules.xml 和 validation.xml 文件进行验证。


1.扩展ValidatorForm类构造ActionForm
public class SubmitForm extends org.apache.struts.validator.ValidatorForm{...
2.修改ActionForm的validate()方法如下
 public ActionErrors validate(ActionMapping mapping,HttpServletRequest request)
 { 
   return super.validate(mapping, request);
 }
3.需要在JSP注册文件中的某一个地方添加 <html:errors/> 行以使错误显示出来。

---------------------------------------------------------------------------------
客户端的验证

为了使用客户端验证,Action Form 应该扩展 ValidatorActionForm 而不是 ActionForm。
如前所述,对于服务器端验证,Action Form 扩展的是 ValidatorForm 类。


1.扩展ValidatorActionForm类构造ActionForm
public class SubmitForm extends org.apache.struts.validator.ValidatorActionForm {
2.服务器端验证时必需的<html:errors /> 在客户端验证时不再需要,删除。
  去掉validate()方法
// public ActionErrors validate(ActionMapping mapping,HttpServletRequest request)
// { 
//   return super.validate(mapping, request);
// }

3.将<html:javascript formName="checkoutForm"/>加在jsp文件末尾,即</html:html>前。

它的作用是将validation-rules.xml中与”checkoutForm”相关的校验规则的javascript插入此页面中。

4.在<html:form>中加onsubmit属性。
  例如:<html:form action="/saveArticleType" οnsubmit="return validateCheckoutForm(this);">
  说明:validateCheckoutForm()方法是在步骤3中自动生成的。
  <html:javascript>将根据formName的属性值(例如:xxx),生成validatexxx()方法。
---------------------------------------------------------------------------------
扩展对象选择
在为Form选择扩展对象时,要注意:Struts框架提供了两种选择。
第一种选择是使用ValidatorForm或者DynaValidatorForm;
第二种选择是使用ValidatorActionForm或者DynaValidatorActionForm。

使用第一种方式时,Validator.xml中的form元素的name属性必须和struts-config.xml中的action元素的name属性相匹配。

使用第二种方式时,Validator.xml中的form元素的name属性则是与struts-config.xml中的action元素的path属性相匹配。


---------------------------------------------------------------------------------


在 JSP 中支持验证

这些规则都不错,但是仍然有一个显著的问题:JSP 页面没有办法报告错误!例如,如果这里重新部署应用程序,将会发现用错误的值 提交验证表单不会 转向 success.jsp。这是对的,也是朝着正确方向的一步。但是,它也特别令人郁闷;表单只是在浏览器中重新出现,至于出了什么错误却没有任何指示。

请打开 pages/test-validation.jsp 来处理这个问题。首先,需要提供了一个地方,供发生错误时显示。这可以由 html:errors 元素很好地处理。请把以下内容插在 html:form 元素前:
             
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>

<html:html />

<html>
 <head>
  <title><bean:message key="valid.title" /></title>
 </head>              <html:errors />            
<html:form action="/SubmitValid" focus="username">

如果现在重新部署,并试着输入错误数据,将开始看到错误消息出现在<html:errors/>处


现在朝着真正坚固的验证又进了一步。但是,仍然在服务器端;在提交表单时会得到讨厌的闪烁,然后不得不等待服务器响应。这里的目标是用 JavaScript 编码的验证(或者更好一些,不必为了每个表单手工编写 JavaScript)。高兴的是,只要几个额外标记,Validator 就允许把它的服务器端代码转换成客户端 JavaScript 脚本:           

</html:form>

<html:javascript formName="ValidationForm" cdata="false" />

 </body>


不是很多哦!只有一行代码,但是它告诉 Struts 插入所有支持表单客户端验证的 JavaScript。还请注意非常重要的 cdata 属性。必须 把它设置成 false,否则客户端验证不会工作。如果把它设置成 true(默认设置),那么 Struts 生成的 HTML 会把 JavaScript 放在 <![CDATA[ 和 ]]> 标记内。由于一些我不太清楚的原因,多数现代浏览器(Mozilla Firefox 和 Safari 在其中最出名)会忽略这样包含的 JavaScript,所以客户端验证不会执行。

在这一阶段,我要指出,即使忘记了 cdata=false 这一部分,仍然可以得到验证,只不过是在服务器端而已。在任何情况下,Validator 在服务器端都会验证数据,所以如果忘记了这个属性、甚至关闭 JavaScript 或跳过它,也都会得到一个备份。使用 Validator 有一个很好的副作用 —— 它会尝试并捕获每个可能的错误。

(说明:如果按照作者的说法,得不到下面的测试结果,还需要修改一个地方)
修改文件test-validation.jsp,增加οnsubmit="validateValidationForm(this)
<html:form action="/SubmitValid" οnsubmit="validateValidationForm(this)"  focus="username">

 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

struts验证框架 的相关文章

  • 使用 ES6 `import` 语法时出现“无法解析符号”

    Here http www qimingweng com react modal dialog 给出了如何从模块导入某些类的示例 import ModalContainer ModalDialog from react modal dial
  • 当函数定义为无参数时,为什么我可以调用带参数的函数?

    再会 我偶然发现了一些我在 JavaScript 领域从未见过的东西 但我想对于更了解该语言的人来说这是很容易解释的 下面我有以下函数 代码取自书籍 JavaScript Ninja 的秘密 function log try console
  • 如何使用 selenium webdriver 单击 div 按钮?

    我有这个按钮 div class dsk col 1 4 card new div class div center div span class icon icon plus black symbol span h2 Create h2
  • 如何在使用“document.createElement()”方法创建单元格后立即在 JavaScript 中设置单元格宽度?

    我已经使用 document createElement td 方法在 html 页面中为动态表格创建了单元格 现在希望用一些不同的值设置每个单元格的宽度 尝试过 cell width width 但它不起作用 我怎样才能实现它 Use s
  • rvest - 在 1 个标签中抓取 2 个类

    我是新来的 如何提取标签中具有 2 个类名或仅 1 个类名的元素 这是我的代码和问题 doc lt paste span class a1 b1 text1 span span class b1 text2 span library rve
  • Facebook 分享不显示来自开放图元标签的图像

    我正在尝试将 Facebook 共享按钮集成到我雇主的网站 标题 网址 描述 简介均显示正确 但未附加任何图像 当共享对话框打开时 图像容器会闪烁 然后消失 就好像 facebook 正在尝试处理图像但失败一样 我正在使用 og image
  • 如何使子元素被访问/活动时父元素的颜色发生变化

    我有一个下拉导航 我想要做的是 当我单击任何子菜单链接时 我希望父按钮的颜色在链接处于活动状态时保持更改 这是代码的小提琴链接 https jsfiddle net v28ydshL https jsfiddle net v28ydshL
  • React this.setState 不是一个函数

    尝试编写使用第 3 方 API 的应用程序时不断收到此错误 类型错误 this setState 不是一个函数 当我尝试处理 API 响应时 我怀疑这个绑定有问题 但我不知道如何修复它 这是我的组件的代码 var AppMain React
  • preg_match_all JS 等效吗?

    Javascript 中是否有与 PHP 的 preg match all 等效的函数 如果没有 将正则表达式的所有匹配项放入数组的最佳方法是什么 我愿意使用任何 JS 库来让它变得更容易 您可以使用match使用全局修饰符 gt gt g
  • 高度在 IOS (iphone) 上无法正常工作

    我已经创建了this https codepen io salman15 project live DWbWpo Codepen 上的网站 在尝试使其响应所有平台时 我遇到了问题 看起来单个 div 覆盖了整个页面 仅在 IOS 上 并且并
  • Bootstrap 居中 div 内的文本左对齐

    我有一段 4 行诗 位于居中的 div 中 因为它是诗歌 所以我需要将 4 行左对齐 但不要对齐到 div 的左侧 这是它的居中方式 Lorem ipsum dolor sit amet onsectetur adipisicin Dolo
  • 辅助功能:在密码输入中显示/隐藏密码按钮

    密码输入具有显示 隐藏按钮是很常见的 但我在网上发现很少有关于与其相关的可访问性问题的内容 我是否应该将任何类型的 ARIA 属性附加到按钮或密码输入 是一个复选框还是一个触发JS的按钮也能达到很好的效果 不知道我应该注意什么 作为一个不太
  • 如何使用 facebook 用户登录我的网站?

    我想知道 facebook 如何让用户登录我们的网站 我的意思是用户需要注册到我的网站才能发表评论 我如何通过我的 php 代码检查它是否是登录用户 我听说你只能用javascript检查它是否是登录用户 感谢您的任何解释 您可以使用脸书
  • 将复杂对象传递给 ui-sref 参数

    我需要这样的构建网址 列表 过滤器 状态 1 过滤器 类型 2 I do link a List a 在参数中传递复杂对象 如果传递简单对象 filter 1 可以 但我需要这个 state state list url list filt
  • 删除数组中的重复元素[重复]

    这个问题在这里已经有答案了 可能的重复 在 JavaScript 数组中查找重复值的最简单方法 https stackoverflow com questions 840781 easiest way to find duplicate v
  • AngularJs:当放置在 ng-view 标签内时,ng-include 不起作用

    我正在通过 ng view 内的角度路线加载 html 页面 我正在加载的页面包含一个 ng include 标签 指向 另一个 html 文件 我尝试了以下所有语法 div src div div div div src include
  • 为什么直接访问对象文字上的属性会引发语法错误?

    当尝试访问该属性时a物体的 a 我收到错误 SyntaxError Unexpected token 有了括号一切都很好 a 为什么我首先会收到错误 有歧义吗 花括号被解释为块语句 http es5 github com x12 html
  • 删除已从另一个下拉菜单中选择的下拉值

    我在网上搜索了一段时间 但仍然找不到答案 我的网站上有三个下拉菜单 我使用它们来接受用户首选项 以便用户可以控制结果的输出 所以我想知道如果在其中一个下拉列表中选择了该值 是否可以从其他两个下拉列表中取出该值 例如 如果用户在第一个电影中选
  • Mongoose - 遍历对象

    在 node js 上使用 mongoose 我试图找到玩家 game players id 等于我传递的 id 的所有游戏 Schema var Game mongoose Schema id String date type Date
  • 当页面加载图像时,它是只加载一次,还是每次在标记中找到它时加载?

    当页面加载图像时 它是只加载一次 还是每次在标记中找到它时加载 那么 jquery 呢 附加一个 img 会导致它再次重新加载吗 我问这个问题是因为我有高分辨率图像 但需要在标记的许多情况下使用它 img src hello jpg img

随机推荐