SpringMVC数据校验

1.JSR 303 校验框架

因为Spring的LocalValidatorFactroyBean既实现了 Spring的Validator接口,也实现了 JSR 303的Validator接口,因此我们介绍一个JSR303

JSR 303
  • 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 的一个参考实现,除支持所有标准的校验注解外,它还支持以下的扩展注解

注解注解说明
@Email被注释的元素必须是电子邮箱地址
@Length被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串必须为非空
@Range被注释的元素必须在合适范围内

 

2.SpingMVC数据校验

•Spring 4.0拥有自己独立的数据校验框架,同时支持 JSR 303 标准的校验框架。
•Spring在进行数据绑定时,可同时调用校验框架完成数据校验工作。 在 Spring MVC中,可直接通过注解驱动的方式进行数据校验
•Spring的LocalValidatorFactroyBean既实现了 Spring的Validator接口,也实现了 JSR 303的Validator接口。只要在Spring容器中定义了一个 LocalValidatorFactoryBean,即可将其注入到需要数据校验的 Bean 中。
Spring 本身并没有提供 JSR303 的实现,所以必须将JSR303的实现者的jar包放到类路径下。
        hibernate-validator-5.0.0.CR2.jar
        hibernate-validator-annotation-processor-5.0.0.CR2.jar

            validation-api-1.1.0.CR1.jar

           jar链接:https://pan.baidu.com/s/15eWuFL7Z52p3qaK0DuHZ3A

                        l26r

<mvc:annotation-driven/> 会默认装配好一个LocalValidatorFactoryBean,通过在处理方法的入参上标注 @valid注解即可让Spring MVC在完成数据绑定后执行数据校验的工作
•在已经标注了JSR303注解的表单/命令对象前标注一个@Valid,Spring MVC框架在将请求参数绑定到该入参对象后,就会调用校验框架根据注解声明的校验规则实施校验
•Spring MVC是通过对处理方法签名的规约来保存校验结果的: 前一个表单/命令对象的校验结果保存到随后的入参中,这个保存校验结果的入参必须是BindingResult或Errors 类型,这两个类都位于 org.springframework.validation 包中
 

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或者是默认的类名首字母小写.校验的属性名数据类型转换数据格式转换时发生错误,或该有的参数不存在,或调用处理方法时发生错误,都会在隐含模型中创建错误消息。其错误代码前缀说明如下:

required :必要的参数不存在。如 @ RequiredParam (“param1”) 标注了一 个入参,但是该参数不存在
typeMismatch :在数据绑定时,发生数据类型不匹配的问题
methodInvocation Spring MVC 在调用处理方法时发生了错误

③ 国际化:

               [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

浏览器再次进行访问,此时错误提示就是我们自己定制错误的提示消息

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值