目錄
1 數據校驗介紹
2 普通校驗
3 分組校驗
4 參考文檔
1 數據校驗介紹
在實際的項目中,一般會有兩種校驗數據的方式:客戶端校驗和服務端校驗
- 客戶端校驗:這種校驗一般是在前端頁面使用 JS 代碼進行校驗,主要是驗證輸入數據的合法性,不合法的數據則沒有必要再發送至服務端了。前端校驗可以有效的提高用戶體驗,但是無法確保數據完整性,因為前端用戶可以方便的拿到請求地址,然后直接發送請求,傳遞非法參數
- 服務端校驗:可以有效的保證數據安全與完整性,但是用戶體驗要差一點,所以客戶端校驗和服務端校驗通常兩者結合使用
????????SpringMVC 提供了兩種方法來對用戶的輸入數據進行校驗:一種是 SpringMVC 自帶的 Validation 校驗框架,它提供了簡潔的注解和驗證規則,易于使用,并且與 SpringMVC 框架集成良好;另一種是利用 JRS-303 驗證框架進行驗證,JRS-303 驗證框架的優勢在于它的靈活性和可擴展性,可以與其他框架或技術進行集成。
注解 | 作用 |
---|---|
@Null | 標注的屬性必須為null |
@NotNull | 標注的屬性必須不為null |
@AssertTrue | 標注的屬性必須為true |
@AssertFalse | 標注的屬性必須為false |
@Min(value) | 標注的屬性必須是一個數字,并且其值必須大于或等于value |
@Max(value) | 標注的屬性必須是一個數字,并且其值必須小于或等于value |
@DecimalMin(value) | 必須大于或等于value |
@DecimalMax(value) | 必須小于或等于value |
@Size(max,min) | 大小必須在max和min限定的范圍內 |
@Digits(integer,fratction) | 值必須是一個數字,且必須在可接受的范圍內 |
@Past | 只能用于日期型,且必須是過去的日期 |
@Future | 只能用于日期型,且必須是將來的日期 |
@Pattern(value) | 必須符合指定的正則表達式 |
必須是格式正確的Email地址 | |
@Length | 被注釋的字符串大小必須在指定的范圍內 |
@NotEmpty | 被注釋的字符串不能是空字符串 |
@Range | 被注釋的元素必須在指定的范圍內 |
@NotEmpty、@NotNull 和 @NotBlank 三種的區別:
- @NotNull:一般用在基本數據類型上(包括包裝類),對象不能為 null,但可以為 empty,即為空集(size = 0)。
- @NotEmpty:可以作用在 String、List、Map 和 Array 等,對象不能為 null,而且長度必須大于0 (size > 0)
- @NotBlank:只能作用在 String 上,不能為 null,而且調用 trim() 后,長度必須大于 0 ,即必須有實際字符
2 普通校驗
導入依賴
<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.2.0.Final</version>
</dependency>
在 SpringMVC 配置文件中配置校驗器并注入到處理器適配器中
<!-- 配置MVC注解驅動,配置注入校驗器 -->
<mvc:annotation-driven validator="validator"/><!-- 配置校驗器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"><!-- 校驗器--><property name="providerClass" value="org.hibernate.validator.HibernateValidator"/><!-- 指定校驗使用的資源文件,如果不指定則默認使用classpath下的ValidationMessages.properties --><property name="validationMessageSource" ref="messageSource"/>
</bean>
<!-- 校驗錯誤信息配置文件 -->
<bean id="messageSource"class="org.springframework.context.support.ReloadableResourceBundleMessageSource"><!-- 資源文件名--><property name="basenames"><list><value>classpath:CustomValidationMessages</value></list></property><!-- 資源文件編碼格式 --><property name="defaultEncoding" value="utf-8"/><!-- 對資源文件內容緩存時間,單位秒 --><property name="cacheSeconds" value="120"/>
</bean>
創建?CustomValidationMessages.properties 配置文件,和上述代碼中的校驗錯誤信息配置文件名對應(也可以將錯誤提示信息放在一個類中)
#添加校驗錯誤提示信息
user.id.isEmpty="用戶的ID不能為空!"
user.userName.isEmpty="用戶名不能為空!"
user.userName.length="用戶名為1~6個字符!"
user.userPwd.isEmpty="密碼不能為空!"
user.userPwd.length="密碼的長度為5~15個字符!"
user.userEmail.isEmpty="郵箱不能為空!"
user.userEmail.format="輸入的郵箱格式不正確!"
需要校驗的類 User
public class User {@NotNull(message = "{user.id.isEmpty}")private Integer id;@NotEmpty(message = "{user.userName.isEmpty}")@Length(min = 1, max = 6, message = "{user.userName.length}")private String userName;@NotEmpty(message = "{user.userPwd.isEmpty}")@Length(min = 5, max = 15, message = "{user.userPwd.length}")private String userPwd;@NotEmpty(message = "{user.userEmail.isEmpty}")@Email(message = "{user.userEmail.format}")private String userEmail;// 省略了 Getter、Setter 方法
校驗控制器
@Validated 注解和 BindingResult 是成對出現的,中間不能穿插其它的形參,否則會報 400錯誤,其他形參只能加在它們后面
@Controller
public class ValidateController {@ResponseBody@RequestMapping("/validate")// 形參前面加上 @Validated 注解表示這個實體類需要進行數據校驗// BindingResult 封裝數據綁定的校驗結果public void validate(@Validated User user, BindingResult bindingResult) {if (bindingResult.hasErrors()) {//校驗未通過,獲取所有的異常信息并展示出來List<ObjectError> allErrors = bindingResult.getAllErrors();for (ObjectError allError : allErrors) {System.out.println(allError.getObjectName() + ":" + allError.getDefaultMessage());}}}
}
index.jsp
<input name="userName"/> 與 private String userName; 對應
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>添加用戶</title></head><body><form action="${pageContext.request.contextPath}/validate" method="post">ID號:<input type="text" name="id" placeholder="請輸入ID號"/> <br>姓名:<input type="text" name="userName" placeholder="請輸入姓名"/> <br>密碼:<input type="password" name="userPwd" placeholder="請輸入密碼"/> <br>郵箱:<input type="text" name="userEmail" placeholder="請輸入郵箱"/> <br><input type="submit" value="提交" /></form></body>
</html>
執行結果
?
3 分組校驗
????????某個屬性設置了多種數據校驗,可以將這些校驗分組,然后?Controller 方法選擇校驗分組對數據進行校驗
首先定義校驗組,所謂的校驗組,它其實就是空接口:
// 分組校驗接口1
public interface ValidationGroup1 {
}// 分組校驗接口2
public interface ValidationGroup2 {
}
對校驗進行分組
public class User {// groups屬性表示校驗屬于哪個組,可以定義多個@NotNull(message = "{user.id.isEmpty}", groups = {ValidationGroup2.class})private Integer id;@NotEmpty(message = "{user.userName.isEmpty}", groups = {ValidationGroup1.class, ValidationGroup2.class})@Length(min = 1, max = 6, message = "{user.userName.length}", groups = {ValidationGroup1.class, ValidationGroup2.class})private String userName;@NotEmpty(message = "{user.userPwd.isEmpty}", groups = {ValidationGroup1.class})@Length(min = 5, max = 15, message = "{user.userPwd.length}", groups = {ValidationGroup1.class})private String userPwd;@NotEmpty(message = "{user.userEmail.isEmpty}", groups = {ValidationGroup2.class})@Email(message = "{user.userEmail.format}", groups = {ValidationGroup2.class})private String userEmail;// getter setter 構造器 toString 省略...
}
執行結果
4 參考文檔
SpringMVC入門學習(十五)----數據校驗 - 唐浩榮 - 博客園 (cnblogs.com)
springMVC如何對輸入數據校驗實現代碼_java_腳本之家 (jb51.net)