springmvc項目中如何使用JSR-303實現(xiàn)對數(shù)據(jù)進行校驗

本篇文章為大家展示了springmvc項目中如何使用JSR-303實現(xiàn)對數(shù)據(jù)進行校驗,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

公司主營業(yè)務(wù):網(wǎng)站設(shè)計制作、成都網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出雨城免費做網(wǎng)站回饋大家。

服務(wù)端校驗:

  • 控制層controller:校驗頁面請求的參數(shù)的合法性。在服務(wù)端控制層controller校驗,不區(qū)分客戶端類型。
  • 業(yè)務(wù)層service(使用較多):主要校驗關(guān)鍵業(yè)務(wù)參數(shù),僅限于service接口中使用的參數(shù)。
  • 持久層dao:一般是不校驗的。
     

環(huán)境集成

1、添加jar包:

此處使用hibernate-validator實現(xiàn)(版本:hibernate-validator-4.3.0.Final-dist.zip),將如下jar包添加到classpath(WEB-INF/lib下即可):

  • dist/lib/required/validation-api-1.0.0.GA.jar JSR-303規(guī)范API包
  • dist/hibernate-validator-4.3.0.Final.jar Hibernate 參考實現(xiàn)

2、在spring配置總添加對JSR-303驗證框架的支持

<!-- 校驗錯誤信息配置文件 -->
 <bean id="messageSource"
  class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
  <!-- 資源文件名-->
  <property name="basenames"> 
   <list> 
   <value>classpath:CustomValidationMessages</value>
   </list> 
  </property>
  <!-- 資源文件編碼格式 -->
  <property name="fileEncodings" value="utf-8" />
  <!-- 對資源文件內(nèi)容緩存時間,單位秒 -->
  <property name="cacheSeconds" value="120" />
 </bean>
<!-- 校驗器 -->
 <bean id="validator"
  class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
  <!-- hibernate校驗器-->
  <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
  <!-- 指定校驗使用的資源文件,在文件中配置校驗錯誤信息,如果不指定則默認(rèn)使用classpath下的ValidationMessages.properties -->
  <property name="validationMessageSource" ref="messageSource" />
 </bean>

自動注冊validator

<mvc:annotation-driven conversion-service="conversionService" validator="validator">
 </mvc:annotation-driven>

例子說明

例子一:

import javax.validation.constraints.NotNull; 
public class UserModel { 
 @NotNull(message="{username.not.empty}") 
 private String username; 
} 

通過@NotNull指定此username字段不允許為空,當(dāng)驗證失敗時將從之前指定的messageSource中獲取“username.not.empty”對于的錯誤信息,此處只有通過“{錯誤消息鍵值}”格式指定的才能從messageSource獲取。

@Controller 
public class HelloWorldController { 
 @RequestMapping("/validate/hello") 
 public String validate(@Valid @ModelAttribute("user") UserModel user, Errors errors) { 

  if(errors.hasErrors()) { 
   return "validate/error"; 
  } 
  return "redirect:/success"; 
 } 
} 

通過在命令對象上注解@Valid來告訴Spring MVC此命令對象在綁定完畢后需要進行JSR-303驗證,如果驗證失敗會將錯誤信息添加到errors錯誤對象中。

驗證失敗后需要展示的頁面(/WEB-INF/jsp/error.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 

<form:form commandName="user"> 
 <form:errors path="*" cssStyle="color:red"></form:errors><br/> 
</form:form> 

在瀏覽器地址欄中輸入http://localhost:8080/validate/hello,即沒有username數(shù)據(jù),請求后將直接到驗證失敗界面并顯示錯誤消息“用戶名不能為空”,如果請求時帶上“&#63;username=zhang”將重定向到成功頁面。

例子二:

public class Items {
 private Integer id;
 @Size(min=1,max=20,message="{items.name.length.error}")
 private String name;

 @NotNull(message="{items.createtime.isNULL}")
 private Date createtime;

 省略set()和get()...
}
public String editItemsSubmit(Model model, @Validated Items items, 
BindingResult bindingResult) throws Exception {
  if(bindingResult.hasErrors()){
   List<ObjectError> allErrors = bindingResult.getAllErrors();
   for(ObjectError objectError:allErrors) {
  System.out.println(objectError.getDefaultMessage());
   }

   //可以直接使用model將提交pojo回顯到頁面
   model.addAttribute("items",items);

   // 出錯重新到商品修改頁面
   return "items/editItems";
  }
  return "success";
 }
<table width="100%" border=1>
<tr>
 <td>商品名稱</td>
 <td><form:input type="text" path="items.name" value="${items.name }"/></td><form:errors path="items.name"/>
</tr>
<tr>
 <td>商品生產(chǎn)日期</td>
 <td><input type="text" name="createtime" value="<fmt:formatDate value="${items.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
</tr>

然后jsp頁面還是之前的頁面,并能顯示輸入不合法的并通過<form:errors path="items.name"/>顯示出來,這樣明顯更加簡單。

當(dāng)我們配置了messageSource Bean時,默認(rèn)將為驗證的對象自動生成如下錯誤消息鍵:

  • 驗證錯誤注解簡單類名.驗證對象名.字段名
  • 驗證錯誤注解簡單類名.字段名
  • 驗證錯誤注解簡單類名.字段類型全限定類名
  • 驗證錯誤注解簡單類名

使用的優(yōu)先級是:從高到低,即最前邊的具有最高的優(yōu)先級,而且以上所有默認(rèn)的錯誤消息鍵優(yōu)先級高于自定義的錯誤消息鍵。

如測試用例

復(fù)制代碼 代碼如下:

public String pattern(@Valid @ModelAttribute(“model”) PatternModel model, Errors errors)

將自動產(chǎn)生如下錯誤消息鍵:

  • Pattern.model.value=驗證錯誤注解簡單類名.驗證對象名.字段名
  • Pattern.value=驗證錯誤注解簡單類名.字段名
  • Pattern.Java.lang.String=驗證錯誤注解簡單類名.字段類型全限定類名
  • Pattern=驗證錯誤注解簡單類名

內(nèi)置的驗證約束注解如下表所示(摘自hibernate validator reference):

驗證注解驗證的數(shù)據(jù)類型說明
@AssertFalseBoolean,boolean驗證注解的元素值是false
@AssertTrueBoolean,boolean驗證注解的元素值是true
@NotNull任意類型驗證注解的元素值不是null
@Null任意類型驗證注解的元素值是null
@Min(value=值)BigDecimal,BigInteger, byte, short, int, long,等任何Number或CharSequence(存儲的是數(shù)字)子類型驗證注解的元素值大于等于@Min指定的value值
@Max(value=值)和@Min要求一樣驗證注解的元素值小于等于@Max指定的value值
@DecimalMin(value=值)和@Min要求一樣驗證注解的元素值大于等于@ DecimalMin指定的value值
@DecimalMax(value=值)和@Min要求一樣驗證注解的元素值小于等于@ DecimalMax指定的value值
@Digits(integer=整數(shù)位數(shù), fraction=小數(shù)位數(shù))和@Min要求一樣驗證注解的元素值的整數(shù)位數(shù)和小數(shù)位數(shù)上限
@Size(min=下限, max=上限)字符串、Collection、Map、數(shù)組等驗證注解的元素值的在min和max(包含)指定區(qū)間之內(nèi),如字符長度、集合大小
@Pastjava.util.Date, java.util.Calendar; Joda Time類庫的日期類型驗證注解的元素值(日期類型)比當(dāng)前時間早
@Future與@Past要求一樣驗證注解的元素值(日期類型)比當(dāng)前時間晚
@NotBlankCharSequence子類型驗證注解的元素值不為空(不為null、去除首位空格后長度為0),不同于@NotEmpty,@NotBlank只應(yīng)用于字符串且在比較時會去除字符串的首位空格
@Length(min=下限, max=上限)CharSequence子類型驗證注解的元素值長度在min和max區(qū)間內(nèi)
@NotEmptyCharSequence子類型、Collection、Map、數(shù)組驗證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0)
@Range(min=最小值, max=最大值)BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子類型和包裝類型驗證注解的元素值在最小值和最大值之間
@Email(regexp=正則表達式,flag=標(biāo)志的模式)CharSequence子類型(如String)驗證注解的元素值是Email,也可以通過regexp和flag指定自定義的email格式
@Pattern(regexp=正則表達式,flag=標(biāo)志的模式)String,任何CharSequence的子類型驗證注解的元素值與指定的正則表達式匹配
@Valid任何非原子類型指定遞歸驗證關(guān)聯(lián)的對象;如用戶對象中有個地址對象屬性,如果想在驗證用戶對象時一起驗證地址對象的話,在地址對象上加@Valid注解即可級聯(lián)驗證

此處只列出Hibernate Validator提供的大部分驗證約束注解,請參考hibernate validator官方文檔了解其他驗證約束注解和進行自定義的驗證約束注解定義。

上述內(nèi)容就是springmvc項目中如何使用JSR-303實現(xiàn)對數(shù)據(jù)進行校驗,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文名稱:springmvc項目中如何使用JSR-303實現(xiàn)對數(shù)據(jù)進行校驗
分享URL:http://bm7419.com/article42/jcschc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、做網(wǎng)站、標(biāo)簽優(yōu)化、服務(wù)器托管響應(yīng)式網(wǎng)站、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計