使用jsr303實現數據校驗


除了前端的js驗證,服務端也可加入數據驗證,springmvc中有兩種方式可以驗證輸入

  • 利用spring自帶的驗證框架
  • 利用jsr303實現

jsr303實現數據校驗

jsr303是java為bean數據合法性校驗所提供的標准框架。jsr303不需要編寫驗證器,它定義了一套可標注在成員變量、屬性方法上的校驗注解。

springmvc支持jsr303標准的校驗框架,spring的DataBinder在進行數據綁定時,可同時調用校驗框架來完成數據校驗工作,非常方便。

spring本身沒有提供jsr303的實現,hibernate validator實現了jsr303,所以必須在項目中加入來自hibernate validator庫的jar文件,復制hibernate-validator-4.3.2.Final-dist.zip中的三個jar文件即可,spring將會自動加載並裝配

  • hibernate-validator-4.3.2.Final.jar
  • jboss-logging-3.1.0.CR2.jar
  • validator-api-1.0.0.GA.jar
package edu.cn.pojo;

import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import java.util.Date;

public class User {

    @NotEmpty(message = "用戶編碼不能為空")
    private String userCode;

    @NotEmpty(message = "用戶名稱不能為空")
    private String userName;

    @NotNull(message = "密碼不能為null")
    @Length(min = 6, max = 10, message = "用戶密碼長度為6-10")
    private String userPassword;

    @Past(message = "必須是一個過去的時間")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;

    //省略...

}

在上述代碼中,@Length 表示被注釋的字符串的大小必須在指定范圍內,這是hibernate validator提供的擴展注解

下一步就需要在controller中使用注解所聲明的限制規則來進行數據的校驗。由於<mvc:annotation-driven/>會默認裝配好一個LocalValidatorFactoryBean,通過在controller的處理方法的入參上標注@Valid注解即可讓springmvc在完成數據綁定之后,指定數據校驗的工作。代碼如下

@RequestMapping(value = "/add.html", method = RequestMethod.POST)
public String addSave(@Valid User user, BindingResult bindingResult, HttpSession session){
    if (bindingResult.hasErrors()){
        return "user/useradd";
    }
    user.setCreatedBy(((User)session.getAttribute("userSession")).getId());
    user.setCreationDate(new Date());
    if (userService.add(user)){
        return "redirect:/user/userlist.html";
    }
    return "user/useradd";
}

@Valid注解在validator-api依賴下,BindResult接口在spring-context依賴下

在上述代碼中,在入參對象user前標注了@Valid注解,也就意味着將會調用校驗框架,根據注解聲明的校驗規則實施校驗,校驗的結果存入后面緊跟的入參中,並且這個入參必須是BindingResult或者Error類型。在該方法體內,首先根據BindingResult來判斷是否存在錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM