struts2中validation校验框架的原理和使用

来源:互联网 发布:车载安卓软件必备 编辑:程序博客网 时间:2024/05/22 15:58

    

深入struts2中validation校验框架的原理和使用

  在struts2中使用validation校验框架,如果想对某个类似于execute方法进行校验,xml的校验文件的命名规则为action名-方法名-validation.xml,对应action中继承另外一个action两者都有校验xml,那么校验顺序如下:

  RegisterAction extends BaseAction,如果两个action里面要对方法进行校验,那校验文件的搜索路径如下:

  BaseAction-validation.xml,BaseAction-Xxx-validation.xml,RegisterAction-validation.xml,Register-Xxx-validation.xml

   短路校验,在字段校验或者非字段校验中加入:short-circuit="true",如果某个被标记为短路的校验器失败了,将会阻止其他后续的校验器的进行,然后一个错误(action错误或者字段错误,取决于校验器的类型)将会被添加到被校验的对象的ValidationContext中:

<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<!-- Field Validators for email field -->
<field name="email">
<field-validator type="required" short-circuit="true">
<message>You must enter a value for email.</message>
</field-validator>
<field-validator type="email" short-circuit="true">
<message>Not a valid e-mail.</message>
</field-validator>
</field>
<!-- Field Validators for email2 field -->
<field name="email2">
<field-validator type="required">
<message>You must enter a value for email2.</message>
</field-validator>
<field-validator type="email">
<message>Not a valid e-mail2.</message>
</field-validator>
</field>
<!-- Plain Validator 1 -->
<validator type="expression">
<param name="expression">email.equals(email2)</param>
<message>Email not the same as email2</message>
</validator>
<!-- Plain Validator 2 -->
<validator type="expression" short-circuit="true">
<param name="expression">email.startsWith('mark')</param>
<message>Email does not start with mark</message>
</validator>
</validators>

  在上面的例子中,实际的校验器执行是这样的:

  Plain Validator 1

  Plain Validator 2

  email字段的字段校验器

  email2字段的字段校验器

  因为普通校验器2是短路的,如果它的校验失败,它会导致email字段的校验器和email2字段的校验器不会被执行.
 

 

当校验逻辑不是十分复杂时,可以用xml进行校验;逻辑十分复杂是,可以通过validate()进行校验

分类:

【字段校验】

 ---- field-validator 

 ---- 字段优先,我去校验谁(字段),我用谁(校验器)来校验

【非字段校验】

 ---- validator

 ---- 校验器优先,我用谁(校验器)来校验,我去校验谁(字段)

****** 这两种只是 表现形式 不同,底层是相同的,都是把错误信息放到fielderror中

命名:需要校验的Action名 + -validation.xml

位置:要和需要校验的Action放在同一目录下

 

### 只对action中的某个方法进行校验

-1-

     需要校验的Action名 + -方法名 + -validation.xml

                                      |

                       对应xml中<action>的属性的name值

 如: RegisterAction-add-validation.xml 

       --对应 /add.action   --对RegisterAction中的add()方法进行校验

-2-

     在不需要进行验证的方法加上annotation,即在方法前加上@SkipValidation。

-3-

   <action name=...>

        <interceptor-ref name="defaultStack">   

             <param name="validation.excludeMethods">*</param>   

             <param name="validation.includeMethods">需要验证的方法名称,以逗号分隔</param>

        </interceptor-ref>  

   </action>

 

### 校验顺序

    如果 既提供了RegisterAction-validation.xml,又提供了RegisterAction-add-validation.xml

    Struts2会先校验RegisterAction-validation.xml,然后再去校验RegisterAction-add-validation.xml

    这两个都会被调用

 

### 建议:

    当有多个逻辑方法时,就不要提供RegisterAction-validation.xml

    只提供相应方法的xml文件,如:RegisterAction-execute-validation.xml

 

==============

== 字段校验 ==

==============

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-

validator-1.0.2.dtd">

<validators>

 至少提供一个 field 或 validate

 name必须提供

 1个 field 表示对一个属性的一次校验

    <field name="username">

 <field>中至少有一个或多个<field-validator>

 1个<field-validator>表示对它校验的一种方式

 type类型必须提供  类型=requiredstring 表示username必填

 验类型来自于 xwork-2.0.4.jar/com/opensymphony/xwork2/validator/validators/deault.xml

 short-circuit:表示短路,默认false若设为true,表示:这个验证器失败了,就不再执行后面的验证器了

        <field-validator type="requiredstring" short-circuit="true"> 

      

  <field-validator>中有若干个(0 ~ N)<param>子元素 和 一个<message>子元素

  这里的trim对应到requiredstring对应类RequiredStringValidator中的setTrim(boolean trim)方法设置的属性doTrim

  requiredstring这种校验类型,doTrim默认设为true,所以这里写与不写trim设为true都是一样的

              <param name="trim">true</param> 

            <message>用户名不能为空!</message>

       </field-validator>

 验证字符串长度

        <field-validator type="stringlength">

             <param name="minLength">6</param>   最小长度,默认-1

             <param name="maxLength">10</param>  最大长度,默认-1

             <message>用户名应该在 ${minLength} 和 ${maxLength} 之间</message>

  

  也可以用国际化的方式:<message key="error.password.required"/>

        </field-validator>

    </field>

@@@ 验证必填&字符串长度 @@@@@@@@@@@@@@@@@@@@@@@

    <field name="password">

       <field-validator type="requiredstring">

            <message>密码不能为空</message>

       </field-validator>

            <field-validator type="stringlength">

            <param name="minLength">6</param>  

            <param name="maxLength">10</param> 

            <message>密码应该在 ${minLength} 和 ${maxLength} 之间</message>

       </field-validator>

    </field>

@@@ 验证数字 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

    <field name="age">

       <field-validator type="required">

           <message>年龄不能为空</message>

       </field-validator>

       <field-validator type="int">

           <param name="min">1</param>  

           <param name="max">150</param> 

           <message>年龄应该在 ${min} 和 ${max} 之间</message>

       </field-validator>

    </field>

@@@ 验证日期 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

    <field name="birthday">                类型为requiredString用于校验String类型必填

       <field-validator type="required">  类型为required用于验证String以外的类型必填

           <message>生日不能为空</message>

       </field-validator>

       <field-validator type="date">

           <param name="min">2001-01-01</param>  

           <param name="max">2008-08-08</param> 

           <message>生日应该在 ${min} 和 ${max} 之间</message>

        </field-validator>

    </field>

</validators>

========================================

default.xml中提供的校验类型:

========================================

required           用于检查值是否为null

requiredstring     用于检查string是否为null或空,   参数trim,可在验证前对字符串执行trim操作

stringlength       检查string的长度是否在某个范围, 参数trim,minLength,maxLength

int/double         检查某值是否为int/double且在某个范围,参数min,max;minInclusive,maxInclusive,minExclusive,maxExclusive

date               检查date的范围,                 参数min,max

email              检查输入是否为email格式

url                检查输入是否为url格式

conversion         检查是否将出现数据转换错误

expression/fieldexpression  检查某个布尔表达式的值是否为true,后者绑定到某个字段上

     参数expression

visitor            使用预定义的validators进行验证,参数context

regex 检查是否能匹配到正则表达式,                 参数regex

@@@@@@@@@@@@@@

正则表达式验证:

@@@@@@@@@@@@@@

     <field name="bar2">

          <field-validator type="regex">

               <param name="regex">[0-9],[0-9]</param>

               <message>

                    bar2的值必须是"x, y"这样的格式 并且x、y都在0 ~ 9的范围内

               </message>

     </field-validator>

@@@@@@@@@

   URL  

@@@@@@@@@

    <field name="url">            

        <field-validator type="required" short-circuit="true">               

            <message>你需要输入一个URL。</message>  

        </field-validator>  

          

        <field-validator type="url" short-circuit="true">                

            <message>URL错误。</message>  

        </field-validator>  

    </field>

@@@@@@@@@@@@

   EMail  

@@@@@@@@@@@@

   <field name="mail">  

        <field-validator type="required">  

            <message>你需要输入一个电子邮件的地址。</message>  

        </field-validator>           

        <field-validator type="email">  

            <message>非法的email格式。</message>  

        </field-validator>  

    </field>

@@@@@@@@@@@@

   表达式  

@@@@@@@@@@@@

        <validator type="expression">           

            <param name="expression">name.equals(desc)</param>  

            <message>name not the same as desc</message>  

        </validator>

   OR

        <validator type="expression>

           <param name="expression">foo gt bar</param>

           <message>foo必须大于bar.</message>

        </validator>

   OR

        <validator type="expression">

           <param name="expression">email.equals(email2)</param>

           <message>Email不等于email2</message>

        </validator>

   OR

        <validator type="expression" short-circuit="true">

           <param name="expression">email.startsWith('mark')</param>

           <message>Email没有以mark开始。</message>

        </validator>

================

== 非字段校验 ==

================

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-

validator-1.0.2.dtd">

<validators>

 

    <validate type="requiredstring"> 用谁来校验

 去校验谁

 validate中的第一个param的name属性永远都是固定的fieldName,对应与要去校验的字段名 

         <param name="fieldName">username</param> 

                <message>用户名为必填</message>

 解释:用requiredstring校验器去校验username字段,如果出错,显示<message>中的信息

    </validate>

    <validate type="stringlength">

         <param name="fieldName">username</param>

         <param name="minLength">6</param>

         <param name="maxLength">10</param>

         <message>用户名必须在 ${minLength} 和 ${maxLength} 之间</message>

    </validate>

 

=====================================

客户端校验--功能弱,死板(不建议使用)

=====================================

1.

Struts2的<s:form>的theme一定不能设置为simple

2.

将<s:form>的validte属性设置为true

3.

Struts2的客户端校验是基于***-validation.xml中的设置生成js代码

==========================

自定义客户端校验

==========================

<s:form action="register" theme="simple" onsubmit="return validate();">

js:

function validate() {

 //document.getElementByName("username")[0] 返回一个所有名为username的数组

 //var usernameValue = document.getElementByName("username")[0].value

 var usernameValue = document.getElementByID("username").value;

 if( usernameValue.length == 0 ) {

  alert("Username should not be blank!");

  return false;

 }

 ...

}

========

= 补充 =

========

1.

集合里面存放的并不是对象,而是对象的引用

如:

List list = new ArrayList();

Map map = new LinkedHashMap()'

map.put("1", list);   //存放的是映射

list.add("string1");

list.add("string2");

list.add("string3");

2.

如果既有xml校验,又有validate()校验

将先校验xml,然后进行validate()校验

然后将所有的错误添加进fielderror

3.

真正存放field级别错误信息的对象是LinkedHashMap

该LinkedHashMap的key是String类型的,value是ArrayList类型的

对于Action级别的错误信息,实际上是放置在ArrayList中的

4.

不能通过

this.getFieldError().put("...","...");的方法,添加fielderror

因为getFieldError()返回的是一个fieldErrorMap的副本。

原创粉丝点击