一、数据校验
数据校验只做前端校验是不安全的,需要在重要的数据的加上后端校验。我们可以写一段程序将每一个数据取出并进行校验,除此之外SpringMVC可以使用JSR303
来做数据校验。
JSR303是Java为Bean数据合法性校验提供的标准框架,它可以通过在Bean属性上标注注解来指定校验规则,并通过标准的验证接口对Bean进行验证。
给Employee
类的属性添加校验注解
public class Employee {
private Integer id;
@NotEmpty
@Length(min = 6, max = 18)
private String lastName;
@Email
private String email;
//1 male, 0 female
private Integer gender;
private Integer departmentId;
@Past //校验必须是一个过去的时间
//@Future //必须是一个未来的时间
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birth;
@NumberFormat(pattern = "#,###,###.####")
private Double salary;
}
使用@Valid
在SpringMVC封装对象的时候,告诉SpringMVC这个JavaBean需要校验。还需要给校验的JavaBean后面紧跟一个BindingResult
,这个BindingResult
就是封装前一个bean的校验结果。然后可以根据不同的校验结果决定如何操作
@RequestMapping(value = "/emp",method = RequestMethod.POST)
public String addEmp(@Valid Employee employee, BindingResult result){
System.out.println("要添加的员工信息:" + employee);
boolean hasErrors = result.hasErrors();
if (hasErrors){
System.out.println("有校验错误!");
return "add";
}else {
employeeService.save(employee);
return "redirect:/emps";
}
}
二、请求域中存放校验信息
@RequestMapping(value = "/emp",method = RequestMethod.POST)
public String addEmp(@Valid Employee employee, BindingResult result, Model model){
System.out.println("要添加的员工信息:" + employee);
boolean hasErrors = result.hasErrors();
Map<String, Object> errorsMap = new HashMap<String,Object>();
if (hasErrors){
System.out.println("有校验错误!");
//获取所有字段的错误信息
List<FieldError> fieldErrors = result.getFieldErrors();
for (FieldError fieldError : fieldErrors){
System.out.println("错误的消息提示:" + fieldError.getDefaultMessage());
System.out.println("错误的字段是:" + fieldError.getField());
System.out.println(fieldError);
System.out.println("--------------------------------------");
errorsMap.put(fieldError.getField(),fieldError.getDefaultMessage());
}
model.addAttribute("errorsInfo",errorsMap);
return "add";
}else {
employeeService.save(employee);
return "redirect:/emps";
}
}
在页面取出请求域中保存的错误信息
${errorsInfo.lastName}
三、自定义国际化错误消息的显示
每一个字段发生错误以后,都会有自己的错误代码,国际化配置文件中错误信息的key
必须对应一个错误代码codes
例如邮箱校验出错:
codes
[
Email.employee.email, //校验规则.隐含模型中这个对象的key.对象的属性
Email.email, //校验规则.属性名
Email.java.lang.String //校验规则.属性类型
Email //校验规则
]
- 如果是隐含模型中
employee
对象的email
属性字段发生了@Email
校验错误,就会生成Email.employee.email
- 所有的
email
属性只要发生了@Email
错误,就会生成Eamil.email
- 只要是
String
类型发生了@Email
错误,就会生成Email.java.String
- 只要发生了
@Email
校验错误,就会生成Email
编写国际化配置文件
errors_zh_CN.properties
Eamil.email = 邮箱格式错误!
NotEmpty = 不能为空!
Length.java.lang.String = 长度有误!
Past=必须是过去的时间!
errors_en_US.properties
Eamil.email = email incorrect!
NotEmpty = must not empty!
Length.java.lang.String = length incorrect!
Past=must a past time !
让SpringMVC管理国际化配置文件
<!--管理国际化配置文件-->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="errors"></property>
<!--配置文件使用UTF-8编码,否则页面会显示中文乱码-->
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
还可以直接使用message
指定错误消息
@NotEmpty(message = "不能为空!")
@Length(min = 6, max = 18)
private String lastName;