springMVC数据校验 Day32 2018-12-22

springMVC数据校验

1. spring的validation校验

Spring校验框架在org.springframework.validation包中。

LocalValidatorFactoryBean即实现了Spring的validator接口,也实现了JSr 303validator接口。只需要在Spring容器中定义一个LocalValidatorFactoryBean,即可将其注入到需要数据校验的Bean中:


会默认装配好一个LocalValidatorFactoryBean,不需手动配置。

1.1 实现Spring的Validator接口

  • UserValidator.java
//实现Spring的Validator接口
@Repository("userValidator")
public class UserValidator implements Validator {
    
    // 该校验器能够对clazz类型的对象进行校验。
    @Override
    public boolean supports(Class clazz) {
        // User指定的 Class 参数所表示的类或接口是否相同,或是否是其超类或超接口
        return User.class.isAssignableFrom(clazz);
    }
    // 对目标类target进行校验,并将校验错误记录在errors当中
    @Override
    public void validate(Object target, Errors errors) {
        /**
        使用ValidationUtils中的一个静态方法rejectIfEmpty()来对loginname属性进行校验,
        假若'loginname'属性是 null 或者空字符串的话,就拒绝验证通过 。
        */
        ValidationUtils.rejectIfEmpty(errors, "loginName", null, "登录名不能为空");  
        ValidationUtils.rejectIfEmpty(errors, "password", null, "密码不能为空");  
        User user = (User)target;
        if(user.getLoginName().length() > 10){
            // 使用Errors的rejectValue方法验证
            errors.rejectValue("loginName", null, "用户名不能超过10个字符");
        }
        if(user.getPassword() != null 
                && !user.getPassword().equals("") 
                && user.getPassword().length() < 6){
            errors.rejectValue("password", null, "密码不能小于6位");
        }

    }

}

1.2 Controller层

  • UserController.java
@Controller(value="validatorUserController")
@RequestMapping(value="/validatorTest")
public class UserController {
    private static final Log logger = LogFactory.getLog(UserController.class);
     
    // 注入UserValidator对象
    @Autowired
    @Qualifier("userValidator")
    private UserValidator userValidator;
    
    @RequestMapping(value="/{formName}")
     public String loginForm(
             @PathVariable String formName,
             Model model){
        User user = new User();
        model.addAttribute("user",user);
        // 动态跳转页面
        return "validatorTest/"+formName;
    }
     
     @RequestMapping(value="/login",method=RequestMethod.POST)
     public String login(
             @ModelAttribute User user,
             Model model,
             Errors errors) {
         logger.info(user);
         model.addAttribute("user", user);
         // 调用userValidator的验证方法
         userValidator.validate(user, errors);
         // 如果验证不通过跳转到loginForm视图
         if(errors.hasErrors()){
             return "validatorTest/"+"loginForm";
         }
         return "validatorTest/"+"success";
     }
}

1.3 springmvc配置




1.4 jsp

1.4.1 loginForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix= "form" uri= "http://www.springframework.org/tags/form" %>




测试Validator接口验证


登录页面

登录名:
密码:
1.4.2 success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>




测试ConversionService


登录名:${requestScope.user.loginName }
登录名:${requestScope.user.password }

2. Hibernate Validator校验(JSR 303校验)

  • JSR 303校验定义的注解:
注解 功能
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
  • Hibernate Validator 附加的 constraint
注解 功能
@NotBlank(message =) 验证字符串非null,且被trim的长度必须大于0,对字符串会去掉前后空格
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空(NUL、EMPTY)。用于Array、Collection、Map、String
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
@URL 验证是否是合法的url
@CreditCardNumber 验证是否是合法的信用卡号码

2.1 引入jar包

  • pom.xml

        org.hibernate
        hibernate-validator
        5.3.5.Final
    

2.2 注解实体类

2.2.1 User.java(含错误信息)
public class User implements Serializable {
    @NotBlank(message="登录名不能为空")
    private String loginname;
    
    @NotBlank(message="密码不能为空")
    @Length(min=6,max=8,message="密码长度必须在6位到8位之间")
    private String password;
    
    @NotBlank(message="用户名不能为空")
    private String username;
    
    @Range(min=15, max=60,message="年龄必须在15到60岁之间")
    private int age;
    
    @Email(message="必须是合法的邮箱地址")
    private String email;
    
    @DateTimeFormat(pattern="yyyy-MM-dd")
    @Past(message="生日必须是一个过去的日期")
    private Date birthday;
    
    @Pattern(regexp="^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$",message="无效的电话号码")
    private String phone;
    //省略get/set方法
}
2.2.2User.java(错误信息存文件,国际化)
public class User implements Serializable {
    @NotBlank
    private String loginname;
    
    @NotBlank
    @Length(min=6,max=8)
    private String password;
    
    @NotBlank
    private String username;
    
    @Range(min=15, max=60)
    private int age;
    
    @Email
    private String email;
    
    @DateTimeFormat(pattern="yyyy-MM-dd")
    @Past
    private Date birthday;
    
    @Pattern(regexp="[1][3,8][3,6,9][0-9]{8}")
    private String phone;
    //省略get/set方法
}

2.3 Controller控制层

@Controller
@RequestMapping(value="/jsrValidatorTest")
public class HibernateValidatorController {
private static final Log logger = LogFactory.getLog(UserController.class);
    
    @RequestMapping(value="/{formName}")
     public String loginForm(
             @PathVariable String formName,
             Model model){
        User user = new User();
        model.addAttribute("user",user);
        // 动态跳转页面
        return "jsrValidatorTest/"+formName;
    }
     
    // 数据校验使用@Valid,后面跟着Errors对象保存校验信息
     @RequestMapping(value="/login",method=RequestMethod.POST)
     public String login(
             @Valid @ModelAttribute  User user,
             Errors  errors,
             Model model) {
         logger.info(user);
         if(errors.hasErrors()){
             return  "jsrValidatorTest/"+"registerForm";
         }
         model.addAttribute("user", user);
         return  "jsrValidatorTest/"+"success";
     }
}

2.4 springmvc配置

  • springmvc-config.xml



  
     
        
        
     

2.5 jsp

2.5.1 registerForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix= "form" uri= "http://www.springframework.org/tags/form" %>




测试JSR 303


注册页面

登录名:
密码:
用户名:
年龄:
邮箱:
生日:
电话:
2.5.2 success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>




测试JSR 303


测试JSR 303

登录名:${requestScope.user.loginname }
密码:${requestScope.user.password }
用户名:${requestScope.user.username }
年龄:${requestScope.user.age }
邮箱:${requestScope.user.email }
生日:
电话:${requestScope.user.phone }

你可能感兴趣的:(springMVC数据校验 Day32 2018-12-22)