随笔-61  评论-159  文章-0  trackbacks-0
          在struts2中如果action继承ActionSupport,就可以重写public void validate() 方法,如果是想校验某个方法则如下:
public String login() throws Exception {....................};则校验方法为public void validateLogin() ,也就是validate+要被校验的方法名(注意头字母要大写),这样就可以实现所谓的服务器端的字段校验。
         struts2给我们提供了一个功能比较强大的validation校验框架。
         以下介绍struts2校验框架的使用:
         在一个action中,例如:
 1import java.util.Date;
 2
 3import com.opensymphony.xwork2.ActionSupport;
 4
 5@SuppressWarnings("serial")
 6public class RegisterAction extends ActionSupport {
 7    private String name;
 8    private int age;
 9    private Date birthday;
10    
11    @Override
12    public String execute() throws Exception {
13        // TODO Auto-generated method stub
14        return SUCCESS;
15    }

16    @Override
17    
18    public String getName() {
19        return name;
20    }

21    public void setName(String name) {
22        this.name = name;
23    }

24    
25    public int getAge() {
26        return age;
27    }

28    public void setAge(int age) {
29        this.age = age;
30    }

31    public Date getBirthday() {
32        return birthday;
33    }

34    public void setBirthday(Date birthday) {
35        this.birthday = birthday;
36    }

37    
38}
        在action类的同一个包里面加入相关RegisterAction-validation.xml文件,命名规则为:action名-validation.xml

        首先要些校验框架的的xml文件先从xml文件的dtd入手,用firefox或者chrome打开dtd(IE不可以正常打开),地址为:http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd,以下是校验框架的dtd:
 1<?xml version="1.0" encoding="UTF-8"?>
 2
 3<!--
 4  XWork Validators DTD.
 5  Used the following DOCTYPE.
 6  
 7  <!DOCTYPE validators PUBLIC 
 8          "-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
 9          "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
10-->
11
12
13<!ELEMENT validators (field|validator)+>
14
15<!ELEMENT field (field-validator+)>
16<!ATTLIST field
17    name CDATA #REQUIRED
18>
19
20<!ELEMENT field-validator (param*, message)>
21<!ATTLIST field-validator
22    type CDATA #REQUIRED
23    short-circuit (true|false) "false"
24>
25
26<!ELEMENT validator (param*, message)>
27<!ATTLIST validator
28    type CDATA #REQUIRED
29    short-circuit (true|false) "false"
30>
31
32<!ELEMENT param (#PCDATA)>
33<!ATTLIST param
34    name CDATA #REQUIRED
35>
36
37<!ELEMENT message (#PCDATA)>
38<!ATTLIST message
39    key CDATA #IMPLIED
40>
PS:看不懂dtd的,google一下dtd一些资料即可。

通过校验框架的dtd的规范来写校验框架的xml配置文件,配置文件如下:
 1<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
 2"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
 3<validators>
 4    <field name="name">
 5        <field-validator type="requiredstring">
 6            <param name="trim">true</param>
 7            <message>the name shouldn't be blank!</message>
 8        </field-validator>
 9        <field-validator type="stringlength">
10            <param name="minLength">5</param>
11            <param name="maxLength">10</param>
12            <message>name's length should be between ${minLength} and ${maxLength}!</message>
13        </field-validator>
14    </field>
15    <field name="age">
16        <field-validator type="required">
17            <message>age should not be blank!</message>
18        </field-validator>
19    
20        <field-validator type="int">
21            <param name="min">1</param>
22            <param name="max">150</param>
23            <message>age should be between ${min} and ${max}</message>
24        </field-validator>
25    </field>
26    <field name="birthday">
27        <field-validator type="required">
28            <message>birthday should not be blank!</message>
29        </field-validator>
30        
31        <field-validator type="date">
32            <param name="min">2001-01-01</param>
33            <param name="max">2003-12-31</param>
34            <message>birthday should be between ${min} and ${max}</message>
35        </field-validator>
36    </field>
37</validators>

其中校验框架的xml配置文件里面的一些参数不是随意的,是根据以下类里面来的
 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE validators PUBLIC
 3        "-//OpenSymphony Group//XWork Validator Config 1.0//EN"
 4        "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
 5<!-- START SNIPPET: validators-default -->
 6<validators>
 7    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
 8    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
 9    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
10    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
11    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
12    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
13    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
14    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
15    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
16    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
17    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
18    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
19    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
20</validators>
21<!--  END SNIPPET: validators-default -->

 1、先从 requiredstring入手,找到com.opensymphony.xwork2.validator.validators.RequiredStringValidator
 1public class RequiredStringValidator extends FieldValidatorSupport {
 2
 3    private boolean doTrim = true;
 4
 5
 6    public void setTrim(boolean trim) {
 7        doTrim = trim;
 8    }

 9
10    public boolean getTrim() {
11        return doTrim;
12    }

13
14    public void validate(Object object) throws ValidationException {
15        String fieldName = getFieldName();
16        Object value = this.getFieldValue(fieldName, object);
17
18        if (!(value instanceof String)) {
19            addFieldError(fieldName, object);
20        }
 else {
21            String s = (String) value;
22
23            if (doTrim) {
24                s = s.trim();
25            }

26
27            if (s.length() == 0{
28                addFieldError(fieldName, object);
29            }

30        }

31    }

32}

33

注:其中trim就是此类中的一个声明布尔类型的变量。

2、校验框架中的stringLength,对应的类是com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator

 1public class StringLengthFieldValidator extends FieldValidatorSupport {
 2
 3    private boolean doTrim = true;
 4    private int maxLength = -1;
 5    private int minLength = -1;
 6
 7
 8    public void setMaxLength(int maxLength) {
 9        this.maxLength = maxLength;
10    }

11
12    public int getMaxLength() {
13        return maxLength;
14    }

15
16    public void setMinLength(int minLength) {
17        this.minLength = minLength;
18    }

19
20    public int getMinLength() {
21        return minLength;
22    }

23
24    public void setTrim(boolean trim) {
25        doTrim = trim;
26    }

27
28    public boolean getTrim() {
29        return doTrim;
30    }

31
32    public void validate(Object object) throws ValidationException {
33        String fieldName = getFieldName();
34        String val = (String) getFieldValue(fieldName, object);
35
36        if (val == null || val.length() <= 0{
37            // use a required validator for these
38            return;
39        }

40        if (doTrim) {
41            val = val.trim();
42            if (val.length() <= 0
43                // use a required validator
44                return;
45            }

46        }

47
48        if ((minLength > -1&& (val.length() < minLength)) {
49            addFieldError(fieldName, object);
50        }
 else if ((maxLength > -1&& (val.length() > maxLength)) {
51            addFieldError(fieldName, object);
52        }

53    }

54}

55
注:xml文件里面的两个minLengthmaxLength对应的怪了中声明的两个变量对应,其中xml中的${minLength}${maxLength}就是调用类中的getter方法。
总结:xml文件中其他属性,比如required、date等也可以通过以上的方法来分析,就清楚整个校验框架的原理,使用就很简单啦。

PS:现在使用的是field校验,是field错误级别,详细参考:struts2中action和field级别错误处理


-------------------------------------------------------------------------------------------------
PS:本博客文章,如果没有注明是有“转”字样,属于本人原创。如果需要转载,务必注明作者文章的详细出处地址,否则不允许转载,多谢合作!
posted on 2008-11-28 22:56 apple0668 阅读(3715) 评论(2)  编辑  收藏 所属分类: struts2

评论:
# re: 深入struts2中validation校验框架的原理和使用(一) 2008-12-01 11:13 | 杨爱友
这个validation干嘛用的?能不能举个具体例子?  回复  更多评论
  
# re: 深入struts2中validation校验框架的原理和使用(一)[未登录] 2009-01-01 12:06 | apple0668
validation,主要是在服务器端对数据进行校验的。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: