在Myeclipse+Maven新建SpringMVC项目基础上继续编写代码
添加依赖包
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.5.Final</version>
</dependency>
这里有点小坑,再Maven仓库里查找该包的时候。我是直接找最新版本的,结果有点问题。再为实体添加验证规则的时候,找不到注解@Length和@Range,反正再包import org.hibernate.validator.constraints下面的注解都找不到,估计是新版本后改进了些什么东西。后面把版本改到6.0.5就可以了。
项目结构
添加实体类
package com.alin.JSR303;
import java.io.Serializable;
import java.util.Date;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Past;
import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;
public class User implements Serializable{
private static final long serialVersionUID = -2207178391281646317L;
@NotBlank(message="登录名不能为空")
private String loginname;
@Length(min=6,max=8,message="密码长度必须再6位到8位之间")
@NotBlank(message="密码不能为空")
private String password;
@NotBlank(message="用户名不能为空")
private String username;
@Range(min=15,max=60,message="年龄必须再15岁到60岁之间")
private int age;
@Email(message="必须是合法的邮箱地址")
private String email;
@DateTimeFormat(pattern="yyyy-MM-dd")
@Past(message="生日 必须是一个过去日期")
private Date brithDate;
@Pattern(regexp="[1][3,8][3,6,9][0-9]{8}",message="无效的电话号码")
private String phone;
public String getLoginname() {
return loginname;
}
public void setLoginname(String loginname) {
this.loginname = loginname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
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 getBrithDate() {
return brithDate;
}
public void setBrithDate(Date brithDate) {
this.brithDate = brithDate;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
@Override
public String toString() {
return "User [loginname=" + loginname + ", password=" + password + ", username=" + username + ", age=" + age
+ ", email=" + email + ", brithDate=" + brithDate + ", phone=" + phone + "]";
}
}
其中的验证规则在上面也能看得清楚。
编写控制器
package com.alin.JSR303;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class JSP303UserController {
@RequestMapping(method=RequestMethod.GET,value="register")
public String registerForm(Model model){
User user=new User();
model.addAttribute("user",user);
return "JSP303/registerForm";
}
@RequestMapping(method=RequestMethod.POST,value="/login")
public String login(@Valid @ModelAttribute User user,Errors errors,Model model){
System.out.println(user);
if (errors.hasErrors()) {
return "JSP303/registerForm";
}
model.addAttribute("user",user);
return "JSP303/success";
}
}
registerForm.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>注册页面</title>
</head>
<body>
<form:form modelAttribute="user" method="post" action="login">
<span>登陆名:</span>
<form:input path="loginname" />
<form:errors path="loginname" cssStyle="color:red" />
<br />
<span>密码:</span>
<form:input path="password" />
<form:errors path="password" cssStyle="color:red" />
<br />
<span>用户名:</span>
<form:input path="username" />
<form:errors path="username" cssStyle="color:red" />
<br />
<span>年龄:</span>
<form:input path="age" />
<form:errors path="age" cssStyle="color:red" />
<br />
<span>邮箱:</span>
<form:input path="email" />
<form:errors path="email" cssStyle="color:red" />
<br />
<span>生日:</span>
<form:input path="brithDate" />
<form:errors path="brithDate" cssStyle="color:red" />
<br />
<span>电话:</span>
<form:input path="phone" />
<form:errors path="phone" cssStyle="color:red" />
<br />
<input type="submit" value="提交" />
</form:form>
</body>
</html>
success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page isELIgnored = "false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>登陆界面</title>
</head>
<body>
登陆名:${requestScope.user.loginname }
<br /> 密码:${requestScope.user.password }
<br /> 登陆名:${requestScope.user.username }
<br /> 年龄:${requestScope.user.age }
<br /> 邮箱:${requestScope.user.email }
<br /> 生日:<fmt:formatDate value="${requestScope.user.brithDate }" pattern="yyyy年MM月dd日"/>
<br /> 电话:${requestScope.user.phone }
</body>
</html>
运行效果
JSR 303 基本的校验规则
空检查
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) Validates that the annotated string is between min and max included.
日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前,验证成立的话被注释的元素一定是一个过去的日期
@Future 验证 Date 和 Calendar 对象是否在当前时间之后 ,验证成立的话被注释的元素一定是一个将来的日期
@Pattern 验证 String 对象是否符合正则表达式的规则,被注释的元素符合制定的正则表达式,regexp:正则表达式 flags: 指定 Pattern.Flag 的数组,表示正则表达式的相关选项。
数值检查
建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为”“,Integer为null
@Min 验证 Number 和 String 对象是否大等于指定的值
@Max 验证 Number 和 String 对象是否小等于指定的值
@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits 验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Range(min=, max=) 被指定的元素必须在合适的范围内
@Range(min=10000,max=50000,message=”range.bean.wage”)
@Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
@CreditCardNumber信用卡验证
@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)