SpringMVC框架 |JSR303数据校验


一、JSR303介绍

只做前端校验是不安全的,重要的数据一定要加上后端验证。可以在程序中将每一条数据取出校验,如果校验失败直接来到添加页面,提示其重新填写。而SpringMVC提供了JSR303来进行数据校验。

  • JSR303 是Java为Bean数据合法性校验提供的标准框架,它已经包含在JavaEE6.0中。
  • JSR303 通过在Bean属性上标注类似于@NotNull、@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证。
JSR303注解 功能说明
@Null 被注释的元素必须为null
@NutNull 被注释的元素必须不为null
@AssertTrue 被注释的元素必须为true
@AssertFalse 被注释的元素必须为false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max,min) 被注释的元素的大小必须在指定的范围内
@Digits(integer,fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期

就像JDBC只是一个规范,需要有各个厂商的驱动包来实现一样,JSR303也是一个规范,可以通过 Hibernate Validator(第三方校验框架)来实现。

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

二、JSR303的使用步骤

第一步:导入jar包/添加Maven依赖:

在这里插入图片描述

第二步:在bean中为属性加上注解

	@NotNull//非空
	@Length(min = 6, max = 16)//必须是6-16个字符
	private String lastName;
	@Email//必须是邮箱格式
	private String email;

	@DateTimeFormat(pattern = "yyyy-MM-dd")//这个是自定义的日期格式
	@Past//必须是过去的时间
	private Date birth;

第三步:告诉SpringMVC需要校验的JavaBean

  • 添加@Valid注解,此注解告诉SpringMVC封装JavaBean时,按照指定的校验规则进行校验。另外,可以通过紧跟BindingResult参数,来封装这个JavaBean的校验结果。
例:
	@RequestMapping(value = "/emp", method = RequestMethod.POST)
	public String addEmp(@Valid Employee employee, BindingResult result) {
		boolean hasErrors = result.hasErrors();
		if (hasErrors) {
			System.out.println("有校验错误");
			return "add";
		} else {
			employDao.save(employee);
			// 返回列表页面,直接重定向到emps请求
			return "redirect:/emps";
		}
	}

可以在JSP页面对应的输入框后添加<form:errors path="email"/>,在前端显示错误信息。

普通表单回显错误信息

  • handler中定义一个Map存放所有的错误信息,放入隐含模型并存入请求域中。
	@RequestMapping(value = "/emp", method = RequestMethod.POST)
	public String addEmp(@Valid Employee employee, BindingResult result, Model model) {
		System.out.println("要添加的员工" + employee);
		boolean hasErrors = result.hasErrors();
		HashMap<String, Object> errorsMap = new HashMap<String, Object>();// 定义一个Map来存放所有的错误信息
		if (hasErrors) {// 如果有错误
			List<FieldError> errors = result.getFieldErrors();// 获取所有的错误
			for (FieldError fieldError : errors) {
				errorsMap.put(fieldError.getField(), fieldError.getDefaultMessage());
			}
			model.addAttribute("errorInfo", errorsMap);
			return "add";
		} else {
			employDao.save(employee);
			// 返回列表页面,直接重定向到emps请求
			return "redirect:/emps";
		}
	}

JSP页面使用$的形式取出错误信息。

lastName:<form:input path="lastName" /> ${errorInfo.lastName }

在这里插入图片描述

三、自定义国际化错误消息的显示

hibernate旗下的校验注解已经完成了国际化,如果不是hibernate的注解会回显出内部错误信息,需要自定义国际化错误消息的。

  • 当使用SpringMVC标签显示错误消息时,SpringMVC会查看WEB上下文是否装配了对应的国际化消息,如果没有,则显示默认的错误消息,否则使用国际化消息。
  • 当一个属性校验失败后,校验框架会为该属性生成4个消息代码,这些代码以校验注解类名为前缀,结合ModelAttribute、属性名以及属性类型名,生成多个对应的消息代码。

1.编写国际化文件

配置文件中的key有四种写法

codes
[
	1.Email.employee.email,		(校验规则.隐含模型中对象的key.对象的属性):如果是隐含模型中employee对象的email属性字段发生了@Email校验错误,就会生成Email.employee.email
	2.Email.email,			(校验规则.属性名):所有的email属性只要发生了@Email错误
	3.Email.java.lang.String,			(校验规则.属性类型):只要是String类型发生了@Email错误
	4.Email			只要是发生了@Email校验错误
]

中英文国际化文件

  • 国际化文件的properties编码应使用ISO-8859-1,且前端使用form:errors的方式接收回显,
[errors_zh_CN.properties]:中文
Email.email=邮箱不合法!
NotEmpty=不能为空!
Length.java.lang.String=长度错误!
Path=必须是一个过去的时间!
typeMismatch.birth=生日错误!
------------------------------------
[errors_en_US.properties]:英文
Email.email=email incorrect!
NotEmpty=must not empty!
Length.java.lang.String=length incorrect!
Path=must a past time!
typeMismatch.birth=xxx!

2.SpringMVC中配置资源文件管理器

	<!-- 让SpringMVC管理国际化资源文件:配置一个资源文件管理器 -->
	<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="errors"></property>
	</bean>

在这里插入图片描述

四、message指定错误消息

实际上,一些小的公司并没有国家化的需求,在校验注解中直接添加message注解,就可以指定错误消息。

	@NotEmpty(message = "不能为空")
	@Length(min = 6, max = 16)
	private String lastName;
发布了456 篇原创文章 · 获赞 1472 · 访问量 50万+

猜你喜欢

转载自blog.csdn.net/weixin_43691058/article/details/105566285