SpringMVC使用@Valid注解进行数据验证的方法
我们在做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
结果:
请求:http://localhost:8081/testpersonalvalidtor.do?name=张三&address=三元桥
结果:
具体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" %>
效果如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: ASP.NET性能优化小结(ASP.NET&C#)
下一篇: php中的抽象方法和抽象类