一、JSR 303 校验框架介绍
(1)用于对Java Bean 中的字段的值进行验证,使得验证逻辑从业务代码中脱离出来
(2) 是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回
(3) 一般用于表单提交页面(如用户名必填、只能由数字字母组成等等)
二、JSR 303 校验框架注解类
•
@NotNull
注解元素必须是非空
•
@Null
注解元素必须是空
•
@Digits
验证数字构成是否合法
•
@Future
验证是否在当前系统时间之后
•
@Past
验证是否在当前系统时间之前
•
@Max
验证值是否小于等于最大指定整数值
•
@Min
验证值是否大于等于最小指定整数值
•
@Pattern
验证字符串是否匹配指定的正则表达式
•
@Size
验证元素大小是否在指定范围内
•
@DecimalMax
验证值是否小于等于最大指定小数值
•
@DecimalMin
验证值是否大于等于最小指定小数值
•
@AssertTrue
被注释的元素必须为
true
•
@AssertFalse
被注释的元素必须为
false
三、HibernateValidator 扩展
HibernateValidator扩展注解类有以下:
(1)
@Email
被注释的元素必须是电子邮箱地址
(2)
@Length
被注释的字符串的大小必须在指定的范围内
(3)
@NotEmpty
被注释的字符串的必须非空
(4)
@Range
被注释的元素必须在合适的范围内
四、创建工程
五、具体内容如下;
(1)pom.xml文件(在原来的基础上再添加如下配置)
<!-- hibernate validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
<!-- slf4j start -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<!-- end -->
需要这4个包
(2)spring-mvc文件
<!-- 添加mvc注解 校验框架 -->
<!-- <mvc:annotation-driven/> -->
(4)创建JSP页面register.jsp
<style type="text/css">
.c{
font-size: 12px;
color: red;
}
</style>
</head>
<body>
<div style="margin:0 auto; background:snow; padding-top: 100px;"
align="center">
<form action="doRegister.html" method="post">
<p>
<span>用户名:</span><input type="text" name="uname">
<span class="c">${ERR_uname}</span>
</p>
<p>
<span>密 码:</span><input type="password" name="upwd">
<span class="c">${ERR_upwd }</span>
</p>
<p>
<span>真实姓名:</span><input type="text" name="rname">
<span class="c">${ERR_rname }</span>
</p>
<p>
<span>年 龄:</span><input type="text" name="age">
<span class="c">${ERR_age }</span>
</p>
<p>
<span>邮 箱:</span><input type="text" name="email">
<span class="c">${ERR_email }</span>
</p>
<p>
<input type="submit" value="注册">
</p>
</form>
</div>
</body>
(5)创建实体类
package com.hlx.bean;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import com.hlx.annotation.Between;
/**
* 在javabean中定义相关的校验规则
* @author Administrator
*
*/
public class User implements Serializable {
//被注释的字符串的必须非空
@NotEmpty(message="用户名不能为空!")
private String uname;
@Pattern(regexp="[0-9a-zA-Z_]{6,10}", message="密码必须是6-10个字母或数字或下划线")
private String upwd;
@Length(min=2,max=10,message="真实姓名必须是2-10个字符")
private String rname;
//用自定义。。。age
@NotNull(message="年龄不能为空!")
// @NotNull(message = "{NotNull.user.age}")
@Between(min=18,max=45)
private Integer age;
@Email(message="Email格式不正确")
private String email;
public User_1(String uname, String upwd, String rname, Integer age,
String email) {
super();
this.uname = uname;
this.upwd = upwd;
this.rname = rname;
this.age = age;
this.email = email;
}
public User_1() {
super();
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
public String getRname() {
return rname;
}
public void setRname(String rname) {
this.rname = rname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
(6)控制类
package com.hlx.controller;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;
import com.hlx.bean.User;
import com.hlx.service.UserService;
@Controller
@SessionAttributes("user")
// 保存user对象
public class UserController {
//
@Resource
private HttpServletRequest request;
@RequestMapping("register")
public String toLoginPage() {
return "jsp/register.jsp";
}
/**
*
* @param uname
* 表单传过来的参数
* @param upass
* @param request
* 请求对象
* @return
*/
@RequestMapping(value = "doRegister", method = RequestMethod.POST)
public String doLogin(@Valid User user, BindingResult result, ModelMap map) {
// 添加一个用户对象,必须用springMVC的@Valid ; BindingResult是保存错误消息
if (result.hasErrors()) {
//获得所有的错误
List<FieldError> list = result.getFieldErrors();
//遍历
for (FieldError fieldError : list) {
//存入请求中(ERR_字段名,具体的消息)
request.setAttribute("ERR_"+fieldError.getField(), fieldError.getDefaultMessage());
}
return "jsp/register.jsp";
}
//省略了相关的注册逻辑
return "jsp/success.jsp";
}
}
效果如下:
原有的校验规则可能不满足我们的需求,那么如何自定义校验规则?
(1)自定义注解类
package com.hlx.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.ReportAsSingleViolation;
import javax.validation.constraints.Pattern;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Documented
@Constraint(validatedBy = {BetweenValidator.class}) //注意必须要指定当前类的校验
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
public @interface Between {
String message() default "年龄必须在{min}-{max}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
//添加
int min();
int max();
}
必须具体的类来实现自定义注解
package com.hlx.annotation;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* 自定义校验
* 需要集成ConstraintValidator接口,isValid方法负责校验
*
* @author Administrator
*
*/
public class BetweenValidator implements ConstraintValidator<Between, Integer> {
// 指定min ,max
int min;
int max;
/**
* 初始化
*/
@Override
public void initialize(Between arg0) {
// TODO Auto-generated method stub
min = arg0.min();
max = arg0.max();
}
/**
*
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext arg1) {
// TODO Auto-generated method stub
if (value==null) {
return false;
}
//判断是否在这个范围内
if(value>=min && value<=max){
return true;
}
return false;
}
}
(2)在JavaBean中配置
//用自定义。。。age
@NotNull(message="年龄不能为空!")
@Between(min=18,max=45)
private Integer age;
(3)效果如下:
如何国际化错误信息?
(1)在src/main/resources 下Source Folder 创建包i18n/messages.properties
NotEmpty.uname=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A
Pattern.upwd=\u5BC6\u7801\u5FC5\u987B\u662F6-10\u4E2A\u5B57\u6BCD\u6216\u6570\u5B57\u6216\u4E0B\u5212\u7EBF
Length.rname=\u771F\u5B9E\u59D3\u540D\u5FC5\u987B\u662F2-10\u4E2A\u5B57\u7B26
Email.email=Email\u683C\u5F0F\u4E0D\u6B63\u786E
NotNull.age=\u5E74\u9F84\u4E0D\u80FD\u4E3A\u7A7A\uFF01
(2)在/WEB-INF/springmvc.xml中进行配置
(3)在JavaBean中如何使用
效果