服务器之家

服务器之家 > 正文

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

时间:2020-09-04 15:12     来源/作者:社会主义接班人

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中指定名称的消息
  5.  

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验证框架的详细介绍

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

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

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
最新idea2020注册码永久激活(激活到2100年)
最新idea2020注册码永久激活(激活到2100年) 2020-07-29
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址 2020-08-12
返回顶部