標籤:
本文有兩點需要注意:
- 本文只講述跟驗證有關的代碼,如果對其他springmvc不熟悉請先自行學習
- 本文將驗證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進行驗證