- 云栖社区>
- 博客列表>
- 正文
SpringMVC使用@Valid注解进行数据验证
小黒糖 2018-01-15 13:14:47 浏览44 评论0java string Annotation form class void html springmvc view
摘要: 我们在做Form表单提交的时候,只在前端做数据校验是不够安全的,所以有时候我们需要在后端同样做数据的校验。好在SpringMVC在后台验证给我们提供了一个比较好的支持。那就是使用Valid接口的实现类做数据校验。在这之前我们先做一下准备的工作。
我们在做Form表单提交的时候,只在前端做数据校验是不够安全的,所以有时候我们需要在后端同样做数据的校验。好在SpringMVC在后台验证给我们提供了一个比较好的支持。那就是使用Valid接口的实现类做数据校验。在这之前我们先做一下准备的工作。
添加相关的Maven依赖
我们先把需要的jar包添加进来。[html] view plain copy
- <dependency>
- <groupId>javax.validation</groupId>
- <artifactId>validation-api</artifactId>
- <version>1.1.0.Final</version>
- </dependency>
- <dependency>
- <groupId>org.apache.bval</groupId>
- <artifactId>bval-jsr303</artifactId>
- <version>0.5</version>
- </dependency>
实现Validator接口
接下来的第一 步我们需要写一个类来实现Validator接口。在这个类里我们需要定义它支持校验的JavaBean,实现validate方法,用来进行相关的校验。具体的实现类如下:[java] view plain copy
- package com.zkn.learnspringmvc.validtor;
- import com.zkn.learnspringmvc.scope.PersonScope;
- import org.springframework.util.StringUtils;
- import org.springframework.validation.Errors;
- import org.springframework.validation.ValidationUtils;
- import org.springframework.validation.Validator;
- /**
- * Created by wb-zhangkenan on 2016/9/2.
- */
- public class PersonalValidtor implements Validator{
- /**
- * 判断支持的JavaBean类型
- * @param aClass
- * @return
- */
- @Override
- public boolean supports(Class<?> aClass) {
- return PersonScope.class.equals(aClass);
- }
- /**
- * 实现Validator中的validate接口
- * @param obj
- * @param errors
- */
- @Override
- public void validate(Object obj, Errors errors) {
- //把校验信息注册到Error的实现类里
- ValidationUtils.rejectIfEmpty(errors,"name ",null,"姓名不能为空! ");
- PersonScope personScope = (PersonScope) obj;
- if(StringUtils.isEmpty(personScope.getAddress())){
- errors.rejectValue("address ",null,"家庭地址不能为空!!!! ");
- }
- }
- }
使用Validtor的校验实现类
我们需要在Controller的类里使用刚才写的Validtor的校验实现类来进行表单数据的校验。我们需要在Controller里用@InitBinder注解把刚才的校验类绑定到WebDataBinder类里。写法如下:[java] view plain copy
- //绑定PersonalValidator
- @InitBinder
- public void initBinder(WebDataBinder webDataBinder){
- webDataBinder.addValidators(new PersonalValidtor());
- }
接下来我们需要在@RequestMapping这个注解所在的方法上使用@Valid注解进行数据的校验。
[java] view plain copy
- @RequestMapping(value = "testPersonalValidtor.do ")
- @ResponseBody
- //直接返回对象
- public Object testPersonalValidtor(@Valid PersonScope personScope, BindingResult bindingResult){
- if(bindingResult.hasErrors()){
- StringBuffer sb = new StringBuffer();
- for(ObjectError objectError : bindingResult.getAllErrors()){
- sb.append(((FieldError)objectError).getField() +" : ").append(objectError.getDefaultMessage());
- }
- return sb.toString();
- }else{
- return personScope;
- }
- }
[java] view plain copy
- package com.zkn.learnspringmvc.news.controller;
- import com.alibaba.fastjson.JSON;
- import com.zkn.learnspringmvc.scope.PersonScope;
- import com.zkn.learnspringmvc.validtor.PersonalValidtor;
- import org.springframework.stereotype.Controller;
- import org.springframework.validation.BindingResult;
- import org.springframework.validation.FieldError;
- import org.springframework.validation.ObjectError;
- import org.springframework.web.bind.WebDataBinder;
- import org.springframework.web.bind.annotation.InitBinder;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.ResponseBody;
- import javax.servlet.http.HttpServletResponse;
- import javax.validation.Valid;
- /**
- * 用来测试PersonalValidator的控制器
- * Created by wb-zhangkenan on 2016/9/2.
- */
- @Controller
- public class TestPersonlalValidtorController {
- //绑定PersonalValidator
- @InitBinder
- public void initBinder(WebDataBinder webDataBinder){
- webDataBinder.addValidators(new PersonalValidtor());
- }
- @RequestMapping(value = "testPersonalValidtor.do ")
- @ResponseBody
- //直接返回对象
- public Object testPersonalValidtor(@Valid PersonScope personScope, BindingResult bindingResult){
- if(bindingResult.hasErrors()){
- StringBuffer sb = new StringBuffer();
- for(ObjectError objectError : bindingResult.getAllErrors()){
- sb.append(((FieldError)objectError).getField() +" : ").append(objectError.getDefaultMessage());
- }
- return sb.toString();
- }else{
- return personScope;
- }
- }
- }
PersonScope实体类:
[java] view plain copy
- package com.zkn.learnspringmvc.scope;
- import java.io.Serializable;
- /**
- * Person对象
- * @author zkn
- *
- */
- public class PersonScope implements Serializable{
- /**
- * 序列
- */
- private static final long serialVersionUID = 1L;
- /**
- * 姓名
- */
- private String name;
- /**
- * 年龄
- */
- private Integer age;
- /**
- * 家庭地址
- */
- private String address;
- private StudentScope studentScope;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Integer getAge() {
- return age;
- }
- public void setAge(Integer age) {
- this.age = age;
- }
- @Override
- public String toString() {
- return "PersonDomain [name=" + name + ", age=" + age + "] ";
- }
- public StudentScope getStudentScope() {
- return studentScope;
- }
- public void setStudentScope(StudentScope studentScope) {
- this.studentScope = studentScope;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- }
[html] view plain copy
- <mvc:annotation-driven validator="personalValidtor ">
[html] view plain copy
- <bean id="personalValidtor " class="com.zkn.learnspringmvc.validtor.PersonalValidtor "/>
使用<form:errors />标签
上面的错误信息的展示是我们自己来展示的错误信息,但是SpringMVC还给我们提供了一个<form:errors />标签来展示错误信息。例子如下:[java] view plain copy
- @RequestMapping(value = "testPersonalValidtor02.do ")
- public Object testPersonalValidtor01(@Valid PersonScope personScope, BindingResult bindingResult){
- if(bindingResult.hasErrors()){
- return "error ";
- }else{
- return "home ";
- }
- }
jsp页面内容如下:
[html] view plain copy
- <%@taglib prefix="form " uri="http://www.springframework.org/tags/form " %>
- <%@page pageEncoding="utf-8 " contentType="text/html;utf-8 "%>
- <form:errors path="personScope.name "/>
用云栖社区APP,舒服~
【云栖快讯】中办国办印发《推进互联网协议第六版(IPv6)规模部署行动计划》加快推进基于 IPv6 的下一代互联网规模部署,计划指出2025年末中国 IPv6 规模要达到世界第一,阿里云也第一时间宣布了将全面提供IPv6服务,那么在全面部署 IPV6 前,你需要了解都在这儿 详情请点击 评论文章 (0) (0)相关文章
- SpringMVC使用@Valid注解进行数据验证
- SpringMVC之使用Validator接口进行验证
- hibernate validator 专题
- @Valid springMVC bean校验不起作用及…
- SpringMVC 使用JSR-303进行校验 @Val…
- 史上最强Spring mvc入门
- Spring MVC配置介绍
- Spring4新特性——集成Bean Validatio…
- Spring MVC配置介绍
- 最全SpringMVC具体演示样例实战教程