zoukankan      html  css  js  c++  java
  • struts2验证器

    1. Struts2 的验证(note6,struts2-8)

    1). 验证分为两种:

    > 声明式验证*

    >> 对哪个 Action 或 Model 的那个字段进行验证
    >> 使用什么验证规则
    >> 如果验证失败, 转向哪一个页面, 显示是什么错误消息

    > 编程式验证

    2). 声明式验证的 helloworld

    I. 先明确对哪一个 Action 的哪一个字段进行验证: age
    II. 编写配置文件:
    > 把 struts-2.3.15.3appsstruts2-blankWEB-INFclassesexample 下的 Login-validation.xml 文件复制到
    当前 Action 所在的包下.
    > 把该配置文件改为: 把 Login 改为当前 Action 的名字.
    > 编写验证规则: 参见 struts-2.3.15.3/docs/WW/docs/validation.html 文档即可.
    > 在配置文件中可以定义错误消息:

    <field name="age">
    <field-validator type="int">
    <param name="min">20</param>
    <param name="max">50</param>
    <message>^^Age needs to be between ${min} and ${max}</message>
    </field-validator>
    </field>

    > 该错误消息可以国际化吗. 可以

    <message key="error.int"></message>.

    再在 国际化资源文件 中加入一个键值对: error.int=^^^Age needs to be between ${min} and ${max}

    III. 若验证失败, 则转向 input 的那个 result. 所以需要配置 name=input 的 result
    <result name="input">/validation.jsp</result>

    IV. 如何显示错误消息呢 ?

    > 若使用的是非 simple, 则自动显示错误消息.
    > 若使用的是 simple 主题, 则需要 s:fielderror 标签或直接使用 EL 表达式(使用 OGNL)

    ${fieldErrors.age[0] }
    OR
    <s:fielderror fieldName="age"></s:fielderror>*(<s:fielderror /><!-- 不写fieldName属性显示所有的fielderror错误 --> )

    3). 注意: 若一个 Action 类可以应答多个 action 请求, 多个 action 请求使用不同的验证规则, 怎么办 ?

    > 为每一个不同的 action 请求定义其对应的验证文件: ActionClassName-AliasName-validation.xml

    > 不带别名的配置文件: ActionClassName-validation.xml 中的验证规则依然会发生作用. 可以把各个 action 公有的验证规则
    配置在其中. 但需要注意的是, 只适用于某一个 action 的请求的验证规则就不要这里再配置了.

    4). 声明式验证框架的原理:

    > Struts2 默认的拦截器栈中提供了一个 validation 拦截器

    > 每个具体的验证规则都会对应具体的一个验证器. 有一个配置文件把验证规则名称和验证器关联起来了. 而实际上验证的是那个验证器.
    该文件位于 com.opensymphony.xwork2.validator.validators 下的 default.xml

    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>

    5). 短路验证: 若对一个字段使用多个验证器, 默认情况下会执行所有的验证. 若希望前面的验证器验证没有通过, 后面的就不再验证, 可以使用短路验证

    <!-- 设置短路验证: 若当前验证没有通过, 则不再进行下面的验证 -->
    <field-validator type="conversion" short-circuit="true">
    <message>^Conversion Error Occurred</message>
    </field-validator>

    <field-validator type="int">
    <param name="min">20</param>
    <param name="max">60</param>
    <message key="error.int"></message>
    </field-validator>

    6). 若类型转换失败, 默认情况下还会执行后面的拦截器, 还会进行 验证. 可以通过修改 ConversionErrorInterceptor 源代码的方式使
    当类型转换失败时, 不再执行后续的验证拦截器, 而直接返回 input 的 result

    Object action = invocation.getAction();
    if (action instanceof ValidationAware) {
    ValidationAware va = (ValidationAware) action;

    if(va.hasFieldErrors() || va.hasActionErrors()){
    return "input";
    }
    }

    7). 关于非字段验证: 不是针对于某一个字段的验证.

    <validator type="expression">
    <param name="expression"><![CDATA[password==password2]]></param>
    <message>Password is not equals to password2</message>
    </validator>

    显示非字段验证的错误消息, 使用 s:actionerror 标签: <s:actionerror/>

    8). 不同的字段使用同样的验证规则, 而且使用同样的响应消息 ?

    error.int=${getText(fieldName)} needs to be between ${min} and ${max}

    age=u5E74u9F84
    count=u6570u91CF

    详细分析参见 PPT 159.

    9). 自定义验证器:

    I. 定义一个验证器的类

    > 自定义的验证器都需要实现 Validator.
    > 可以选择继承 ValidatorSupport 或 FieldValidatorSupport 类
    > 若希望实现一个一般的验证器, 则可以继承 ValidatorSupport
    > 若希望实现一个字段验证器, 则可以继承 FieldValidatorSupport

    > 具体实现可以参考目前已经有的验证器.

    > 若验证程序需要接受一个输入参数, 需要为这个参数增加一个相应的属性

    II. 在配置文件中配置验证器

    > 默认情况下下, Struts2 会在 类路径的根目录下加载 validators.xml 文件. 在该文件中加载验证器.
    该文件的定义方式同默认的验证器的那个配置文件: 位于 com.opensymphony.xwork2.validator.validators 下的 default.xml

    > 若类路径下没有指定的验证器, 则从 com.opensymphony.xwork2.validator.validators 下的 default.xml 中的验证器加载

    III. 使用: 和目前的验证器一样.

    IV. 示例代码: 自定义一个 18 位身份证验证器

  • 相关阅读:
    Chrome cookies folder
    Fat URLs Client Identification
    User Login Client Identification
    Client IP Address Client Identification
    HTTP Headers Client Identification
    The Personal Touch Client Identification 个性化接触 客户识别
    购物车 cookie session
    购物车删除商品,总价变化 innerHTML = ''并没有删除节点,内容仍存在
    453
    购物车-删除单行商品-HTMLTableElement.deleteRow()
  • 原文地址:https://www.cnblogs.com/zxwBj/p/8647538.html
Copyright © 2011-2022 走看看