1.JSR 303 校验框架
因为Spring的LocalValidatorFactroyBean既实现了 Spring的Validator接口,也实现了 JSR 303的Validator接口,因此我们介绍一个JSR303
- JSR 303是Java为Bean数据合法性校验提供的标准的框架,它已经包含在JavaEE6.0中
- JSR 303通过在Bean属性上标注类似于@NotNull、@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证
注解 | 功能说明 |
@Null | 被注释的元素必须为null |
@NotNUll | 被注释的元素必须不为null |
@AsserTrue | 被注释的元素必须为true |
@AsserFalse | 被注释的元素必须为false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须为一个数字,其值必须小于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须为一个数字,其值必须小于等于指定的最大值 |
@Size(max,min) | 被注释的元素的大小必须在指定的范围内 |
@Digits(integer,fraction) | 被注释的元素必须是一个数字,其必须在可接受的范围 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
@Pattern(value) | 被注释的元素必须符合指定的正则表达式 |
Hibernate Validator扩展注解
- HibernateValidator已经对错误消息实现了国际化. 会根据浏览器端的本地化语言进行错误消息的展示
•Hibernate Validator 是 JSR 303 的一个参考实现,除支持所有标准的校验注解外,它还支持以下的扩展注解
注解 | 注解说明 |
被注释的元素必须是电子邮箱地址 | |
@Length | 被注释的字符串的大小必须在指定的范围内 |
@NotEmpty | 被注释的字符串必须为非空 |
@Range | 被注释的元素必须在合适范围内 |
2.SpingMVC数据校验
validation-api-1.1.0.CR1.jar
jar链接:https://pan.baidu.com/s/15eWuFL7Z52p3qaK0DuHZ3A
l26r
1. 下面我们进行代码演示
1.student
public class Student {
private int id;
@NotEmpty
private String username;
@Email
private String email;
@Past
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
@NumberFormat(pattern = "#,###,###")
private double salary;
其他的省略
}
2.WEB-INF下的student.jsp,使用springmvc的表单标签
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 导入springmvc的表单标签 -->
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!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>Insert title here</title>
</head>
<body>
<c:set var="basePath" value="${pageContext.request.contextPath}"></c:set>
<!-- 回显的时候到request域对象中查找对应的对象,用于数据回显,默认以key value的形式 默认的key是command value中放的是一个封装的对象
会根据command 进行数据回显
此处我们根据student进行数据回显
-->
<form:form action="${basePath}/testValidator" method="post"
modelAttribute="student">
usename:<form:input path="username"></form:input><form:errors path="username"></form:errors><br>
email:<form:input path="email"></form:input ><form:errors path="email"></form:errors><br>
birthday:<form:input path="birthday"></form:input><form:errors path="birthday"></form:errors><br>
salary:<form:input path="salary"></form:input><form:errors path="salary"></form:errors><br>
<input type="submit" value="submit">
</form:form>
</body>
</html>
Contoller
//访问此handler,转到student.jsp 因为student页面有modelAttribute=student属性,key=student
value=封装好的student对象,如果要是直接调到student页面,会因为找不到key:student的值而报错
@RequestMapping("/testAddStudent")
public String testAddStudent(Map<String, Object> map){
Student student = new Student();
map.put("student", student);
return "student";
}
//studen.jsp提交表单数据到此handler
@RequestMapping(value="/testValidator", method=RequestMethod.POST)
public String testValidator(@Valid Student student,BindingResult result,Map<String,Object> map){
if(result.getErrorCount()>0){
System.out.println("******出错了*********");
List<FieldError> fieldError = result.getFieldErrors();
for(FieldError error:fieldError){
System.out.println(error.getField()+"-----"+error.getDefaultMessage());
map.put("student", student);
}
return "student";//调到学生页面回显,根据modelAttribute=student,把错误信息显示到student页面
}
return "success";
}
浏览器访问http://localhost:8080/SpringMVC1/testAddStuden,跳转到student页面,进行填写学生信息,
如果数据校验,数据不匹配,就重新回到student页面,通过<form:errors path=""></form:errors><br>进行错误信息显示
2.提示消息的国际化
① Hibernate Validator 对校验的错误提示已经实现了国际化, 但是希望自己定制错误的提示消息。
②校验框架会为数据绑定流程中出现的错误生成错误消息码。
校验: 校验注解名.ModelAttribute指定的value或者是默认的类名首字母小写.校验的属性名
转换+格式化: typeMismatch.ModelAttribute指定的value或者是默认的类名首字母小写.校验的属性名若数据类型转换或数据格式转换时发生错误,或该有的参数不存在,或调用处理方法时发生错误,都会在隐含模型中创建错误消息。其错误代码前缀说明如下:
③ 国际化:
[1]. 编写国际化资源文件 i18n.zh_CN.properties i18n.en_US.properties(此处不展示此代码,一般不用这个)
[2]. 配置ResourceBundleMessageSource.
[3]. 默认情况下, 会根据请求头中的Accept-language 来确定Locale。 ResourceBundleMessageSource会结合确定好的Locale对象,读取对应的国际化资源文件中的内容
1.spingmvc.xml
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 指定读取配置文件的基名 -->
<property name="basename" value="i18n"></property>
</bean>
2.i18n.zh_CN.properties
NotEmpty.student.username=\uFF01\uFF01\uFF01\u4E0D\u80FD\u4E3A\u7A7A
Email.student.email=\uFF01\uFF01\uFF01\u90AE\u7BB1\u5FC5\u987B\u662F\u5408\u6CD5\u7684\u624D\u884C
Past.student.birthday=\uFF01\uFF01\uFF01\u5FC5\u987B\u8FC7\u53BB\u7684\u65E5\u671F
typeMismach.student.salary=\uFF01\uFF01\uFF01\u5FC5\u987B\u5408\u6CD5\u7684\u6570\u5B57
浏览器再次进行访问,此时错误提示就是我们自己定制错误的提示消息