SpringMVC数据校验
2018-01-17 14:25
330 查看
应用程序在执行业务逻辑前,必须通过数据校验保证接受到的输入数据是正确合法的。SpringMVC有两种数据校验方式:实现Validator接口和JSR-303。
1. JSR-303
JSR-303是java为Bean数据合法性校验所提供的标注框架,它已经包含在JavaEE。JSR-303通过Bean属性上标注类似@NotNull等标准的注解制定校验规则,并通过标准的校验接口对Bean进行校验。JSR-303包括:
Hiberate Validator还支持以下注解
1.1 加载依赖项:validator-api和hiberate-validator
1.2 编写Spring配置文件
1.3 编写JavaBean
1.4 Controller控制器中校验数据
1.5 在页面中获取校验结果
Validator接口
2.1 实现Validator接口
2.2 Controller方法
方法一:在控制器内构造Validator
方法二:将Validator传到WebDataBinder,使该验证器作用于Controller类中所有处理请求的方法
总结:使用JSR-303很方便,不用自己编写实现类,只用做好相应的配置就行(包括jar包,spring配置文件)。使用Validator可以实现更加个性化的校验,如校验身份证信息来判断是不是成年人。
1. JSR-303
JSR-303是java为Bean数据合法性校验所提供的标注框架,它已经包含在JavaEE。JSR-303通过Bean属性上标注类似@NotNull等标准的注解制定校验规则,并通过标准的校验接口对Bean进行校验。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 | 被注释的元素必须是一个将来的日期 |
注解 | 功能说明 |
被注解的元素必须是电子邮箱地址 | |
@Length | 被注释的字符串大小必须在指定的范围内 |
@NotEmpty | 注释的字符串必须非空 |
@Range | 注释的元素必须在合适的范围内 |
1.2 编写Spring配置文件
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <!--只有一个时可以省略 <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property> --> </bean>
1.3 编写JavaBean
public class User { @Pattern(regexp="w{4,30}",message = "用户名必须在4-30之间")//正则表达式 private String userName; @Pattern(regexp = "S{6,30}",message = "密码必须在6-30之间") private String password; @Max(value = 100,message = "年龄必须小于100") @Min(value = 18,message = "年龄必须大于18") private int age; @Past(message="生日必须小于当前日期") private LocalDate birthday; /*Getter and Setter*/ }
1.4 Controller控制器中校验数据
@RequestMapping(value="/testHiberateValidator") public String handle50(@Valid @ModelAttribute User user, BindingResult bindingResult,Model model){//@Valid注解对user进行校验,并将校验结果保存在bindingResult中,@Valid后面必须紧跟indingResult/Errors类型,中间没有其他参数,它们总是成对出现。 System.out.println(user); if(bindingResult.hasErrors()){ List<ObjectError> errors=bindingResult.getAllErrors(); model.addAttribute("errors",errors); model.addAttribute("user",user); return "forward:/welcome.jsp"; }else{ return "index"; } }
1.5 在页面中获取校验结果
<c:forEach items="${errors}" var="error"> ${error.defaultMessage}<br/> </c:forEach>
Validator接口
public interface Validator{//org.springframework.validation.Validator boolean supports(Class<?> clazz); void validate(Object target,Errors errors); }
2.1 实现Validator接口
public class UserValidator implements Validator{ public boolean supports(Class<?> clazz) { return User.class.isAssignableFrom(clazz); } public void validate(Object target, Errors errors) { User user=(User)target; ValidationUtils.rejectIfEmpty(errors,"userName","用户名不能为空"); if(user.getUserName().length()<4 || user.getUserName().length()>30){ errors.rejectValue("userName",null,null,"用户名长度必须在4-30之间"); } } }
2.2 Controller方法
方法一:在控制器内构造Validator
@RequestMapping(value="/testHiberateValidator") public String handle50(@ModelAttribute User user, BindingResult bindingResult,Model model){ Use ac0b rValidator validator=new UserValidator(); validator.validate(user,bindingResult); if(bindingResult.hasErrors()){ List<ObjectError> errors=bindingResult.getAllErrors(); model.addAttribute("errors",errors); model.addAttribute("user",user); return "forward:/welcome.jsp"; }else{ return "index"; } }
方法二:将Validator传到WebDataBinder,使该验证器作用于Controller类中所有处理请求的方法
@InitBinder public void initBinder(DataBinder dataBinder){ dataBinder.replaceValidators(new UserValidator()); } @RequestMapping(value="/handle51") public String handle51(@Valid @ModelAttribute User user, BindingResult bindingResult, Model model){ if(bindingResult.hasErrors()){ List<FieldError> errors=bindingResult.getFieldErrors(); model.addAttribute("errors",errors);//验证信息只能返回一个Error集合,不能返回一个Error。 return "forward:/welcome.jsp"; }else{ return "index"; } }
总结:使用JSR-303很方便,不用自己编写实现类,只用做好相应的配置就行(包括jar包,spring配置文件)。使用Validator可以实现更加个性化的校验,如校验身份证信息来判断是不是成年人。
相关文章推荐
- SpringMVC 数据的格式化、JSR 303数据校验和国际化
- 《Java从入门到放弃》框架入门篇:springMVC数据校验
- springMVC入门--3.数据校验
- springmvc-JSR303数据校验
- 5、springMVC的校验和数据回显
- 【知识整理】SpringMVC-JSR 303数据校验
- SpringMvc的简单入门(二)之数据校验
- SpringMVC 数据的格式化、JSR 303数据校验和国际化
- SpringMVC学习(七)-JSR303数据校验
- SpringMVC数据校验
- 5、springMVC的校验和数据回显
- SpringMVC数据校验
- SpringMVC中的数据校验
- 如何使用SpringMVC进行数据校验
- springmvc JSR303 Validate 注解式,校验数据
- SpringMvc之数据校验
- SPRINGMVC数据校验
- 5、springMVC的校验和数据回显
- 5、springMVC的校验和数据回显
- SpringMVC——类型转换和格式化、数据校验、客户端显示错误消息