struts2验证器

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

1). 验证分为两种:express

> 声明式验证*

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

> 编程式验证

2). 声明式验证的 helloworld编程

I. 先明确对哪个 Action 的哪个字段进行验证: age
II. 编写配置文件:
> 把 struts-2.3.15.3\apps\struts2-blank\WEB-INF\classes\example 下的 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. 如何显示错误消息呢 ? app

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

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

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

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

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

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

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

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

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

5). 短路验证: 若对一个字段使用多个验证器, 默认状况下会执行全部的验证. 若但愿前面的验证器验证没有经过, 后面的就再也不验证, 可使用短路验证htm

<!-- 设置短路验证: 若当前验证没有经过, 则再也不进行下面的验证 -->
<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=\u5E74\u9F84
count=\u6570\u91CF

详细分析参见 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 位身份证验证器

相关文章
相关标签/搜索