1.struts中如何进行数据校验
在每一个Action类中,数据校验一般都写在业务方法中,比如login()、register()等。struts提供了数据校验功能。每个继承自ActionSupport的Action类都可以实现一个validate()方法。struts使用拦截器org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor进行数据校验,根据拦截器的执行流程,它会在执行Action的业务方法之前调用intercecpt()方法,因此可以完成数据校验的功能。
在ActionSupport类中有一个ValidationAwareSupport的对象,该对象维护了一个Map<String, List<String>> fieldErrors属性,用它来存储错误信息。在Action类的业务方法中调用
super.addFieldError("user","用户名必须填写!");
会执行ActionSupport中的
public void addFieldError(String fieldName, String errorMessage) { this.validationAware.addFieldError(fieldName, errorMessage); }
ValidationAwareSupport类中的addFieldError如下:
public synchronized void addFieldError(String fieldName, String errorMessage) { Map errors = this.internalGetFieldErrors(); Object thisFieldErrors = (List)errors.get(fieldName); if(thisFieldErrors == null) { thisFieldErrors = new ArrayList(); errors.put(fieldName, thisFieldErrors); } ((List)thisFieldErrors).add(errorMessage); }
该方法将一条错误信息添加到Map中,一个key值可以对应多条错误信息。
2.struts中数据验证的方法
-
代码方式验证Action中指定的方法(validate+要验证的方法名作为验证函数名)
在Action类中重写validate()方法。
//仅验证register方法
public void validateRegister(){
if(user.getUserName() == null||"".equals(user.getUserName()))
{
//保存错误信息
super.addFieldError("user","用户名必须填写!");
}
if(user.getPassword() == null||"".equals(user.getPassword()))
{
//保存错误信息
super.addFieldError("user","密码必须填写!");
}
}
-
代码方式验证Action中的所有方法(直接重写validate()方法)
-
XML方式验证Action中指定的方法(xml命名为ActionClassName-ActionName-validation.xml)
-
XML方式验证Action中的所有方法(xml命名为ActionClassName-validation.xml)
使用validate()方法进行验证,涉及很多重复的验证逻辑,例如:非空验证、数值验证、email验证、日期验证等。因此struts对于常用的验证进行了封装,提供了验证器。
struts提供的验证器在xwork-core-2.3.4.1.jar!comopensymphonyxwork2validatorvalidatorsdefault.xml中,共16个,如下:
<validators> <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/> <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/> <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/> <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/> <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/> <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/> <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/> <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/> <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/> <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/> <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/> <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/> <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/> <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/> <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/> <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/> </validators>
xml文件名称语法:ActionClassName-validation.xml,而且需要与当前要验证的action 在同一目录。(和局部转换器相似)
使用xwork-core-2.3.4.1.jar!xwork-validator-1.0.dtd约束来写xml文件。
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"> <validators> <field name="user.userName"> <field-validator type="requiredstring"> <message>用户名必须填写!</message> </field-validator> </field> <field name="user.password"> <field-validator type="requiredstring"> <message>密码必须填写!</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">6</param> <message>密码长度不能小于6!</message> </field-validator> </field> <field name="user.birth"> <field-validator type="date"> <message></message> </field-validator> </field> </validators>