您的位置:首页 > 编程语言 > Java开发

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包括:

注解功能说明
@Null注释元素必须为Null
@NotNull注释元素必须不为Null
@AssertTrue注释元素必须为True
@AssertFalse注释元素必须为false
@Min(value)注释元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)注释元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(Value)注释元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)注释元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max,min)注释元素大小必须在指定的范围内
@Digits(Integer,fraction)注释元素必须是一个数字,其值必须在可接受的范围内
@Past被注释的元素必须是一个过去的日期
@Future被注释的元素必须是一个将来的日期
Hiberate Validator还支持以下注解

注解功能说明
@Email被注解的元素必须是电子邮箱地址
@Length被注释的字符串大小必须在指定的范围内
@NotEmpty注释的字符串必须非空
@Range注释的元素必须在合适的范围内
1.1 加载依赖项:validator-apihiberate-validator

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可以实现更加个性化的校验,如校验身份证信息来判断是不是成年人。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mvc