zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    二维码跳转不同的 app store
    HTML 保存图片到本地
    HTML5 的一些小的整理吧
    Echarts 3.19 制作常用的图形 非静态
    word2010设置页码起始位置及前后页码不同的方法
    经struts2中的action后,jsp中css失效的问题
    在Linux和Windows下配置MyEclipse+Tomcat+JDK的一些问题
    MyEclipse自动退出问题解决办法
    (转)java web建议学习路线
    Linux中MyEclipse+tomcat遇到的问题
  • 原文地址:https://www.cnblogs.com/littleatp/p/4354503.html
Copyright © 2011-2022 走看看