数据的验证非常重要且具有意义, js的验证是非安全的(可跳过), 而Spring-Validation 是一定会执行的服务器端验证, 这样能够保证数据的有效安全。如何使用让我们来看下所需步骤:
首先是基于Java代码方式实现,后续有注解方式实现,只需做简单改动,非常方便
1,自己写一个验证器
2,数据绑定(指定哪个控制器使用自己写的哪个验证器)
3,在需要验证的那个控制器的相应方法中,设置不同验证结果对应页面上的响应。
ps: 这些都可以跟着官方文档学习,更新快、可靠、全面
具体实现:
1,自己建一个用户验证器(UserValidation),要继承Validation:
package com.xintouyun.ssh.validator;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import com.xintouyun.ssh.entity.User;
//User验证器
public class UserValidator implements Validator{
@Override
public boolean supports(Class<?> clazz) { //验证的类为User
return User.class.equals(clazz);
}
// 1 @NotNull:不能为null,但可以为empty,没有Size的约束
// 2 @NotEmpty :不能为null,且Size>0
// 3 @NotBlank:只用于String,不能为null且trim()之后size>0
@Override
public void validate(Object target, Errors errors) {
User user = (User)target;
//ValidationUtils.rejectIfEmpty(errors, "uname", null, "账号必须填写");
if(user.getUname()==null) { //没有参数传进来才为null,
errors.rejectValue("uname", null, "账号必须填写");
}else if(user.getUname().trim().isEmpty()){
errors.rejectValue("uname", null, "账号不能为空白");
}else if(user.getUname().trim().length()<4){
errors.rejectValue("uname", null, "账号至少为四位");
}
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "upass", null, "密码必须填写且不能空白");
}
}
2,数据绑定,现在需要把UserController控制器中的一些方法验证, 需要指定这个控制器使用自己写的那个验证器:
@InitBinder //这个注解会让UserValidator验证器 先自动执行
protected void UserinitBinder(WebDataBinder binder) {
binder.addValidators(new UserValidator()); //使用自己写的UserValidator验证器
}
3,在需要验证的那个控制器的相应方法中,设置不同验证结果对应页面上的响应。
// User 控制器
@Controller
@RequestMapping("/user")
public class UserController {
@InitBinder //这个注解会让UserValidator验证器 先自动执行
protected void UserinitBinder(WebDataBinder binder) {
binder.addValidators(new UserValidator()); //使用自己写的UserValidator验证器
}
@GetMapping("/signup")
public String tosignup() {
return "signup";
}
@PostMapping("/signup")
//@RequestMapping("/signup")
//现在使用注解,要用@Validated指定的是User类中的属性参数, 用BindingResult获取错误
public String signup(@Validated User user,BindingResult result,Model m) {
if(result.hasErrors()) { //如果有错误
List<ObjectError> errors = result.getAllErrors();
Map<String,String> errorMessages = new HashMap<>();
for(ObjectError oe: errors) {
if(oe instanceof FieldError) {
//如果错误属于字段名错误,将字段名和错误提示信息存到map集合中
FieldError fe = (FieldError)oe;
String fieldName = fe.getObjectName();
String fieldMessage = fe.getDefaultMessage();
errorMessages.put(fieldName, fieldMessage);
}
} //将map集合放于model中, 发送到jsp页面用El,jstl就可以显示出来
m.addAttribute("errorMessages", errorMessages);
return "signup";
}
System.out.println("username="+user.getUname());
return "redirect:signin";
}
@GetMapping("signin")
public String tosignin() {
return "signin";
}
@PostMapping("signin")
public String signin() {
return "signin";
}
}