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 @   美码师  阅读(287)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示