SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證的方法
我們?cè)谧鯢orm表單提交的時(shí)候,只在前端做數(shù)據(jù)校驗(yàn)是不夠安全的,所以有時(shí)候我們需要在后端同樣做數(shù)據(jù)的校驗(yàn)。好在SpringMVC在后臺(tái)驗(yàn)證給我們提供了一個(gè)比較好的支持。那就是使用Valid接口的實(shí)現(xiàn)類做數(shù)據(jù)校驗(yàn)。在這之前我們先做一下準(zhǔn)備的工作。
添加相關(guān)的Maven依賴
我們先把需要的jar包添加進(jìn)來(lái)。
<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>
實(shí)現(xiàn)Validator接口
接下來(lái)的第一 步我們需要寫(xiě)一個(gè)類來(lái)實(shí)現(xiàn)Validator接口。在這個(gè)類里我們需要定義它支持校驗(yàn)的JavaBean,實(shí)現(xiàn)validate方法,用來(lái)進(jìn)行相關(guān)的校驗(yàn)。具體的實(shí)現(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); } /** * 實(shí)現(xiàn)Validator中的validate接口 * @param obj * @param errors */ @Override public void validate(Object obj, Errors errors) { //把校驗(yàn)信息注冊(cè)到Error的實(shí)現(xiàn)類里 ValidationUtils.rejectIfEmpty(errors,"name",null,"姓名不能為空!"); PersonScope personScope = (PersonScope) obj; if(StringUtils.isEmpty(personScope.getAddress())){ errors.rejectValue("address",null,"家庭地址不能為空!!!!"); } } }
使用Validtor的校驗(yàn)實(shí)現(xiàn)類
我們需要在Controller的類里使用剛才寫(xiě)的Validtor的校驗(yàn)實(shí)現(xiàn)類來(lái)進(jìn)行表單數(shù)據(jù)的校驗(yàn)。我們需要在Controller里用@InitBinder注解把剛才的校驗(yàn)類綁定到WebDataBinder類里。寫(xiě)法如下:
//綁定PersonalValidator @InitBinder public void initBinder(WebDataBinder webDataBinder){ webDataBinder.addValidators(new PersonalValidtor()); }
接下來(lái)我們需要在@RequestMapping這個(gè)注解所在的方法上使用@Valid注解進(jìn)行數(shù)據(jù)的校驗(yàn)。
@RequestMapping(value = "testPersonalValidtor.do") @ResponseBody //直接返回對(duì)象 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; } }
接下來(lái)我們來(lái)看一下效果:
請(qǐng)求:http://localhost:8081/testPersonalValidtor.do
結(jié)果:
請(qǐng)求: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; /** * 用來(lái)測(cè)試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 //直接返回對(duì)象 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實(shí)體類:
package com.zkn.learnspringmvc.scope; import java.io.Serializable; /** * Person對(duì)象 * @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),要不然不會(huì)生效的。
另外需要注意的是:這里的校驗(yàn)是哪個(gè)請(qǐng)求需要校驗(yàn),就寫(xiě)在哪個(gè)請(qǐng)求上。如果需要配置全局的校驗(yàn)的話,可以在<mvc:annotation-driven/>中配置validator。寫(xiě)法如下:
<mvc:annotation-driven validator="personalValidtor"> <bean id="personalValidtor" class="com.zkn.learnspringmvc.validtor.PersonalValidtor"/>
使用<form:errors />標(biāo)簽
上面的錯(cuò)誤信息的展示是我們自己來(lái)展示的錯(cuò)誤信息,但是SpringMVC還給我們提供了一個(gè)<form:errors />標(biāo)簽來(lái)展示錯(cuò)誤信息。例子如下:
@RequestMapping(value = "testPersonalValidtor02.do") public Object testPersonalValidtor01(@Valid PersonScope personScope, BindingResult bindingResult){ if(bindingResult.hasErrors()){ return "error"; }else{ return "home"; } }
jsp頁(yè)面內(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提供的,所以我們得引入這個(gè)標(biāo)簽庫(kù)
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
效果如下:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
自己手寫(xiě)Mybatis通用batchInsert問(wèn)題
這篇文章主要介紹了自己手寫(xiě)Mybatis通用batchInsert問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11Java 判斷字符串a(chǎn)和b是否互為旋轉(zhuǎn)詞
本篇文章主要介紹了判斷字符串a(chǎn)和b是否互為旋轉(zhuǎn)詞的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-05-05在java中使用SPI創(chuàng)建可擴(kuò)展的應(yīng)用程序操作
這篇文章主要介紹了在java中使用SPI創(chuàng)建可擴(kuò)展的應(yīng)用程序操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09java實(shí)現(xiàn)哈弗曼編碼與反編碼實(shí)例分享(哈弗曼算法)
本文介紹java實(shí)現(xiàn)哈弗曼編碼與反編碼實(shí)例,大家參考使用吧2014-01-01java實(shí)現(xiàn)簡(jiǎn)單解析XML文件功能示例
這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單解析XML文件功能,結(jié)合實(shí)例形式分析了java針對(duì)xml文件的讀取、遍歷節(jié)點(diǎn)及輸出等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10如何用Java來(lái)進(jìn)行文件切割和簡(jiǎn)單的內(nèi)容過(guò)濾的實(shí)現(xiàn)
這篇文章主要介紹了如何用Java來(lái)進(jìn)行文件切割和簡(jiǎn)單的內(nèi)容過(guò)濾的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01