SpringMVC 學習(十一)之數據校驗

目錄

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必須是格式正確的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)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716623.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716623.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716623.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文物預防性保護系統方案的需求分析

沒有文物保存環境監測&#xff0c;就不能實施有效的文物預防性保護。因此要建立文物預防性保護體系&#xff0c;一定要先有良好的文物狀態監測制度,進而進行科學有效的文物保護管理。所以,導入文物預防性保護監測與調控系統,首先就是要針對文物進行全年溫度、濕度、光照等關鍵參…

使用Zint庫生成一維碼/條形碼

下面代碼是是使用 Zint 庫生成 Code 128 類型的條形碼&#xff0c;并將生成的條形碼保存為 output.bmp 文件。下面是對代碼的詳細解釋&#xff1a; #include 和 #include <zint.h>&#xff1a;這兩行代碼包含了所需的頭文件&#xff0c;分別是標準輸入輸出流的頭文件和 Z…

LeetCode---【鏈表的操作】

目錄 206反轉鏈表【鏈表結構基礎】21合并兩個有序鏈表【遞歸】我的答案【錯誤】自己修改【超出時間限制】在官方那里學到的【然后自己復寫,錯誤】對照官方【自己修改】 160相交鏈表【未理解題目目的】在b站up那里學到的【然后自己復寫,錯誤】【超出時間限制】對照官方【自己修改…

(C語言)qsort函數模擬實現

前言 我們需先了解qsort函數 qsort函數詳解&#xff1a;http://t.csdnimg.cn/rTNv9 qsort函數可以排序多種數據類型&#xff0c;很是神奇&#xff0c;這是為什么&#xff0c;我們在里模擬實現這樣的功能 目錄 1. qsort函數模擬實現 2. 我們使用bubble_sort函數排序整形數…

探究前端的.less樣式文件 css的增強版

前言 .less 文件是一種層疊樣式表&#xff08;CSS&#xff09;預處理器語言的文件格式&#xff0c;簡稱 LESS&#xff08;Leaner Style Sheets&#xff09;。它擴展了 CSS 語言&#xff0c;增加了變量、混合、函數和許多其他技術&#xff0c;使得 CSS 更加易于維護和擴展。 與…

AntDesignVue之a-table中key不唯一問題處理的多種方式

AntDesignVue2之a-table中key不唯一問題處理的多種方式 文章目錄 AntDesignVue2之a-table中key不唯一問題處理的多種方式1. key不唯一問題1. 問題描述2. 解決方法1. 帶冒號的rowKey2 . 帶冒號的rowKey綁定表達式3. 不帶冒號的rowKey屬性 1. key不唯一問題 1. 問題描述 antdv: …

Sunshine v0.21.0 安裝卡住,閃退的問題解決

上期博客講了如何利用 Sunshine 和 Moonlight 實現 iPad 當作 Windows 副屏&#xff0c;用官方 Windows installer 安裝 Sunshine 過程中&#xff0c;遇到了安裝卡住&#xff08;這個是因為需要國外網絡環境&#xff09;&#xff0c;安裝后運行閃退的問題。 Sunshine 下載地址…

OpenCV 4基礎篇| OpenCV圖像的裁切

目錄 1. Numpy切片1.1 注意事項1.2 代碼示例 2. cv2.selectROI()2.1 語法結構2.2 注意事項2.3 代碼示例 3. Pillow.crop3.1 語法結構3.2 注意事項3.3 代碼示例 4. 擴展示例&#xff1a;單張大圖裁切成多張小圖5. 總結 1. Numpy切片 語法結構&#xff1a; retval img[y:yh, x…

以目標檢測和分類任務為例理解One-Hot Code

在目標檢測和分類任務中&#xff0c;每一個類別都需要一個編碼來表示&#xff0c;同時&#xff0c;這個編碼會用來計算網絡的loss。比如有貓&#xff0c;狗&#xff0c;豬三種動物&#xff0c;這三種動物相互獨立&#xff0c;在分類中&#xff0c;將其中任意一種分類為其他都同…

YOLOv9獨家原創改進|使用可改變核卷積AKConv改進RepNCSPELAN4

專欄介紹&#xff1a;YOLOv9改進系列 | 包含深度學習最新創新&#xff0c;主力高效漲點&#xff01;&#xff01;&#xff01; 一、改進點介紹 AKConv是一種具有任意數量的參數和任意采樣形狀的可變卷積核&#xff0c;對不規則特征有更好的提取效果。 RepNCSPELAN4是YOLOv9中的…

前端架構: 腳手架通用框架封裝之啟動檢查功能開發(教程四)

腳手架啟動前的檢查功能開發 接上文&#xff0c;仍舊在 abc-cli 項目中參考&#xff1a;https://blog.csdn.net/Tyro_java/article/details/136431320現在要在腳手架啟動前要做一些邏輯&#xff0c;可以在 hook 鉤子函數中去書寫比如&#xff0c;進行node版本的對比&#xff0…

2023年12月CCF-GESP編程能力等級認證Scratch圖形化編程四級真題解析

一、單選題(共15題,共30分) 第1題 現代計算機是指電子計算機,它所基于的是( )體系結構。 A:艾倫圖靈 B:馮諾依曼 C:阿塔納索夫 D:埃克特-莫克利 答案:B 第2題 默認小貓角色,執行下列程序,以下說法正確的是? ( ) A:舞臺上會出現無數個小貓 B:舞臺只會出現…

java spring 02. AbstractApplicationContext

spring創建對象的順序&#xff0c;先創建beanfactory&#xff0c;再會把xml文件讀取到spring。 public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, Nullable ApplicationContext parent)throws BeansException {//調用父類的構造方法super(p…

Redis常用指令,jedis與持久化

1.redis常用指令 第一個是key的常用指令&#xff0c;第二個是數據庫的常用指令 前面的那些指令都是針對某一個數據類型操作的&#xff0c;現在的都是對所有的操作的 1.key常用指令 key應該設計哪些操作 key是一個字符串&#xff0c;通過key獲取redis中保存的數據 對于key…

flink重溫筆記(九):Flink 高級 API 開發——flink 四大基石之WaterMark(Time為核心)

Flink學習筆記 前言&#xff1a;今天是學習 flink 的第 9 天啦&#xff01;學習了 flink 四大基石之 Time的應用—> Watermark&#xff08;水印&#xff0c;也稱水位線&#xff09;&#xff0c;主要是解決數據由于網絡延遲問題&#xff0c;出現數據亂序或者遲到數據現象&…

通過大語言模型理解運維故障:評估和總結

張圣林 南開大學軟件學院副教授、博士生導師 第六屆CCF國際AIOps挑戰賽程序委員會主席 在ATC、WWW、VLDB、KDD、SIGMETRICS等國際會議和JSAC、TC、TSC等國際期刊發表高水平論文50余篇。主持國家自然科學基金項目2項&#xff0c;橫向項目13項&#xff08;與華為、字節跳動、騰訊…

Sqli-labs靶場第20關詳解[Sqli-labs-less-20]自動化注入-SQLmap工具注入

Sqli-labs-Less-20 通過測試發現&#xff0c;在登錄界面沒有注入點&#xff0c;通過已知賬號密碼admin&#xff0c;admin進行登錄發現&#xff1a; 登錄后會有記錄 Cookie 值 設想如果在Cookie嘗試加上注入語句&#xff08;報錯注入&#xff09;&#xff0c;測試是否會執行…

C++STL之vector

vector 1. vector介紹 vector文檔vector其實就是一個順序表&#xff0c;它表示可變大小數組的序列容器。像數組一樣&#xff0c;可以使用下標[] 來訪問vector的元素&#xff0c;和數組一樣高效&#xff1b;甚至&#xff0c;它的大小是可以動態改變的&#xff0c;其大小由容器自…

printf() 函數支持變長參數列表

printf() 函數也支持變長參數列表&#xff0c;可以使用省略號 … 來表示&#xff0c;用于指定要輸出的多個值。在函數內部&#xff0c;可以使用 va_start() 和 va_end() 宏來訪問變長參數列表中的值。例如&#xff1a; #include <stdio.h> #include <stdarg.h>voi…

軟考55-上午題-【數據庫】-數據庫設計步驟1

一、數據庫設計的步驟 新奧爾良法&#xff0c;四個主要階段&#xff1a; 1、用戶需求分析&#xff1a;手機用戶需求&#xff0c;確定系統邊界&#xff1b; 2、概念設計&#xff08;概念結構設計&#xff09;&#xff1a;是抽象概念模型&#xff0c;較理想的是采用E-R方法。 …