欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-06 09:32:07
我们在做form表单提交的时候,只在前端做数据校验是不够安全的,所以有时候我们需要在后端同样做数据的校验。好在springmvc在后台验证给我们提供了一个比较好的支持。那就...

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

添加相关的maven依赖

我们先把需要的jar包添加进来。

<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方法,用来进行相关的校验。具体的实现类如下:

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类里。写法如下:

//绑定personalvalidator 
@initbinder 
public void initbinder(webdatabinder webdatabinder){ 
  webdatabinder.addvalidators(new personalvalidtor()); 
} 

接下来我们需要在@requestmapping这个注解所在的方法上使用@valid注解进行数据的校验。

@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; 
  } 
} 

接下来我们来看一下效果:

请求:http://localhost:8081/testpersonalvalidtor.do

结果:

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

请求:http://localhost:8081/testpersonalvalidtor.do?name=张三&address=三元桥

结果:

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

具体controller类代码如下:

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实体类:

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; 
  } 
} 

这里需要注意的是:@valid要紧挨着javabean(即personscope),要不然不会生效的。

另外需要注意的是:这里的校验是哪个请求需要校验,就写在哪个请求上。如果需要配置全局的校验的话,可以在<mvc:annotation-driven/>中配置validator。写法如下:

<mvc:annotation-driven validator="personalvalidtor"> 

<bean id="personalvalidtor" class="com.zkn.learnspringmvc.validtor.personalvalidtor"/> 

使用<form:errors />标签

上面的错误信息的展示是我们自己来展示的错误信息,但是springmvc还给我们提供了一个<form:errors />标签来展示错误信息。例子如下:

@requestmapping(value = "testpersonalvalidtor02.do") 
public object testpersonalvalidtor01(@valid personscope personscope, bindingresult bindingresult){ 
  if(bindingresult.haserrors()){ 
    return "error"; 
  }else{ 
    return "home"; 
  } 
} 

jsp页面内容如下:

<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
<%@page pageencoding="utf-8" contenttype="text/html;utf-8"%> 
 
<form:errors path="personscope.name"/> 

注意:<form:errors />标签是springmvc提供的,所以我们得引入这个标签库

<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

效果如下:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。