SpringMVC使用hibernate的实现的校验框架validation,所以需要导入相关依赖的jar包
classmate-1.1.0.jar
hibernate-validator-5.1.3.Final.jar
jboss-logging-3.1.4.GA.jar
validation-api-1.1.0.Final.jar
数据校验之后,如果有错误信息,那么需要使用spring提供的标签库中的标签在页面中显示校验信息
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
validation.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
post提交方式
modelAttribute代表模型中必须有一个user对象
sf:errors代表错误展示,将来会自动展示,不需要我们管
没有action跳转路径,默认跳转到当前页面
-->
<sf:form method="post" modelAttribute="user">
<sf:label path="name">用户名:</sf:label>
<sf:input path="name"/>
<sf:errors path="name" cssStyle="color:red"></sf:errors><br>
<sf:label path="age"> 年 龄:</sf:label>
<sf:input path="age"/>
<sf:errors path="age" cssStyle="color:red"></sf:errors><br>
<sf:label path="dob"> 生 日:</sf:label>
<sf:input path="dob"/>
<sf:errors path="dob" cssStyle="color:red"></sf:errors><br>
<input type="submit" value="提交"/> <!-- 提交的时候POST -->
</sf:form>
</body>
</html>
注意:
1.需要访问一个Controller再跳转到这个页面,同时需要向模型中添加一个名字叫user的对象(这就是之前说的命令/表单对象),否则跳转到这个页面的时候会报错
2.表单中没有这种action属性值,那么默认把数据提交给当前页面,但是提交方式是post
3.input标签中的path属性的值对应的是表单对象中的属性
4.Controller中映射的url为:/Valid/add , 如果是get方式访问这个url那么就把valid.jsp显示给用户,如果是post方式访问这个url,就表示要提交表单的数据。
5.在Controller中,在需要验证的参数前面加入@Valid注解
6.方法参数列表中,加入BindingResult对象,用来接收验证的错误信息,并根据这个进行不同情况的跳转
7.在被验证的表单对象所属类中,给需要验证的属性上加入指定注解
ValidationController.java
get方式是跳转页面,post方式是提交表单
@RequestMapping("/validation")
@Controller
public class ValidationController {
@ModelAttribute("user") //提供一个user对象,解决了内存中没有user的问题
public User getUser() {
return new User();
}
/*
Controller中映射的url为:/validation/test,默认是GET方式
如果是get方式访问这个url那么就把validation.jsp显示给用户,
如果是post方式访问这个url,就表示要提交表单中的数据,默认提交到当前路径
*/
@RequestMapping(value="/test",method=RequestMethod.GET)
public String test(){
System.out.println("ValidationController test()---GET");
return "validation";//GET方式提交(默认),validation.jsp
//必须要有一个user对象,进行验证
}
@RequestMapping(value="/test",method=RequestMethod.POST)
public String test(@Valid User u,BindingResult bindingResult){//先从模型中找对象
//在需要验证的参数前面加入@Valid注解
//加入BindingResult对象,用来接收验证的错误信息
System.out.println("ValidationController test()---POST");
//如果验证数据中有错误信息,将保存在bindingResult对象中
if(bindingResult.hasErrors()){
List<ObjectError> errorList = bindingResult.getAllErrors();
for(ObjectError error : errorList){
System.out.println(error.getDefaultMessage()); //打印bindingResult对象中的错误信息
}
//验证不通过在跳到validation页面,因为页面上有显示错误的标签
return "validation";
}
System.out.println("u="+u);
System.out.println("日期:"+u.getDob());
return "test";//POST方式提交,提交表单中的数据,提交到当前路径
}
}
常用的数据校验的注解
@Null 值只能为null
@NotNull 值不能为null
@NotEmpty 值不为null且不为空
@NotBlank 值不为null且不为空(先去除首尾空格)
@Pattern 正则表达式验证
@Size 限制长度在x和y之间
@Max 最大值
@Min 最小值
@Future 必须是一个将来的日期(和现在比) 备忘录
@Past 必须是一个过去的日期(和现在比) 生日
@Email 校验email格式
注意:日期属性上要加@DateTimeFormat(pattern="yyyy-MM-dd"),否则页面传的字符串是不能自动转为为日期的
验证举例子:
public class User implements Serializable{
private long id;
@Size(min=5,max=8,message="用户名长度再5-8字符")
//默认的错误信息:个数必须在5和8之间,自己定义了错误信息
//@NotBlank //值不为null且不为空(先去除首尾空格) 默认的错误信息 :用户为空
@NotBlank(message="请输入用户名")
//自己写的错误信息:请输入用户名
private String name;
private int age;
@Past
//默认的错误信息 :需要是一个过去的时间
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date dob;
get/set...
}
用了@NotBlank
@NotBlank(message=“请输入用户名”)
自己写的错误信息:请输入用户名
@Size(min=5,max=8)
@NotBlank(message=“请输入用户名”)
同时显示
@Size(min=5,max=8,message=“用户名长度再5-8字符”)