SpringMVC使用hibrenate validation進行驗證

來源:互聯網
上載者:User

標籤:

本文有兩點需要注意:

  1. 本文只講述跟驗證有關的代碼,如果對其他springmvc不熟悉請先自行學習
  2. 本文將驗證Book類中的name長度為2到10,isbn必須為13位

首先添加需要用到hibrenate的validation JAR包
百度雲 連結:http://pan.baidu.com/s/1pJusKEv 密碼:k6u9

用到的一個測試POJO類Book

package com.elin4it.ssm.pojo;import org.hibernate.validator.constraints.NotEmpty;import sun.security.util.Length;import javax.validation.constraints.Size;/** * Description: Book * Author: Elin Zhou * Create: 2015-07-03 21:43 */public class Book {    private String name;    private String isbn;    public String getIsbn() {        return isbn;    }    public void setIsbn(String isbn) {        this.isbn = isbn;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public String toString() {        return "Book{" +                "isbn=‘" + isbn + ‘\‘‘ +                ", name=‘" + name + ‘\‘‘ +                ‘}‘;    }}

兩個jsp頁面,一個用來顯示form,一個是成功後的顯示介面

addBook.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%--  Created by IntelliJ IDEA.  User: elin  Date: 15-7-3  Time: 下午3:11  To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title></title></head><body>  <form action="<%=request.getContextPath()%>/book/addBookHandle" method="post">    書名:<input type="text" name="name"><br>    ISBN:<input type="text" name="isbn"><br>    <input type="submit" value="提交"><br>  </form></body></html>

success.jsp

<%--  Created by IntelliJ IDEA.  User: elin  Date: 15-7-3  Time: 下午9:08  To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title></title></head><body><h1>SUCCESS</h1></body></html>
  • 在springmvc設定檔中配置用於驗證的bean
    springmvc設定檔需要兩步工作,先建立bean,然後配置之
<!--validation-->       <bean id="validatorFactory" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">              <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>              <property name="validationMessageSource" ref="messageSource"/>       </bean>       <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">              <property name="basenames">                     <list>                            <!--驗證提示資訊設定檔,不需要些.properties-->                            <value>classpath:com/elin4it/ssm/config/validationMessage</value>                     </list>              </property>              <!--預設編碼-->              <property name="defaultEncoding" value="utf-8"/>              <!--緩衝時間-->              <property name="cacheSeconds" value="120"/>       </bean>

然後需要在annotation-driven配置bean

<mvc:annotation-driven validator="validatorFactory"></mvc:annotation-driven>
  • 添加驗證提示資訊檔
    根據配置bean的時候寫的路徑與檔案名稱配置提示資訊檔,這裡只驗認證名和ISBN長度
book.name.notEmpty=書名不可為空book.isbn.size.error=ISBN必須為13位
  • 在POJO中添加驗證規則
    屬性的驗證規則在POJO的變數定義前添加註解
    所以在POJO指定位置修改為如下
@NotEmpty(message = "{book.name.notEmpty}")private String name;@Size(min = 13,max = 13,message = "{book.isbn.size.error}")private String isbn;

其中message中是在之前的提示資訊檔中的定義的鍵名

  • 在controller中接受驗證結果
    接受驗證資訊需要注意兩點
    第一:在form提交時接收的POJO形參名前添加@Validated註解
    第二:在controller方法的形參中添加BindingResult 類型的參數
    通過調用BindingResult .hasErrors()可以得到是否有錯誤產生
    BindingResult.getAllErrors()得到所有的ObjectError類型的錯誤
    ObjectError.getDefaultMessage()得到錯誤的資訊

controller驗證方法代碼如下

@RequestMapping("/addBookHandle")public ModelAndView addBookHandel(@Validated Book book,BindingResult bindingResult){    ModelAndView modelAndView = new ModelAndView();    if (bindingResult.hasErrors()){        //得到所有的錯誤        List<ObjectError> errors = bindingResult.getAllErrors();        for (ObjectError objectError:errors){            //列印錯誤資訊            System.out.println(objectError.getDefaultMessage());        }        modelAndView.addObject(book);        //如果產生錯誤則跳轉的原頁面        modelAndView.setViewName("book/addBook");    }else{        modelAndView.setViewName("success");    }    return modelAndView;}

有時候,要驗證的屬性不是一成不變的,有時候只需要驗認證名,有時候只需要驗證ISBN,所以需要對驗證規則進行分組。
根據要分的組數,定義幾個java類,不需要繼承類或實現介面,類中也不需要任何內容
比如現在建立ValidateType1和ValidateType2
然後在POJO類中定義規則的時候定義其group屬性,例如

@NotEmpty(message = "{book.name.notEmpty}",groups = ValidationType1.class)private String name;@Size(min = 13,max = 13,message = "{book.isbn.size.error}",groups = ValidationType2.class)private String isbn;

然後在對應的controller方法的@Validated註解中添加需要執行的驗證規則,如

public ModelAndView addUserHandle(@Validated(ValidationType1.class) User user,BindingResult bindingResult)

那麼在這個方法中,只會對書名進行驗證了。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

SpringMVC使用hibrenate validation進行驗證

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.