在web应用程序中,为了防止客户端传来的数据引发程序异常,常常需要对 数据进行验证。输入验证分为客户端验证与服务器端验证。客户端验证主要通过JavaScript脚本进行,而服务器端验证则主要通过Java代码进行验证。 为了保证数据的安全性,一般情况下,客户端和服务器端验证都是必须的。
SpringMVC支持JSR(Java Specification Result,Java规范提案)303-Bean Validation数据验证规范。而该规范的实现者很多,其中较常用的是Hibernate Validator。需要注意的是,Hibernate Validator是与Hibernate ORM并列的Hibernate的产品之一。这一点从Hibernate官网上所提供的资源形式可以看出他们之间的关系。
1.导包
在写数据校检前需导入以下包:
2.配置springmvc.xml文件
<!--格式化-->
<bean id="conversionServices" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> </bean>
<!-注解解析器-->
<mvc:annotation-driven />
3.创建实体类
package com.znsd.springmvc.dao;
import java.util.Date;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.format.annotation.DateTimeFormat;
public class User {
@NotEmpty(message = "用户名不能为空")
private String name;
@NotEmpty(message = "密码不能为空")
private String pass;
private String sex;
@DateTimeFormat(pattern = "yyyy-mm-dd")
private Date data;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getData() {
return data;
}
public void setData(Date data) {
this.data = data;
}
@Override
public String toString() {
return "User [name=" + name + ", pass=" + pass + ", sex=" + sex + ", data=" + data + "]";
}
}
JSR303常用注解
注解 | 说明 |
---|---|
@Null | 必须为null |
@NotNull | 必须不为null |
@AssertTrue | 必须为true |
@AssertFalse | 必须为false |
@Min(value) 必须为一个数字 | 其值必须大于等于指定的最小值 |
@Max(value) 必须为一个数字 | 其值必须小于等于指定的最小值 |
@DecimalMin(value) 必须为一个数字 | 其值必须大于等于指定的最小值 |
@DecimalMax(value) 必须为一个数字 | 其值必须小于等于指定的最小值 |
@Size(max,min) | 元素的大小必须在指定范围内 |
@Digits(int,fraction) | 必须是一个数字,其值必须在可接受范围内 |
@Past | 必须是一个过去的日期 |
@Future | 必须是一个将来的日期 |
@Pattern(value) | 其值必须符合指定的正则表达式 |
被修饰的元素必须是电子邮件 | |
@Length | 被修饰的元素长度必须在指定的范围内 |
@NotEmpty | 被修饰的元素必须非空 |
@Range | 被修饰的元素必须在合适的范围内 |
4.创建jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="from" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<from:form action="update" method="post" commandName="user">
<table>
<tr>
<td><c:message key="resource.name"/>:</td>
<td><from:input path="name"/></td>
</tr>
<tr>
<td><c:message key="resource.pass"/>:</td>
<td><from:password path="pass"/></td>
</tr>
<tr>
<td>性别</td>
<td><from:radiobuttons items="${gender}" path="sex"/></td>
</tr>
<tr>
<td>日期</td>
<td><from:input path="data"/></td>
</tr>
<tr>
<td><input type="submit" value="修改"></td>
<td><input type="reset" vlaue="重置"></td>
</tr>
</table>
</from:form>
</body>
</html>
5.书写Controller方法
在已经标注了JSR303注解的表单/命令对象前标注一个@Valid,SpringMVC框架在将请求参数绑定到该形参对象后,就会调用效验框架根据注解声明的校检规则进行校检。
SpringMVC是通过对处理方法签名的规定来保存效验结果的,前一个表单/命令对象的效验结果,保存到随后的入参中,这个保存了效验结果的入参必须是BindingResult或者Error类型,这两个类都位于org.springframework.validation包中。
在表单/命令对象类的属性中标注效验注解,在处理方法对应的入参前添加@Valid,SpringMVC就会实施效验,并将效验结果保存被效验入参之后的BindingResult或Errors中
常用方法 | 说明 |
---|---|
FieldError getFieldError(String field) | 获取错误对象 |
List getFieldErrors() | 获取错误集合 |
Object getFieldValue(String field) | 获取单个错误的值 |
int getErrorCount() | 获取错误总数 |
进入jsp页面
点击修改则后台会把错误信息打印出来