zoukankan      html  css  js  c++  java
  • Struts2---输入验证

    1. Struts2 的验证

    1). 验证分为两种:

    > 声明式验证*
     需要解决的问题如下:
      >> 确定对哪个 Action 或 Model 的那个字段进行验证
      >> 使用什么验证规则
      >> 如果验证失败, 转向哪一个页面, 显示是什么错误消息

    > 编程式验证

    2). 声明式验证的示例:helloworldI.

    I . 先明确对哪一个 Action 的哪一个字段进行验证: age

    II. 编写配置文件:ActinName-validation.xml(名字书写规则,验证规则如何写吧)
    > 把 struts-2.3.15.3appsstruts2-blankWEB-INFclassesexample 下的 Login-validation.xml 文件复制到当前 Action 所在的包下
    > 把该配置文件改为: 把 Login 改为当前 Action 的名字.
    > 编写验证规则: 参见 struts-2.3.15.3/docs/WW/docs/validation.html 文档即可.示例如下:

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

    > 在配置文件中可以定义错误消息: 就是<message>标签定义的内容,就是返回的错误消息

    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>*

      > 该错误消息可以国际化吗. 可以,使用<message>标签的key属性,可以为Message的内容从其它文件指定,从文件指定的话,也就是可以实现国际化啦

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

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

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

    > 为每一个不同的 action 请求定义其对应的验证文件: ActionClassName-AliasName(请求时的Action配置名)-validation.xml

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

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

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

    > 每个具体的验证规则都会对应具体的一个验证器. 有一个配置文件把验证规则名称和验证器关联起来了. 而实际上验证的是那个验证器.
    该文件位于 com.opensymphony.xwork2.validator.validators 下的 default.xml
    例如required这类型的验证器就是com.opensymphony.xwork2.validator.validators.RequiredFieldValidator
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>

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

    <!-- 设置短路验证: 若当前验证没有通过, 则不再进行下面的验证 -->short-circuit="true"就是短路验证,默认是等于false
    <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

    修改 ConversionErrorInterceptor 源代码的方式:就是新建一个和ConversionErrorInterceptor类一样的类,注意包名也要 一至,这样Struts2会根据就近原则优先使用,然后再特定的位置加上一下代码

    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). 不同的字段使用同样的验证规则(实际还是要配置一个验证规则,只是验证规则相同,错误消息通过key来指向同一条错误消息), 而且使用同样的响应消息 ?

    还记得国际化那个?:(国际化文件定义的东西,任何页面,Action,JavaBean,都会可以获取 的)在JSP页面咋们使用<s:text>标签,或者是OGNL表达式,

    在Action中咋们使用的是getText()方法,而${getText(fieldName)} 实际上就是使用OGNL表达式来获取的,首先调用栈顶的getText()方法,然后再用EL表达式打印

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

    age=年龄
    count=数量

    详细分析参见 PPT 159.

    9). 自定义验证器:

    I. 定义一个验证器的类

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

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

      验证器实现时的流程:

    //1. 获取字段的名字和值(获取需要验证的字段的名字和值)
    String fieldName = getFieldName();
    Object value = this.getFieldValue(fieldName, object);
    
    //2. 验证(自己编写验证JAVA类,然后调用该验证类的方法)
    IDCard idCard = new IDCard();
    boolean result = idCard.Verify((String)value);
    
    //3. 若验证失败, 则 ...
    if(!result){
    //返回一条错误消息 addFieldError(fieldName,
    object); }

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

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

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

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

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

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

  • 相关阅读:
    CloudNotes之桌面客户端篇:将笔记发布到博客园
    CloudNotes之桌面客户端篇:笔记撰写样式的支持
    Wizard Framework:一个自己开发的基于Windows Forms的向导开发框架
    CloudNotes之桌面客户端篇:插件系统的实现
    CloudNotes之领域建模篇:领域模型简介
    CloudNotes云端个人笔记系统系列文章汇总
    将Json数据转换为ADO.NET DataSet对象
    CloudNotes之桌面客户端篇:增强的笔记列表
    CloudNotes:一个云端个人笔记系统
    一种通用查询语言的定义与实践
  • 原文地址:https://www.cnblogs.com/jeremy-blog/p/3993856.html
Copyright © 2011-2022 走看看