文章目录
一、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;