一、概述:
<!-- 待验证字段名称为username --> <field name="username"> <!-- 使用非空验证器 --> <field-validator type="requiredstring"> <param name="trim">true</param> <!-- 错误提示消息 --> <message>必须输入用户名</message> </field-validator> <!-- 使用正则验证器 --> <field-validator type="regex"> <param name="expression"><![CDATA[(\w{6,20})]]></param> <message>用户名长度必须在6到20字符之间</message> </field-validator> </field>⑤ 显示错误消息
a、若使用的是struts2的非simple主题,则自动显示错误消息
b、若使用的是simple主题,则需要 s:fielderror 标签或直接使用 EL 表达式(使用 OGNL)
${fieldErrors.age[0] }
或者
<s:fielderror fieldName="age"></s:fielderror> 推荐使用此方法
⑥ Struts2声明式验证的原理:
> Struts2 默认的拦截器栈中提供了一个 validation 拦截器
> 每个具体的验证规则都会对应具体的一个验证器. 有一个配置文件把验证规则名称和验证器关联起来了. 而实际上验证的是那个验证器.
该文件位于 com.opensymphony.xwork2.validator.validators 下的 default.xml
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
⑦ 短路验证
若对一个字段使用多个验证器, 默认情况下会执行所有的验证. 若希望前面的验证器验证没有通过, 后面的就不再验证, 可以使用短路验证
<validator …/>元素和 <field-validator …/>元素可以指定一个可选的 short-circuit属性,该属性指定该验证器是否是短验证器,默认值为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>⑧ 不同的字段使用同样的验证规则, 而且使用同样的响应消息 ?
I. 定义一个验证器的类
> 自定义的验证器都需要实现 Validator.
> 可以选择继承 ValidatorSupport 或 FieldValidatorSupport 类
> 若希望实现一个一般的验证器, 则可以继承 ValidatorSupport
> 若希望实现一个字段验证器, 则可以继承 FieldValidatorSupport
> 若验证程序需要接受一个输入参数, 需要为这个参数增加一个相应的属性,并提供对应的setter与getter方法
public class IDCardValidator extends FieldValidatorSupport { @Override public void validate(Object object) throws ValidationException { //1. 获取字段的名字和值 String fieldName = getFieldName(); Object value = this.getFieldValue(fieldName, object); //2. 验证 IDCard idCard = new IDCard(); boolean result = idCard.Verify((String)value); //3. 若验证失败, 则 ... if(!result){ addFieldError(fieldName, object); } } }II. 在配置文件中配置验证器