struts2验证框架的使用和扩展
struts2能够对前台提交的表单数据进行输入有效性校验,通常有两种方式:
1、在Action类中通过validatexx方法验证,这种方式很简单,在此不再赘述;
2、通过编写xx-validation.xml文件执行表单验证,当用户提交表单请求后,struts会优先执行xml文件,如果校验不通过是不会让请求访问指定action的。
本文介绍一下struts2通过xml文件进行校验的方法并说明怎么样扩展自定义的验证。
?
一、struts2验证框架的包位置
部署struts2项目有一个必备jar包:xwork-core-*.jar,在这个包中有这样一个package"com.opensymphony.xwork2.validator.validators",所有官方验证类就放在这下面的,在这个包下面有一个"default.xml"文件,这就是验证框架的核心文件,里面配置了所有的验证类数据。
验证类的格式为:<validator name="别名" name="code"><!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
?③编写验证文件,field标签表示被验证的字段项,field-validator标签表示使用什么验证约束,short-circuit表示如果有多个验证约束时只要有一个不通过则后面就不执行验证了,message表示验证不通过时返回的错误消息。
<field name="user.name"><field-validator type="requiredstring" short-circuit="true"><message>用户名不能为空</message></field-validator></field>
?按照上面三步,一个基本的验证就出来了,大家可以去试试,只要提交的表单访问UserAction都会先通过xml的验证。假如你只想验证UserAction中的userAdd方法(该方法的请求路径为userAdd.action),则只需要将xml文件改名为"UserAction-userAdd-validattion.xml"即可。[特别注意:这个xml名称中的userAdd并非指Action中的方法名,而是指配置文件中的请求名,就是那个<action name="请求名">]
?
三、扩展struts2验证类
其实自定义验证类很简单,你只需要仿照struts2的任何一个验证类就能做出来,前面提到不能验证utf-8格式的字符长度,我们在这就做一个获取utf-8长度的自定义框架。
①创建验证框架扩展类,这里必须继承 FieldValidatorSupport 类,重写validate方法,具体验证代码就在validate方法中写,这里的get、set就是在xml中出现的属性参数。这段代码还不够好,其实可以把encoding也作为属性的,这样传入任何编码格式都能获取该编码对应的字符长度。
public class CheckStringLength extends FieldValidatorSupport {private boolean trim; // 是否去首位空格private int minLength; //最大长度private int maxLength; //最小长度private static final String ENCODING = "UTF-8"; //编码格式(默认utf-8)/* * 构造方法初始化默认数据 */public CheckStringLength() {this.trim = true;this.minLength = -1;this.maxLength = -1;}public boolean isTrim() {return trim;}public void setTrim(boolean trim) {this.trim = trim;}public int getMinLength() {return minLength;}public void setMinLength(int minLength) {this.minLength = minLength;}public int getMaxLength() {return maxLength;}public void setMaxLength(int maxLength) {this.maxLength = maxLength;}@Overridepublic void validate(Object arg0) throws ValidationException {String fieldName = this.getFieldName();String val = (String) this.getFieldValue(fieldName, arg0);//如果值为空则直接不通过if (val == null || val.length() <= 0) {return;}if (trim) {val = val.trim();////如果值为空则直接不通过if (val == null || val.length() <= 0) {return;}}int length = 0;try {//根据编码格式获得字符长度length = val.getBytes(ENCODING).length;} catch (UnsupportedEncodingException e) {length = val.getBytes().length;}/* *判断字符长度范围 */if (minLength > -1 && length < minLength) {this.addFieldError(fieldName, arg0);}if (maxLength > -1 && maxLength > maxLength) {this.addFieldError(fieldName, arg0);}}}
?
?②新建validators.xml文件,将"default.xml"的配置信息和自定义验证类的配置信息放到文件中,最后把validators.xml文件放到源码根目录下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator Config 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd"> <validators> <validator name="required" name="code"><!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"><validators><!-- 用户名非空、长度、半角、允许字符 --><field name="user.name"><field-validator type="requiredstring" short-circuit="true"><message>用户名不能为空</message></field-validator><field-validator type="stringlengthencoding" short-circuit="true"><param name="maxLength">10</param><param name="minLength">6</param><message>用户名必须是6到10位字符!</message></field-validator></field></validators>
基本上一个简单的自定义验证就完成了,大家可以手动试试,这个东西确实很简单。
?
最后附上扩展的几个验证类,希望对大家有所帮助?:
<!-- 根据编码格式获取字符串长度,并且可以校验长度范围 --> <validator name="stringlengthencoding" class="com.bless.struts2.validate.CheckDoubleAccuracy"/>
?
最后感谢同事jwt童鞋做的扩展框架。