SpringMVC使用hibrenate validation進行驗證

本文有兩點須要注意:html

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

首先添加須要用到hibrenate的validation JAR包
百度雲下載地址 連接:http://pan.baidu.com/s/1pJusKEv 密碼:k6u9java

用到的一個測試POJO類Bookspring

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.jspmarkdown

<%@ 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.jspmvc

<%-- 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配置beanapp

<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中是在以前的提示信息文件中的定義的鍵名jsp

  • 在controller中接受驗證結果
    接受驗證信息須要注意兩點
    第一:在form提交時接收的POJO形參名前添加@Validated註解
    第二:在controller方法的形參中添加BindingResult 類型的參數
    經過調用BindingResult .hasErrors()能夠獲得是否有錯誤產生
    BindingResult.getAllErrors()獲得全部的ObjectError類型的錯誤
    ObjectError.getDefaultMessage()獲得錯誤的信息

controller驗證方法代碼以下ide

@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屬性,例如post

@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)

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

相關文章
相關標籤/搜索