该篇博客利用一个注册的Demo来详解JSR 303的数据校验
一、关于JSR303数据校验介绍
输入验证是Spring处理的最重要Web开发任务之一。在Spring MVC中,有两种方式可以验证输入,一是利用Spring自带的验证框架,二是利用本文所讲的JSR 303实现,如果你纠结于使用这两种中的哪一种,那么我建议你采用JSR 303,因为JSR 303是正式的Java规范,而且使用相对简单
当然JSR只是一个规范文档,本身用处不大,除非编写了它的实现。对于JSR bean validation目前有两个实现。第一个是实现Hibernate Validator(JSR 303和JSR 349都有它的实现),二是实现Apache BVal(该实现相对于Hibernate Validator没那么稳定)
二、JSR 303约束和Hibernate Validator约束
JSR 303是标准的校验注解,Hibernate Validator也有自带的校验注解
这些注解约束,使用在实体类的成员变量中
1、JSR 303注解约束
2、Hibernate Validator注解约束
属性 | 描述 |
---|---|
被注释的元素必须是电子邮箱地址 | |
@Length | 被注释的字符串大小必须在指定范围内:@Length(min=6,max=18,message=”密码长度必须在6~18位”) |
@NotEmpty | 被注释的集合类上必须非空 |
@Range | 被注释的元素必须在合适的范围内 |
介绍了这么多,下面就进入正题,一个注册的Demo,看看是如何进行数据校验
三、利用JSR 303数据校验实战
1、导入JAR包
以上JAR包的下载,我会放到文末的工程下载中
2、项目目录
3、User实体类
package linjie.springmvc.pojo;
/**
* @author 浅然 [email protected]
* @version 创建时间:2018年6月4日 上午7:59:41
* 用户实体类
*/
import java.io.Serializable;
import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
public class User implements Serializable{
private static final long serialVersionUID = -8091594509781201303L;
//@NotEmpty 用在集合类上面
//@NotBlank 用在String上面
//@NotNull 用在基本类型上
@NotBlank(message="用户名不能为空")
private String username; //用户名
@Length(min=6,max=18,message="密码长度必须在6~18位")
private String password; //用户密码
@Email(message="邮箱格式不正确")
private String email; //用户邮箱
@Pattern(regexp="[1][3|4|5|7|8][0-9]{9}",message="手机号码格式不正确")
private String phone; //用户电话
public User() {}
/**
* @return the username
*/
public String getUsername() {
return username;
}
/**
* @param username the username to set
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
}
/**
* @return the email
*/
public String getEmail() {
return email;
}
/**
* @param email the email to set
*/
public void setEmail(String email) {
this.email = email;
}
/**
* @return the phone
*/
public String getPhone() {
return phone;
}
/**
* @param phone the phone to set
*/
public void setPhone(String phone) {
this.phone = phone;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "User [username=" + username +
", password=" + password + ", email=" +
email + ", phone=" + phone + "]";
}
}
4、请求处理控制器
@Valid作用:当该对象的类中已经定义好了验证规则,利用@Valid在控制器的方法中指定对该对象进行验证
package linjie.springmvc.controller;
/**
* @author 浅然 [email protected]
* @version 创建时间:2018年6月4日 上午8:01:41
* 请求处理的控制器
*/
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Errors;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import linjie.springmvc.pojo.User;
@Controller
@RequestMapping("/springmvc")
public class UserController {
//创建用户对象存入model,进入regist.jsp
@RequestMapping(value="/regist")
public String Regist(Model model){
User user = new User();
model.addAttribute("user",user);
return "regist";
}
//用户注册事件触发该控制器,判断是否有error信息
//如果有则不进入success
//没有则进入success
//@Valid作用:当该对象的类中已经定义好了验证规则,利用@Valid在控制器的方法中指定对该对象进行验证
//BindingResult:传入BindingResult对象,用于获取校验失败情况下的反馈信息
@RequestMapping(value="/qianran")
public String GoSuccess(@Valid @ModelAttribute User user,BindingResult bindingResult,
Errors errors,Model model){
if(errors.hasErrors()){
FieldError fieldError = bindingResult.getFieldError();
System.out.println("Code:"+fieldError.getCode()+", object:"+fieldError.getObjectName()
+", field:"+fieldError.getField());
return "regist";
}
model.addAttribute("user",user);
return "success";
}
}
5、配置文件
web.xml
springmvc-servlet.xml
6、视图
regist.jsp
Errors对象中的错误消息,可以利用表单标签库的Errors标签显示在HTML页面中。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!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">
<link rel="stylesheet" type="text/css" href="../resource/css/user.css">
<title>浅然-注册</title>
</head>
<body>
<img src="../resource/images/qianran.jpg">
<form:form commandName="user" action="qianran" method="post">
<fieldset>
<legend>用户注册</legend>
用户名*:<form:input path="username"/><span><form:errors path="username" cssClass="error" /></span><br>
密码*:<form:input path="password"/><span><form:errors path="password" cssClass="error"/></span><br>
邮箱:<form:input path="email"/><span><form:errors path="email" cssClass="error"/></span><br>
手机号*:<form:input path="phone"/><span><form:errors path="phone" cssClass="error"/></span><br>
<input type="submit" value="注册">
</fieldset>
</form:form>
</body>
</html>
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
<fieldset>
<legend>注册成功</legend>
用户名:${user.username }<br>
密码:${user.password }<br>
邮箱:${user.email }<br>
手机号:${user.phone }<br>
</fieldset>
</body>
</html>
输入地址:http://localhost:8080/Springmvc_JSR303/springmvc/regist
Demo演示
1、注册初始界面
2、直接点击注册,没有填任何信息(就会进行校验)
3、按照提示规则输入正确的表单格式,成功注册界面
参考
《SpringMVC学习指南》