Struts2之Validator验证框架的详细介绍

2025-05-29 0 81

struts2中提供了数据校验验证数据例如验证邮件、数字等。验证方式有3种:一是通过validate()方法,二是通过xml,三是使用注解方式。

一、初始化

首先定义一个user类

?

1

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
package com.cyw.test;

import java.util.date;

public class user {

private string name;

private int age;

private string email;

public string getname() {

return name;

}

public void setname(string name) {

this.name = name;

}

public int getage() {

return age;

}

public void setage(int age) {

this.age = age;

}

public string getemail() {

return email;

}

public void setemail(string email) {

this.email = email;

}

public date getbirthday() {

return birthday;

}

public void setbirthday(date birthday) {

this.birthday = birthday;

}

private date birthday;

}

二、validate()方法验证

可以在继承了actionsupport的action中重写validate()来进行验证。validate()方法会在execute()方法执行前执行,仅当数据校验正确,才执行execute()方法, 如错误则将错误添加到fielderrors域中,如果定义的action中存在多个逻辑处理方法,且不同的处理逻辑需要不同的校验规则,这种情况下validate()会对所有处理逻辑使用相同的校验规则,为了实现不同的校验逻辑,需要通过validatex()方法,其中x表示处理逻辑的方法名,如果有错误系统会返回result name="input"的页面,所以需要在action中定义一个input的result。我昨天就困在这个地方好久。问了我大学同学才解决,为了这个validate()验证昨晚一点多都没睡,虽然ssh框架现在不流行,特别是前几天struts2报了一个远程bug,不过想着既然学java了,就系统的学一遍吧。

Struts2之Validator验证框架的详细介绍

1.validate()方法

?

1

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

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90
package com.cyw.test;

import java.text.parseposition;

import java.text.simpledateformat;

import java.util.arraylist;

import java.util.date;

import java.util.list;

import java.util.regex.matcher;

import java.util.regex.pattern;

import com.opensymphony.xwork2.actionsupport;

public class validatoraction extends actionsupport {

private user user;

private list<user>userlist=new arraylist<user>();

public list<user> getuserlist() {

return userlist;

}

public void setuserlist(list<user> userlist) {

this.userlist = userlist;

}

@override

public string execute() throws exception {

if(user==null || this.hasfielderrors())

{

return "regist";

}

else

{

return "success";

}

}

public string adduser()

{

userlist.add(user);

return "success";

}

private static final long serialversionuid = 1l;

public user getuser() {

return user;

}

public void setuser(user user) {

this.user = user;

}

@override

public void validate() {

if(user!=null)

{

if(!datapass( user.getname(),"^[a-za-z][a-za-z1-9_-]+$"))

{

addfielderror("user.name", "用户名(字母开头 + 数字/字母/下划线)");

}

if(!datapass(string.format("%d", user.getage()) ,"(?:[1-9][0-9]?|1[01][0-9]|120)"))

{

addfielderror("user.name", "年龄0-120之间");

}

date startdate=strtodate("1900-01-01");

date enddate=strtodate("2017-01-01");

if(user.getbirthday().before(startdate) || user.getbirthday().after(enddate) )

{

addfielderror("birthday", "出生日期在1900-01-01至2017-01-01之间。");

}

if(!datapass(user.getemail(),"^[a-za-z_]{1,}[0-9]{0,}@(([a-za-z0-9]-*){1,}\\\\.){1,3}[a-za-z\\\\-]{1,}$"))

{

addfielderror("email", "邮箱格式不符合");

}

}

}

private date strtodate(string strdate)

{

simpledateformat formatter = new simpledateformat("yyyy-mm-dd");

parseposition pos = new parseposition(0);

date strtodate = formatter.parse(strdate, pos);

return strtodate;

}

private boolean datapass(string str,string regex)

{

pattern pattern=pattern.compile(regex,pattern.case_insensitive);

matcher matcher =pattern.matcher(str);

return matcher.matches();

}

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13
<?xml version="1.0" encoding="utf-8"?>

<!doctype struts public

"-//apache software foundation//dtd struts configuration 2.5//en"

"http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>

<package name="default" namespace="" extends="struts-default">

<action name="regist" class="com.cyw.test.validatoraction">

<result name="regist">/register.jsp</result>

<result name="success">/success.jsp</result>

<result name="input">/register.jsp</result>

</action>

</package>

</struts>

Struts2之Validator验证框架的详细介绍

2.validatex()方法

?

1

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

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85
package com.cyw.test;

import java.text.parseposition;

import java.text.simpledateformat;

import java.util.arraylist;

import java.util.date;

import java.util.list;

import java.util.regex.matcher;

import java.util.regex.pattern;

import com.opensymphony.xwork2.actionsupport;

public class validatoraction extends actionsupport {

private user user;

private list<user>userlist=new arraylist<user>();

public list<user> getuserlist() {

return userlist;

}

public void setuserlist(list<user> userlist) {

this.userlist = userlist;

}

public string adduser()

{

if(user==null)

{

return "regist";

}

userlist.add(user);

return "success";

}

private static final long serialversionuid = 1l;

public user getuser() {

return user;

}

public void setuser(user user) {

this.user = user;

}

public void validateadduser() {

if(user!=null)

{

if(!datapass( user.getname(),"^[a-za-z][a-za-z1-9_-]+$"))

{

addfielderror("user.name", "用户名(字母开头 + 数字/字母/下划线)");

}

if(!datapass(string.format("%d", user.getage()) ,"(?:[1-9][0-9]?|1[01][0-9]|120)"))

{

addfielderror("user.name", "年龄0-120之间");

}

date startdate=strtodate("1900-01-01");

date enddate=strtodate("2017-01-01");

if(user.getbirthday().before(startdate) || user.getbirthday().after(enddate) )

{

addfielderror("birthday", "出生日期在1900-01-01至2017-01-01之间。");

}

if(!datapass(user.getemail(),"^[a-za-z_]{1,}[0-9]{0,}@(([a-za-z0-9]-*){1,}\\\\.){1,3}[a-za-z\\\\-]{1,}$"))

{

addfielderror("email", "邮箱格式不符合");

}

}

}

private date strtodate(string strdate)

{

simpledateformat formatter = new simpledateformat("yyyy-mm-dd");

parseposition pos = new parseposition(0);

date strtodate = formatter.parse(strdate, pos);

return strtodate;

}

private boolean datapass(string str,string regex)

{

pattern pattern=pattern.compile(regex,pattern.case_insensitive);

matcher matcher =pattern.matcher(str);

return matcher.matches();

}

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13
<?xml version="1.0" encoding="utf-8"?>

<!doctype struts public

"-//apache software foundation//dtd struts configuration 2.5//en"

"http://struts.apache.org/dtds/struts-2.5.dtd">

<struts>

<package name="default" namespace="" extends="struts-default">

<action name="regist" class="com.cyw.test.validatoraction" method="adduser">

<result name="regist">/register.jsp</result>

<result name="success">/success.jsp</result>

<result name="input">/register.jsp</result>

</action>

</package>

</struts>

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25
<%@ page language="java" contenttype="text/html; charset=utf-8"

pageencoding="utf-8"%>

<%@ taglib uri="/struts-tags" prefix="struts" %>

<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">

<html>

<head>

<meta http-equiv="content-type" content="text/html; charset=utf-8">

<title>注册页面</title>

</head>

<body>

<struts:fielderror key="name"></struts:fielderror>

<struts:form action="regist" method="post">

<struts:textfield name="user.name" label="用户名"></struts:textfield>

<br/>

<struts:textfield name="user.age" label="年龄"></struts:textfield>

<br/>

<struts:textfield name="user.birthday" label="出生日期"></struts:textfield>

<br/>

<struts:textfield name="user.email" label="邮箱"></struts:textfield>

<br/>

<struts:submit value="注册"></struts:submit>

</struts:form>

</body>

</html>

Struts2之Validator验证框架的详细介绍

二、xml验证

使用validate方法校验时,如果web应用中存在大量action就需要多次重写validate方法,因此可以使用xwork的validator框架来对struts2进行数据校验,减少代码量。在action包下创建验证文件xxx-validation.xml,注:当一个action中有多个业务处理方法是,命名规则为:actionname-methodname-validation.xml,其中actionname为action类名,methodname为action中某个业务处理方法的方法名,并且文件的搜索顺序与方式一种validate()和validatex()一样。

这里先注释掉action的验证方法,然后新增一个xml验证文件,最后要在form中增加validate="true"

Struts2之Validator验证框架的详细介绍

?

1

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
<?xml version="1.0" encoding="utf-8"?>

<!doctype validators public

"-//apache struts//xwork validator 1.0.3//en"

"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>

<field name="user。name">

<field-validator type="regex">

<param name="expression"><![cdata[(\\w{4,20})]]></param>

<message>用户名必须在420 之间,且必须是字母或者数字</message>

</field-validator>

</field>

<field name="user.email">

<field-validator type="email">

<message>你的电子邮件地址必须是一个有效的电邮地址</message>

</field-validator>

</field>

<field name="user.age">

<field-validator type="int">

<param name="min">1</param>

<param name="max">120</param>

<message>年纪必须在1120之间</message>

</field-validator>

</field>

<field name="user.birthday" >

<field-validator type="date" short-circuit="true">

<param name="min">1900-01-01</param>

<param name="max">2050-02-21</param>

<message>生日在${min}到${max}之间</message>

</field-validator>

</field>

</validators>

Struts2之Validator验证框架的详细介绍

Struts2之Validator验证框架的详细介绍

Struts2之Validator验证框架的详细介绍

这里遗留了两个问题,一是错误信息不是一次全部显示出来,如上面两个图先显示两个错误提示,然后将显示的修改正确之后又显示其他的,这为什么不是全部显示出来呢?二是在xml中使用正则表达式验证怎么不起作用,这个也是个遗留的问题,先把这两个问题放在这里,等以后再问下其他人,如果哪位读者知道原因也希望留言告诉博主,先谢过了。

Struts2之Validator验证框架的详细介绍

三、注解

1.validations annotation的使用

validations中定义了一些验证器的数组,用于存放验证规则,定义如下

?

1

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
public @interface validations {

//自定义校验器数组

public customvalidator[] customvalidators() default {};

//字段转换错误校验器数组

public conversionerrorfieldvalidator[] conversionerrorfields() default {};

//日期范围校验器

public daterangefieldvalidator[] daterangefields() default {};

//email校验器

public emailvalidator[] emails() default {};

//字段表达式校验器

public fieldexpressionvalidator[] fieldexpressions() default {};

//整数范围校验器

public intrangefieldvalidator[] intrangefields() default {};

//必填字段校验器

public requiredfieldvalidator[] requiredfields() default {};

//必填字符串校验器

public requiredstringvalidator[] requiredstrings() default {};

//字符串长度校验器

public stringlengthfieldvalidator[] stringlengthfields() default {};

//url校验器

public urlvalidator[] urls() default {};

//带条件的vistor校验器

public conditionalvisitorfieldvalidator[] conditionalvisitorfields() default {};

//vistor校验器

public visitorfieldvalidator[] visitorfields() default {};

//正则表达式校验器

public regexfieldvalidator[] regexfields() default {};

//表达式校验器

public expressionvalidator[] expressions() default {};

}

requiredstringvalidator —— 必填字符串校验器

校验要求:指定字段不能为null且字符串长度大于0

参数:

  1. fieldname:校验字段名
  2. trim:校验时取出字符串两边的空格,默认为true
  3. message:校验失败时的消息
  4. key:校验失败时返回i18n中指定名称的消息

requiredfieldvalidator —— 必填校验器

校验要求:指定字段不能为null

参数:

  1. fieldname:校验字段名
  2. message:校验失败时的消息
  3. key:校验失败时返回i18n中指定名称的消息

intrangefieldvalidator —— 整数范围校验器

校验要求:int、long、short字段的整数值在指定的范围内

参数:

  1. min:指定最小值,可选,没有则不检查最小值
  2. max:指定最大值,可选,没有则不检查最大值
  3. fieldname:校验字段名
  4. message:校验失败时的消息
  5. key:校验失败时返回i18n中指定名称的消息

daterangefieldvalidator —— 日期范围校验器

校验要求:日期在指定的范围内

参数:

  1. min:指定最小值,可选,没有则不检查最小值
  2. max:指定最大值,可选,没有则不检查最大值
  3. fieldname:校验字段名
  4. message:校验失败时的消息
  5. key:校验失败时返回i18n中指定名称的消息

emailvalidator —— email地址校验器

校验要求:指定的字段为email地址

参数:

  1. fieldname:校验字段名
  2. message:校验失败时的消息
  3. key:校验失败时返回i18n中指定名称的消息

expressionvalidator —— 表达式校验器

校验要求:指定的ongl表达式返回true。

参数:

  1. expression:ongl表达式
  2. message:校验失败时的消息
  3. key:校验失败时返回i18n中指定名称的消息

urlvalidator —— url校验器

校验要求:校验指定的字段值是否为合法的url

参数:

  1. fieldname:校验字段名
  2. message:校验失败时的消息
  3. key:校验失败时返回i18n中指定名称的消息

stringlengthfieldvalidator —— 字符串长度校验器

校验要求:字符串长度在指定的范围内

参数:

  1. minlength:指定最小长度,可选,没有则不检查最小长度
  2. maxlength:指定最大长度,可选,没有则不检查最大长度
  3. trim:校验时取出字符串两边的空格,默认为true
  4. fieldname:校验字段名
  5. message:校验失败时的消息
  6. key:校验失败时返回i18n中指定名称的消息

conversionerrorfieldvalidator —— 转换错误校验器

校验要求:校验指定字段是否发生类型转换错误

参数:

  1. fieldname:校验字段名
  2. message:校验失败时的消息
  3. key:校验失败时返回i18n中指定名称的消息

visitorfieldvalidator —— vistor校验器

说明:普通校验器只能校验基本数据类型和字符串类型,该校验器可以校验对象里面的属性。

参数:

  1. context:用于校验的context
  2. appendprefix: 校验发生错误时是否在错误信息中添加前最消息
  3. fieldname:校验字段名
  4. message:校验失败时的消息
  5. key:校验失败时返回i18n中指定名称的消息

regexfieldvalidator —— 正则表达式校验器

校验要求:指定字段匹配指定的正则表达式

参数:

  1. expression:正则表达式
  2. fieldname:校验字段名
  3. message:校验失败时的消息
  4. key:校验失败时返回i18n中指定名称的消息

conditionalvisitorfieldvalidator —— 带条件的vistor校验器

验证要求:在条件不满足时,和vistor校验器功能一样,条件满足则不执行vistor校验

参数:

  1. fieldname:校验字段名
  2. message:校验失败时的消息
  3. key:校验失败时返回i18n中指定名称的消息

customvalidator —— 自定义校验器

校验器:自定义校验器

举例:

?

1

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
package com.cyw.test;

import java.text.parseposition;

import java.text.simpledateformat;

import java.util.arraylist;

import java.util.date;

import java.util.list;

import java.util.regex.matcher;

import java.util.regex.pattern;

import com.opensymphony.xwork2.actionsupport;

import com.opensymphony.xwork2.validator.annotations.validations;

import com.opensymphony.xwork2.validator.annotations.*;

public class validatoraction extends actionsupport {

private user user;

private list<user>userlist=new arraylist<user>();

public list<user> getuserlist() {

return userlist;

}

public void setuserlist(list<user> userlist) {

this.userlist = userlist;

}

@validations(

emails={@emailvalidator(fieldname="user.email",message="邮件字段的格式不对")},

conversionerrorfields={@conversionerrorfieldvalidator(fieldname="user.age",message="年龄输入的值转换错误")},

intrangefields={@intrangefieldvalidator(fieldname="user.age",min="0",max="120",message="年龄范围为0到120")},

daterangefields={@daterangefieldvalidator(fieldname="user.birthday",min="1900-01-01",max="2017-03-30",message="日期输入不正确")},

regexfields={@regexfieldvalidator(regexexpression="^[a-za-z][a-za-z1-9_-]+$",fieldname="user.name",message="用户名(字母开头 + 数字/字母/下划线)")}

)

public string adduser()

{

if(user==null)

{

return "regist";

}

userlist.add(user);

return "success";

}

private static final long serialversionuid = 1l;

public user getuser() {

return user;

}

public void setuser(user user) {

this.user = user;

}

}

Struts2之Validator验证框架的详细介绍

Struts2之Validator验证框架的详细介绍

结论:

1.action类中使用validations annotation定义验证

2.action中,可以在方法上、类上定义验证annotations,所有的验证器都将同时作用在映射为action的方法上。

3.action中有多个方法被映射为action时,类上和方法上所有定义的验证annotations都将作用在每个映射为action的方法上。

4.action中校验失败时,返回input逻辑视图

5.可以使用@skipvalidation跳过所有的验证检查,包括自身方法定义的校验器。

6.可以在action映射中使用如下代码跳过校验检查

?

1

2

3
<interceptor-ref name="validation">

<param name="validateannotatedmethodonly">true</param>

</interceptor-ref>

遗留问题修改:

上面遗留了一个问题,在xml中来做验证时正则表达式不起作用,保存之后突然想到在注解中用下面的代码来表示的

regexfields={@regexfieldvalidator(regexexpression="^[a-za-z][a-za-z1-9_-]+$",fieldname="user.name",message="用户名(字母开头 + 数字/字母/下划线)")}

看着参数名和xml中配置的不一样,会不会是参数名错误呢?因为我在网上查的有的用regex或expression,不过都说在提问说不起作用,我怀疑是不是参数名有问题,报着试一试的态度用regexexpression试一试,没想到还成功了。应该将上面用xml验证name的地方改成这样子。

?

1

2

3

4

5

6
<field name="user.name">

<field-validator type="regex">

<param name="regexexpression"><![cdata[(\\^[a-za-z][a-za-z1-9_-]+$)]]></param>

<message>用户名(字母开头 + 数字/字母/下划线)</message>

</field-validator>

</field>

Struts2之Validator验证框架的详细介绍

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:http://www.cnblogs.com/5ishare/p/6641756.html?utm_source=tuicool&utm_medium=referral

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Struts2之Validator验证框架的详细介绍 https://www.kuaiidc.com/118058.html

相关文章

发表评论
暂无评论