struts2学习笔记之校验器

struts校验主要是用于表单输入的校验,为action指定校验规则,当校验不通过时,将不执行action的目标方法,而是返回input的结果。
为了良好的实现校验,请让Action继承于ActionSupport

一、实现校验的方式

1  指定类的校验xml文件

    支持继承,也支持对指定逻辑进行校验,假如RegistAction继承于BaseAction,此外BaseAction有login方法,那么对于login方法,整个校验的文件搜索顺序如下:
      BaseAction-validation.xml
      BaseAction-login-validation.xml
      RegistAction-validation.xml
      RegistAction-login-validation.xml
      如果全部存在,那么上面的所有文件的校验规将都被执行。

配置文件:

  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWrok Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
   <!-- 校验器的写法分字段风格和非字段风格 -->
   
   <!-- 字段风格的校验*************************** -->
   
   <field name="name">
     <!-- 非空校验 -->
     <field-validator type="requiredstring"> 
        <param name="trim">true</param>
        <message key="name.required"></message>
        <!-- key属性是资源文件中的键,属于国际化的做法,另外也可以使用getText方法:
        <message>${getText("name.required")}</message>
         -->
     </field-validator>
     <!-- 正则表达式校验 -->
     <field-validator type="regex" >
       <param name="expression"><![CDATA[(\w{4,25})]]></param>
       <message key="name.length"></message>
     </field-validator>
     
     <!-- 
            注:对于一个字段有多个校验的情况,某些关键校验可以设置short-circuit="true"来开启短路特性。该特性将使得
            当前校验失败的情况下终止后面关于该字段的字段风格校验的执行。
      -->
   </field>
   
   <field name="pass">
     <field-validator type="requiredstring">
        <param name="trim">true</param>
        <message key="pass.required"></message>
     </field-validator>
     
     <field-validator type="regex">
       <param name="expression"><![CDATA[(\w{4,25})]]></param>
       <message key="pass.length"></message>
     </field-validator>
   </field>
   
   <field name="confirm">
   <!-- 字段表达式校验 -->
     <field-validator type="fieldexpression">
       <param name="expression"><![CDATA[(pass==confirm)]]></param>
        <message key="pass.confirm"></message>
     </field-validator>
   </field>
   
   <field name="age">
     <!-- 数值校验 -->
     <field-validator type="int">
       <param name="min">1</param>
       <param name="max">150</param>
       <message key="age.range"></message>
      </field-validator>
   </field>
   
   <!-- 非字段风格校验 ************************-->
   
   <!-- 日期校验 -->
   <validator type="date">
   <param name="fieldName">birth</param>
   <param name="min">1900-01-01</param>
   <param name="max">2050-02-21</param>
   <message key="birth.range"></message>
   </validator>
   
   <!-- 所有非字段风格的校验都将优先于字段风格的校验 -->
   <!-- 短路校验器如果在非字段风格校验中,会被优先执行,如果是字段风格,则还是按顺序来 -->
   <!-- 短路校验器的失败会导致后续关于该字段的字段风格校验不执行,而对于非字段风格的校验则无影响 -->
   
</validators>



2  使用注解

   @RequiredStringValidator(type=ValidatorType.FIELD,key="name.required", message="")
     public void setName(String name)...
   更多参考:http://struts.apache.org/2.2.3/docs/validation-annotation.html

 

3  覆盖ActionSupport的validate方法或validateXXX方法

   对于后者,如果调用的方法是login那么就为validateLogin方法。
   这两者中validate会先被调用,validateXXX在后面被调用。

   在重写的方法中,可以调用ActionSupport提供的便利方法如:
   addFieldError("user","用户名称输入不正确"); --- 添加一条校验错误,一旦执行过这样的操作,便表示校验未通过(返回结果input)
   getText("user.required")根据key获取资源文件的内容


二、关于校验过程的描述

  

  1   类型转换,如果出错,将错误信息保存到ActionContext里,由conversionError拦截器负责将其转换为fieldError,然后继续执行校验;否则直接进入校验过程

    2  配置文件校验 -> 注解校验

    3  执行validate

    4  执行validateXXX

    5  判断是否存在fieldError,如果有则返回input结果,否则调用action的目标方法

    6   处理结果..

 

 三、关于内建校验器
conversion validator
date validator
double validator
email validator
expression validator
fieldexpression validator
int validator
regex validator
required validator
requiredstring validator
stringlength validator
url validator
visitor validator


参考:http://struts.apache.org/2.2.3/docs/validation.html#Validation-RegisteringValidators

 

四、关于客户端校验
  客户端校验即是struts通过获取服务端action的校验配置自动在jsp页面中生成校验的js代码的功能。

   由于兴趣原因,试验了一下客户端校验,发现这部分功能就是鸡肋..:
   用的是2.3.3版本,客户端校验的实现过程如下:

   1 使用<s:form>要求设置属性 validate为"true",内部的表单元素一律采用struts的标签
   2 jsp页面不能是直接访问,否则会报异常(NullPointer之类..),需要通过action映射到jsp资源:
     <action name="*"><result>/{1}.jsp</result>
   3 <s:form>的action必须是action的名称,而不能是**.action 否则会直接提交给后台action验证;
   4 在<head>内加入<s:head/>可以看到一点点css效果。

   用后感觉:功能太弱,容易出错;许多校验器都支持不了;出错情况下再次提交出错会显示重复的错误提示(上次提交的错误提示并未消除)

 

最好的资源来自官方文档:http://struts.apache.org/2.2.3/docs/validation.html

 

posted @ 2011-09-03 15:58  美码师  阅读(280)  评论(0编辑  收藏  举报