public String login() throws Exception {....................};則校驗方法為public void validateLogin() ,也就是validate+要被校驗的方法名(注意頭字母要大寫),這樣就可以實現所謂的服務器端的字段校驗。
struts2給我們提供了一個功能比較強大的validation校驗框架。
以下介紹struts2校驗框架的使用:
在一個action中,例如:
1
import java.util.Date;
2
3
import com.opensymphony.xwork2.ActionSupport;
4
5
@SuppressWarnings("serial")
6
public 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
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

首先要些校驗框架的的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一些資料即可。
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

通過校驗框架的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>

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

其中校驗框架的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 -->

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

1、先從 requiredstring入手,找到com.opensymphony.xwork2.validator.validators.RequiredStringValidator類
1
public 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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

注:其中trim就是此類中的一個聲明布爾類型的變量。
2、校驗框架中的stringLength,對應的類是com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator
1
public 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文件里面的兩個minLength,maxLength對應的怪了中聲明的兩個變量對應,其中xml中的${minLength}和${maxLength}就是調用類中的getter方法。
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

總結:xml文件中其他屬性,比如required、date等也可以通過以上的方法來分析,就清楚整個校驗框架的原理,使用就很簡單啦。
PS:現在使用的是field校驗,是field錯誤級別,詳細參考:struts2中action和field級別錯誤處理
-------------------------------------------------------------------------------------------------
PS:本博客文章,如果沒有注明是有“轉”字樣,屬于本人原創。如果需要轉載,務必注明作者和文章的詳細出處地址,否則不允許轉載,多謝合作!