SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗證的方法
我們在做Form表單提交的時候,只在前端做數(shù)據(jù)校驗是不夠安全的,所以有時候我們需要在后端同樣做數(shù)據(jù)的校驗。好在SpringMVC在后臺驗證給我們提供了一個比較好的支持。那就是使用Valid接口的實現(xiàn)類做數(shù)據(jù)校驗。在這之前我們先做一下準(zhǔn)備的工作。
添加相關(guān)的Maven依賴
我們先把需要的jar包添加進(jìn)來。
<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>
實現(xiàn)Validator接口
接下來的第一 步我們需要寫一個類來實現(xiàn)Validator接口。在這個類里我們需要定義它支持校驗的JavaBean,實現(xiàn)validate方法,用來進(jìn)行相關(guān)的校驗。具體的實現(xiàn)類如下:
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);
}
/**
* 實現(xiàn)Validator中的validate接口
* @param obj
* @param errors
*/
@Override
public void validate(Object obj, Errors errors) {
//把校驗信息注冊到Error的實現(xiàn)類里
ValidationUtils.rejectIfEmpty(errors,"name",null,"姓名不能為空!");
PersonScope personScope = (PersonScope) obj;
if(StringUtils.isEmpty(personScope.getAddress())){
errors.rejectValue("address",null,"家庭地址不能為空!!!!");
}
}
}
使用Validtor的校驗實現(xiàn)類
我們需要在Controller的類里使用剛才寫的Validtor的校驗實現(xiàn)類來進(jìn)行表單數(shù)據(jù)的校驗。我們需要在Controller里用@InitBinder注解把剛才的校驗類綁定到WebDataBinder類里。寫法如下:
//綁定PersonalValidator
@InitBinder
public void initBinder(WebDataBinder webDataBinder){
webDataBinder.addValidators(new PersonalValidtor());
}
接下來我們需要在@RequestMapping這個注解所在的方法上使用@Valid注解進(jìn)行數(shù)據(jù)的校驗。
@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
結(jié)果:

請求:http://localhost:8081/testPersonalValidtor.do?name=張三&address=三元橋
結(jié)果:

具體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 />標(biāo)簽
上面的錯誤信息的展示是我們自己來展示的錯誤信息,但是SpringMVC還給我們提供了一個<form:errors />標(biāo)簽來展示錯誤信息。例子如下:
@RequestMapping(value = "testPersonalValidtor02.do")
public Object testPersonalValidtor01(@Valid PersonScope personScope, BindingResult bindingResult){
if(bindingResult.hasErrors()){
return "error";
}else{
return "home";
}
}
jsp頁面內(nèi)容如下:
<%@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 />標(biāo)簽是SpringMVC提供的,所以我們得引入這個標(biāo)簽庫
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
效果如下:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java 判斷字符串a(chǎn)和b是否互為旋轉(zhuǎn)詞
本篇文章主要介紹了判斷字符串a(chǎn)和b是否互為旋轉(zhuǎn)詞的相關(guān)知識,具有很好的參考價值。下面跟著小編一起來看下吧2017-05-05
在java中使用SPI創(chuàng)建可擴(kuò)展的應(yīng)用程序操作
這篇文章主要介紹了在java中使用SPI創(chuàng)建可擴(kuò)展的應(yīng)用程序操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
java實現(xiàn)哈弗曼編碼與反編碼實例分享(哈弗曼算法)
本文介紹java實現(xiàn)哈弗曼編碼與反編碼實例,大家參考使用吧2014-01-01
如何用Java來進(jìn)行文件切割和簡單的內(nèi)容過濾的實現(xiàn)
這篇文章主要介紹了如何用Java來進(jìn)行文件切割和簡單的內(nèi)容過濾的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-01-01

