简介
Maven依赖:
org.hibernate
hibernate-validator
4.3.2.Final
mvc-servlet.xml:
web.xml:
contextConfigLocation
classpath:spring.xml
org.springframework.web.context.ContextLoaderListener
后台验证的步骤:
1.Javabean中添加如上验证注解
2.action中使用@valid表示要验证的JavaBean, 再使用Errors或者BindingResult对象判断是否验证失败。
数据校验是基于bean的,也就是说校验的一般都是bean的字段,比如用户名、密码、邮箱、
手机号等等都可以是一个User类的字段,那么这些注解自然是加在bean的字段上,下面看个例子:
import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.Range;
public class User {
@NotEmpty(message = "请输入用户名")
private String userName;
@NotEmpty(message = "请输入密码")
private String password;
@Range(max = 100 , min = 1 , message = "年龄范围:1 ~ 100")
private int age;
@NotEmpty(message = "请输入二次确认密码")
private String rePassword;
@NotEmpty(message = "手机号码不能为空")
private String phone;
@Pattern(regexp = "\\w+(\\.\\w)*@\\w+(\\.\\w{2,3}){1,3}" , message = "非法邮箱格式")
private String email;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRePassword() {
return rePassword;
}
public void setRePassword(String rePassword) {
this.rePassword = rePassword;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [userName=" + userName + ", password=" + password
+ ", age=" + age + ", rePassword=" + rePassword + ", phone="
+ phone + ", email=" + email + "]";
}
}
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import cn.et.entity.User;
@Controller
public class UserController {
@RequestMapping(value="reg" , method = RequestMethod.POST)
public String userReg(@Valid User user , Errors errors){
if (errors.hasErrors()) { // 如果有一项验证失败,hasErrors就返回true
return "/fail.jsp";
}
return "/index.jsp";
}
}
上面提到的Errors类能够完成这个需求,或者BidingResult类也可以。
验证失败时,那些在注解中定义的错误信息,会自动保存到Errors或者BindingResult中,两者基本等价。
1.首先在action的参数列表中加个BindingResult类:
@RequestMapping(value="reg" , method = RequestMethod.POST)
public String userReg(@Valid User user , BindingResult errors){
if (errors.hasErrors()) {
return "/index.jsp";
}
return "/index.jsp";
}
2.在跳转的JSP中引入form标签库:
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
3.在需要输出错误信息的地方:
like this:
全都不合法的情况下:
注意:path属性的名字user并不等价于action方法中的@valid标识的变量名user,Spring
创建一个bean默认是以类名小写命名的。如果要在页面中使用自定义的bean名,可以这样:
注解校验只能做一些简单的最基本的校验,比如格式不合法、不能为空之类的,复杂一点的需要用逻辑实现的它就办不到了,比如用户名是否重复、手机号码是不是已被注册过、两次密码是否都相同等等,就需要用编程式校验实现,这个也很简单,看看下面这个你就知道该怎么做了:
@Controller
public class UserController {
@RequestMapping(value="reg" , method = RequestMethod.POST)
public String userReg(@Valid User userInfo , BindingResult errors){
if (errors.hasErrors()) {
// 两次密码不相符
if (!userInfo.getPassword().equals(userInfo.getRePassword())) {
errors.addError(new FieldError("userInfo", "rePassword", "两次密码输入不一致"));
}
}
return "/index.jsp";
}
}
然后在页面中故意输入不一致的密码后:
我们在addError方法中定义的错误消息就被带到JSP中了。这里还有个错误消息堆积的问题,意思就是不能为空、密码不一致两个错误都满足时,会有这样一种现象:
两条错误信息都会被带到页面上,这个需要自己来控制,比如一部分放到前端去校验、一部分后台校验,两者不会冲突就OK了。