SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證

我們在做Form表單提交的時候,只在前端做數(shù)據(jù)校驗(yàn)是不夠安全的朗若,所以有時候我們需要在后端同樣做數(shù)據(jù)的校驗(yàn)太惠。好在SpringMVC在后臺驗(yàn)證給我們提供了一個比較好的支持痕鳍。那就是使用Valid接口的實(shí)現(xiàn)類做數(shù)據(jù)校驗(yàn)。在這之前我們先做一下準(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>

實(shí)現(xiàn)Validator接口

接下來的第一 步我們需要寫一個類來實(shí)現(xiàn)Validator接口。在這個類里我們需要定義它支持校驗(yàn)的JavaBean昧碉,實(shí)現(xiàn)validate方法英染,用來進(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)信息注冊到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的類里使用剛才寫的Validtor的校驗(yàn)實(shí)現(xiàn)類來進(jìn)行表單數(shù)據(jù)的校驗(yàn)被饿。我們需要在Controller里用@InitBinder注解把剛才的校驗(yàn)類綁定到WebDataBinder類里四康。寫法如下:

    //綁定PersonalValidator
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder){
        webDataBinder.addValidators(new PersonalValidtor());
    }

接下來我們需要在@RequestMapping這個注解所在的方法上使用@Valid注解進(jìn)行數(shù)據(jù)的校驗(yàn)。

    @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é)果:

Paste_Image.png

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

Paste_Image.png

具體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實(shí)體類:

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)狭握,要不然不會生效的闪金。
另外需要注意的是:這里的校驗(yàn)是哪個請求需要校驗(yàn),就寫在哪個請求上论颅。如果需要配置全局的校驗(yàn)的話哎垦,可以在<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" %>

效果如下:

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市损俭,隨后出現(xiàn)的幾起案子蛙奖,更是在濱河造成了極大的恐慌,老刑警劉巖杆兵,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雁仲,死亡現(xiàn)場離奇詭異,居然都是意外死亡琐脏,警方通過查閱死者的電腦和手機(jī)攒砖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來日裙,“玉大人吹艇,你說我怎么就攤上這事“悍鳎” “怎么了受神?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長格侯。 經(jīng)常有香客問我鼻听,道長财著,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任撑碴,我火速辦了婚禮撑教,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灰羽。我一直安慰自己驮履,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布廉嚼。 她就那樣靜靜地躺著玫镐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怠噪。 梳的紋絲不亂的頭發(fā)上恐似,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機(jī)與錄音傍念,去河邊找鬼矫夷。 笑死,一個胖子當(dāng)著我的面吹牛憋槐,可吹牛的內(nèi)容都是我干的双藕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼阳仔,長吁一口氣:“原來是場噩夢啊……” “哼忧陪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起近范,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嘶摊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后评矩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叶堆,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年斥杜,在試婚紗的時候發(fā)現(xiàn)自己被綠了虱颗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔗喂,死狀恐怖忘渔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弱恒,我是刑警寧澤辨萍,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響锈玉,放射性物質(zhì)發(fā)生泄漏爪飘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一拉背、第九天 我趴在偏房一處隱蔽的房頂上張望师崎。 院中可真熱鬧,春花似錦椅棺、人聲如沸犁罩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽床估。三九已至,卻和暖如春诱渤,著一層夾襖步出監(jiān)牢的瞬間丐巫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工勺美, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留递胧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓赡茸,卻偏偏與公主長得像缎脾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子占卧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容