1.数据校验:
对于一些很重要的数据,如果只是做前端校验是不安全的,必须要加上后端的校验。
在后端的校验方法:
1.可以写程序将每一个数据取出进行校验,如果失败直接来到添加页面,提示重新填写。(不推荐)
2.SpringMVC:可以JSR-303(Java Specification Requests的第303条规范)来做数据校验
JSR303:规范 ------- 实现:Hibernate Validator(第三方校验框架)
3.如何快速的进行后端校验:
1)、导入校验框架的jar包:
hibernate-validator-6.0.16.Final.jar
hibernate-validator-annotation-processor-6.0.16.Final.jar
validation-api-2.0.1.Final.jar
jboss-logging-3.3.2.Final.jar
classmate-1.3.4.jar
2)、给JavaBean的属性添加上校验注解
3)、在SpringMVC封装对象的时候,告诉SpringMVC这个JavaBean需要校验
4)、如何知道校验结果
给需要校验的JavaBean后面紧跟一个BindingResult,BindingResult是封装前一个JavaBean的校验结果。
注意:BindingResult必须紧跟在需要校验的JavaBean后面。
5)、根据校验结果来决定怎么办。
代码实现:
Controller的添加员工方法
/**
* 保存员工
*
* @param employee
* @return
*/
@RequestMapping(value = "/emp",method = RequestMethod.POST)
public String addEmpl(@Valid Employee employee, BindingResult result) {
System.out.println(employee);
if (result.hasErrors()) {
return "add";
} else {
employeeservice.addEmpl(employee);
return "redirect:/emps";
}
}
Employee类
package cn.it.bean;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import org.hibernate.validator.constraints.Length;
public class Employee {
private Integer id;
/**
* @NotEmpty:不能为空
*
* @Length(min = 5, max = 18):字符串长度最大最小值
*/
@NotEmpty
@Length(min = 5, max = 18)
private String lastName;
@Email
private String email;
private Integer gender;
private Integer departmentid;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public Integer getDepartmentid() {
return departmentid;
}
public void setDepartmentid(Integer departmentid) {
this.departmentid = departmentid;
}
@Override
public String toString() {
return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender
+ ", departmentid=" + departmentid + "]";
}
public Employee(Integer id, String lastName, String email, Integer gender, Integer departmentid) {
super();
this.id = id;
this.lastName = lastName;
this.email = email;
this.gender = gender;
this.departmentid = departmentid;
}
public Employee() {
super();
// TODO Auto-generated constructor stub
}
}
结果
后台打印
2.自定义国际化错误消息
1.编写自己的国际化文件
errors_zh_CN.prpoerties
errors_en_US.properties
类容key=value,这个key有要求:
每一个字段发生错误后,都会有一个错误代码,所有国际化文件中的错误消息的key必须对应一个错误代码
以@Email举例,有四种错误代码
codes
[
Email.employee.email---------解释:校验规则.隐含模型中对象的key.对象的属性
Email.email-----------------------解释:校验规则.属性
Email.java.lang.String---------解释:校验规则.属性类型
Email-------------------------------解释:校验规则
]
1.Email.employee.email:隐含模型中的employee对象的email属性发生了@Email校验错误,就会生成Email.employee.email错误代码。
2.Email.email:只要是email属性发生了@Email校验错误,就会生成Email.email错误代码。
3.Email.java.lang.String:只要是String类型发生了@Email校验错误,就会生成Email.java.lang.String错误代码。
4.Email:只要发生了@Email校验错误,就会生成Email错误代码。
errors_zh_CN.prpoerties
errors_en_US.properties
小细节:如果一个资源文件中出现2个能同时匹配到的key,那么精确的优先。
2.让SpringMVC管理国际化资源文件
<!-- 让springmvc管理国际化资源文件
配置一个资源文件管理器 ResourceBundleMessageSource
id="messageSource"必须是messageSource
-->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- basename:指定基础名 -->
<property name="basename" value="errors"></property>
</bean>
3.来到页面取值
中文:
英文:
4.高级国际化
动态获取消息参数:
{0}永远都是当前的属性名
{1}、{2}...才是参数(不是按参数写的顺序,而是按参数名的字母的顺序)