SpringMVC使用@Valid注解进行数据验证

我们在做Form表单提交的时候,只在前端做数据校验是不够安全的,所以有时候我们需要在后端同样做数据的校验。好在SpringMVC在后台验证给我们提供了一个比较好的支持。那就是使用Valid接口的实现类做数据校验。在这之前我们先做一下准备的工作。

添加相关的Maven依赖

我们先把需要的jar包添加进来。
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <dependency>  
  2.     <groupId>javax.validation</groupId>  
  3.     <artifactId>validation-api</artifactId>  
  4.     <version>1.1.0.Final</version>  
  5. </dependency>  
  6. <dependency>  
  7.     <groupId>org.apache.bval</groupId>  
  8.     <artifactId>bval-jsr303</artifactId>  
  9.     <version>0.5</version>  
  10. </dependency>  

实现Validator接口

接下来的第一 步我们需要写一个类来实现Validator接口。在这个类里我们需要定义它支持校验的JavaBean,实现validate方法,用来进行相关的校验。具体的实现类如下:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.zkn.learnspringmvc.validtor;  
  2.   
  3. import com.zkn.learnspringmvc.scope.PersonScope;  
  4. import org.springframework.util.StringUtils;  
  5. import org.springframework.validation.Errors;  
  6. import org.springframework.validation.ValidationUtils;  
  7. import org.springframework.validation.Validator;  
  8.   
  9. /** 
  10.  * Created by wb-zhangkenan on 2016/9/2. 
  11.  */  
  12. public class PersonalValidtor implements Validator{  
  13.   
  14.     /** 
  15.      * 判断支持的JavaBean类型 
  16.      * @param aClass 
  17.      * @return 
  18.      */  
  19.     @Override  
  20.     public boolean supports(Class<?> aClass) {  
  21.         return PersonScope.class.equals(aClass);  
  22.     }  
  23.   
  24.     /** 
  25.      * 实现Validator中的validate接口 
  26.      * @param obj 
  27.      * @param errors 
  28.      */  
  29.     @Override  
  30.     public void validate(Object obj, Errors errors) {  
  31.         //把校验信息注册到Error的实现类里  
  32.         ValidationUtils.rejectIfEmpty(errors,"name",null,"姓名不能为空!");  
  33.         PersonScope personScope = (PersonScope) obj;  
  34.         if(StringUtils.isEmpty(personScope.getAddress())){  
  35.             errors.rejectValue("address",null,"家庭地址不能为空!!!!");  
  36.         }  
  37.     }  
  38. }  

使用Validtor的校验实现类

我们需要在Controller的类里使用刚才写的Validtor的校验实现类来进行表单数据的校验。我们需要在Controller里用@InitBinder注解把刚才的校验类绑定到WebDataBinder类里。写法如下:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //绑定PersonalValidator  
  2. @InitBinder  
  3. public void initBinder(WebDataBinder webDataBinder){  
  4.     webDataBinder.addValidators(new PersonalValidtor());  
  5. }  
接下来我们需要在@RequestMapping这个注解所在的方法上使用@Valid注解进行数据的校验。
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @RequestMapping(value = "testPersonalValidtor.do")  
  2. @ResponseBody  
  3. //直接返回对象  
  4. public Object testPersonalValidtor(@Valid PersonScope personScope, BindingResult bindingResult){  
  5.     if(bindingResult.hasErrors()){  
  6.         StringBuffer sb = new StringBuffer();  
  7.         for(ObjectError objectError : bindingResult.getAllErrors()){  
  8.             sb.append(((FieldError)objectError).getField() +" : ").append(objectError.getDefaultMessage());  
  9.         }  
  10.         return sb.toString();  
  11.     }else{  
  12.         return personScope;  
  13.     }  
  14. }  
接下来我们来看一下效果:
请求:http://localhost:8081/testPersonalValidtor.do
结果:

请求:http://localhost:8081/testPersonalValidtor.do?name=张三&address=三元桥
结果:
具体Controller类代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.zkn.learnspringmvc.news.controller;  
  2.   
  3. import com.alibaba.fastjson.JSON;  
  4. import com.zkn.learnspringmvc.scope.PersonScope;  
  5. import com.zkn.learnspringmvc.validtor.PersonalValidtor;  
  6. import org.springframework.stereotype.Controller;  
  7. import org.springframework.validation.BindingResult;  
  8. import org.springframework.validation.FieldError;  
  9. import org.springframework.validation.ObjectError;  
  10. import org.springframework.web.bind.WebDataBinder;  
  11. import org.springframework.web.bind.annotation.InitBinder;  
  12. import org.springframework.web.bind.annotation.RequestMapping;  
  13. import org.springframework.web.bind.annotation.RequestMethod;  
  14. import org.springframework.web.bind.annotation.ResponseBody;  
  15.   
  16. import javax.servlet.http.HttpServletResponse;  
  17. import javax.validation.Valid;  
  18.   
  19. /** 
  20.  * 用来测试PersonalValidator的控制器 
  21.  * Created by wb-zhangkenan on 2016/9/2. 
  22.  */  
  23. @Controller  
  24. public class TestPersonlalValidtorController {  
  25.   
  26.     //绑定PersonalValidator  
  27.     @InitBinder  
  28.     public void initBinder(WebDataBinder webDataBinder){  
  29.         webDataBinder.addValidators(new PersonalValidtor());  
  30.     }  
  31.   
  32.     @RequestMapping(value = "testPersonalValidtor.do")  
  33.     @ResponseBody  
  34.     //直接返回对象  
  35.     public Object testPersonalValidtor(@Valid PersonScope personScope, BindingResult bindingResult){  
  36.         if(bindingResult.hasErrors()){  
  37.             StringBuffer sb = new StringBuffer();  
  38.             for(ObjectError objectError : bindingResult.getAllErrors()){  
  39.                 sb.append(((FieldError)objectError).getField() +" : ").append(objectError.getDefaultMessage());  
  40.             }  
  41.             return sb.toString();  
  42.         }else{  
  43.             return personScope;  
  44.         }  
  45.     }  
  46. }  
PersonScope实体类:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.zkn.learnspringmvc.scope;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. /** 
  6.  * Person对象 
  7.  * @author zkn 
  8.  * 
  9.  */  
  10.   
  11. public class PersonScope implements Serializable{  
  12.   
  13.     /** 
  14.      * 序列 
  15.      */  
  16.     private static final long serialVersionUID = 1L;  
  17.     /** 
  18.      * 姓名 
  19.      */  
  20.     private String name;  
  21.     /** 
  22.      * 年龄 
  23.      */  
  24.     private Integer age;  
  25.     /** 
  26.      * 家庭地址 
  27.      */  
  28.     private String address;  
  29.   
  30.     private StudentScope studentScope;  
  31.   
  32.     public String getName() {  
  33.         return name;  
  34.     }  
  35.       
  36.     public void setName(String name) {  
  37.         this.name = name;  
  38.     }  
  39.       
  40.     public Integer getAge() {  
  41.         return age;  
  42.     }  
  43.       
  44.     public void setAge(Integer age) {  
  45.         this.age = age;  
  46.     }  
  47.   
  48.     @Override  
  49.     public String toString() {  
  50.         return "PersonDomain [name=" + name + ", age=" + age + "]";  
  51.     }  
  52.   
  53.     public StudentScope getStudentScope() {  
  54.         return studentScope;  
  55.     }  
  56.   
  57.     public void setStudentScope(StudentScope studentScope) {  
  58.         this.studentScope = studentScope;  
  59.     }  
  60.   
  61.     public String getAddress() {  
  62.         return address;  
  63.     }  
  64.   
  65.     public void setAddress(String address) {  
  66.         this.address = address;  
  67.     }  
  68. }  
这里需要注意的是:@Valid要紧挨着JavaBean(即PersonScope),要不然不会生效的。
另外需要注意的是:这里的校验是哪个请求需要校验,就写在哪个请求上。如果需要配置全局的校验的话,可以在 <mvc:annotation-driven/>中配置validator。写法如下:
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <mvc:annotation-driven validator="personalValidtor">  
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <bean id="personalValidtor" class="com.zkn.learnspringmvc.validtor.PersonalValidtor"/>  

使用<form:errors />标签

上面的错误信息的展示是我们自己来展示的错误信息,但是SpringMVC还给我们提供了一个<form:errors />标签来展示错误信息。例子如下:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @RequestMapping(value = "testPersonalValidtor02.do")  
  2. public Object testPersonalValidtor01(@Valid PersonScope personScope, BindingResult bindingResult){  
  3.     if(bindingResult.hasErrors()){  
  4.         return "error";  
  5.     }else{  
  6.         return "home";  
  7.     }  
  8. }  
jsp页面内容如下:
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>  
  2. <%@page pageEncoding="utf-8" contentType="text/html;utf-8"%>  
  3.   
  4. <form:errors path="personScope.name"/>  
注意:<form:errors />标签是SpringMVC提供的,所以我们得引入这个标签库。<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
效果如下:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值