springMVC-10驗證及國際化

驗證

概述

● 概述

1. 對輸入的數據(比如表單數據),進行必要的驗證,并給出相應的提示信息。
2. 對于驗證表單數據,springMVC提供了很多實用的注解, 這些注解由JSR303 驗證框架提供.

●JSR 303 驗證框架

1. JSR 303 的含義
JSR(Java Specification Request)是 Java 社區提案的縮寫,由 Java Community Process(JCP)管理。每個 JSR 對應一項 Java 技術規范,例如 JSR 303 即第 303 號提案

2. JSR 303 是 Java 為 Bean 數據合法性校驗提供的標準框架,它已經包含在 JavaEE 中
3. JSR 303 通過在 Bean 屬性上標注類似于 @NotNull、@Max 等標準的注解指定校驗規則, 并通過標準的驗證接口對 Bean 進行驗證
4. JSR 303 提供的基本驗證注解有:?

●HibernateValidator擴展注解
1.HibernateValidator和Hibernate沒有關系,只是JSR303實現的一個擴展.
2.HibernateValidator是JSR303的一個參考實現,除支持所有標準的校驗注解外,它還支 持以下的擴展注解:
3.擴展注解有如下

應用實例

1. 引入驗證和國際化相關的jar包

2.?修改Monster.java

    @NotEmpty//表示該字段不能為null,或者String不為"",或者集合、映射的size != 0,這樣的情況。//Asserts that the annotated string, collection, map or array is not null or empty.private String name;@Range(min = 1, max = 200)//表示取值范圍在1-200之間private Integer age;

3.修改MonsterHandler.java

/*** 編寫方法,處理添加妖怪* 1.springmvc可以將提交的數據,按照參數名和對象的屬性名匹鹿配* 2.直接封裝到對象中->前面講解模型數據時,講過*         String =>Integer* 3.@Valid Monster monster:表示對monster接收的數據進行校驗* 4.Errors errors表示如果校驗出現錯誤,將校驗的錯誤信息保存errors* 5.Map<String,Object>map表示如果校驗出現錯誤,將校驗的錯誤信息保存至map;同時保存monster對象(與errors的區別)* 6.校驗發生的時機: 在springmvc底層,反射調用目標方法時,會接收到http請求的數據,然后根據注解來進行驗證,* 在驗證過程中,如果出現了錯誤,就把錯誤信息填充errors 和 map*/@RequestMapping("/save")//這兒的monster,springMVC會進行自動裝配public String addMonster(@Valid Monster monster, Errors errors ,Map<String, Object> map) {System.out.println(monster);System.out.println("=========errors===========");List<ObjectError> allErrors = errors.getAllErrors();for(ObjectError error : allErrors) {System.out.println("error=" + error);}System.out.println("==========map============");for (Map.Entry<String,Object> entry : map.entrySet()) {System.out.println("key=" + entry.getKey() + " value=" + entry.getValue());}return "success";}

4.測試

和預期一樣,姓名空報錯,年齡超出范圍。

驗證信息回顯至頁面

1.修改monster_addUI.jsp,添加errors標簽

    妖怪姓名:<s:input path="name" /><s:errors path="name"/><br><br>妖怪年齡:<s:input path="age" /><s:errors path="age"/><br><br>電子郵件:<s:input path="email"/><s:errors path="email"/><br><br>妖怪生日:<s:input path="birthday"/><s:errors path="birthday"/>  要求以"9999-11-11"的形式<br><br>妖怪薪水:<s:input path="salary"/>><s:errors path="salary"/>  要求以"123,890.12"的形式<br><br>

2.修改MonsterHandler

? ? ? ? 發現報錯,便阻止進入到下一個頁面,返回當前輸入頁面。

        System.out.println("==========map============");for (Map.Entry<String,Object> entry : map.entrySet()) {System.out.println("key=" + entry.getKey() + " value=" + entry.getValue());}//交換了map和errors的代碼順序,是因為map有monster,通常不會為nullSystem.out.println("=========errors===========");if(errors.hasErrors()){List<ObjectError> allErrors = errors.getAllErrors();for(ObjectError error : allErrors) {System.out.println("error=" + error);}return "datavalid/monster_addUI";}return "success";

3.測試

? ? ? ? 可以看到返回的錯誤信息了。

國際化/自定義驗證信息

概念

????????國際化(簡稱?i18n,因“internationalization”一詞首尾字母間有18個字符)是指設計和開發軟件、產品或服務時,使其能夠適應不同語言、地區和文化需求的技術與流程。核心目標是無需重構代碼或設計,即可快速適配多語言和多區域市場。

應用實例

原始的生日和薪水報錯是用英文顯示的:

1.配置國際化文件,springMVC-servlet.xml中添加bean

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"><!--屬性作用: 配置國際化文件名字--><!--如果你這樣配的話,表示messageSource會到src/i18nXXX.properties去讀取錯誤信息--><property name="basename" value="i18n"/></bean>

2.創建src/i18n.properties

? ? ? ? 這兒的文件名,和上面的配置文件一致
? ? ? ? 等號=前面的key,來自于報錯代碼的第一個字段,比如:
????????????????[NotEmpty.monster.name, ...],[Range.monster.age, ...]
? ? ? ? 等號=后面的value值,是unicode編碼,可以在相應的工具網站“unicode編碼轉換工具”中查詢

NotEmpty.monster.name=\u59d3\u540d\u4e0d\u80fd\u4e3a\u7a7a
Range.monster.age=\u5e74\u9f84\u9700\u8981\u5728\u0031\u81f3\u0032\u0030\u0030\u5c81\u4e4b\u95f4
typeMismatch.monster.birthday=\u751f\u65e5\u683c\u5f0f\u4e0d\u6b63\u786e
typeMismatch.monster.salary=\u85aa\u6c34\u5fc5\u987b\u5168\u90e8\u662f\u6570\u5b57

?3.測試

? ? ? ? 可以看到報錯回顯的內容,全部按照自己定義的內容進行顯示了。??

細節說明和注意事項

1. 在需要驗證的 Javabean/POJO的字段上加上相應的驗證注解.

2. 目標方法上,在 JavaBean/POJO 類型的參數前, 添加 @Valid 注解. 告知 SpringMVC 該 bean 是需要驗證的

3. 在 @Valid 注解之后, 添加一個 Errors 或 BindingResult 類型的參數, 可以獲取到驗證 的錯誤信息

4. 需要使用 標簽來顯示錯誤消息, 這個標簽, 需要寫在 springMVC的標簽<s:form>內生效.

5. 錯誤消息的國際化文件i18n.properties, 中文需要是Unicode編碼,使用工具轉碼.
√ 格式: 驗證規則:表單modelAttribute值.屬性名 = 消息信息
√ NotEmpty.monster.name=\u540D\u5B57\u4E0D\u80FD\u4E3A\u7A7A
√ typeMismatch.monster.age=\u7C7B\u578B\u4E0D\u5339\u914D

6. 注解@NotNull 和 @NotEmpty 的區別說明

1) 查看源碼可以知道 :
@NotEmptyAsserts that the annotated string, collection, map or array is not {@code null} or empty.

2) 查看源碼可以知道 :
@NotNull*Theannotated element must not be {@code null}.* Accepts any type.

種類修飾類型作用
@NotEmptyString, collection, mapnull || size=0
@NotNull任意類型null

3) 解讀:如果是字符串驗證空, 建議使用 @NotEmpty

7. SpingMVC 驗證時,會根據不同的驗證錯誤, 返回對應的信息

注解的組合使用

1.注解可以組合使用比如

@Range+@NotNull

2.返回的錯誤信息,除了通過國際化進行配置外,還可以通過注解的屬性來修改

@NotNull(message="不能為空")

3.測試發現,同時配置了message和國際化的情況下,會優先顯示國際化配置的信息。

DataBinder工作機制-了解

圖例Spring MVC通過反射機制對目標方法進行解析,將請求消息綁定到處理方法的入參中。數據綁定的核心部件是DataBinder,運行機制如下

1.Tomcat封裝請求到ServletRequest

2.處理方法入參對象

3.進行數據類型轉換/格式化。ConversionService轉換服務,如果轉換出現錯誤,就會封裝到最后的5BindingResult中

4.進行數據校驗,出錯也會封裝到5BindResult中

5.返回數據轉換和數據校驗的結果

error的運行類型是BeanPropertyBindingResult,?BeanPropertyBindingResult實現了BindingResult接口

取消屬性綁定

說明

在默認情況下,表單提交的數據都會和pojo類型的javabean屬性綁定,如果程序員在開發中,希望取消某個屬性的綁定,也就是說,不希望接收到某個表單對應的屬性的值,則可以通過
@InitBinder注解取消綁定

  • POJO(Plain Old Java Object - 簡單的 Java 對象):?一個普通的、不依賴特定框架的 Java 類。表單綁定的目標對象首先是一個 POJO。

  • JavaBean:?一種遵循特定嚴格約定(無參構造、私有屬性、公共標準 Getter/Setter)的 POJO。正是這些約定使得 Web 框架能夠自動將表單提交的數據綁定到對象的屬性上。

  • 上面粗體子含義:?在 Spring MVC 等框架中,如果你創建一個符合 JavaBean 規范的類(比如?User),并將其作為控制器方法的參數(如?public String submitForm(User user)),那么框架在默認情況下,就能自動將 HTTP 請求中提交的表單字段的值,通過調用該?User?對象的對應 Setter 方法,填充到它的屬性中去。這就是“表單提交的數據都會和 POJO 類型的 JavaBean 屬性綁定”的意思。這里的“POJO 類型”強調目標是一個普通 Java 類,“JavaBean” 強調這個類需要遵循 JavaBean 規范以實現自動綁定。

  • Entity:?一種特殊用途的 POJO/JavaBean,用于代表需要持久化到數據庫的業務核心對象。它通過注解添加了數據庫映射的元數據(映射到哪個表、哪個是主鍵、字段映射、關系映射等)。強調與數據庫的映射關系。

1.編寫一個方法,使用@InitBinder標識的該方法,可以對WebDataBinder對象進行初始化。
????????WebDataBinder是DataBinder的子類,用于完成由表單字段到JavaBean屬性的綁定
2.@InitBinder方法不能有返回值,它必須聲明為void.
3.@InitBinder方法的參數通常是是WebDataBinder

應用實例

1.給MonsterHandler.java添加方法

    @InitBinderpublic void initBinder(WebDataBinder webDataBinder) {/*** 解讀* 1.方法上需要標注@InitBinder springmvc底層會初始化WebDataBinder* 2.調用webDataBinder.setDisallowedFields("name")表示取消指定屬性的綁定* 	即:當表單提交字段為name時,就不在把接收到的name值,填充到model數據monster的name屬性* 3.機制:springmvc在底層通過反射調用目標方法時,接收到http請求的參數和值,使用反射+注解* 技術取消對指定屬性的填充* 4.setDisallowedFields支特可變參數,可以填寫多個字段。比如("name","email")* 5.如果我們取消某個屬性綁定,驗證就沒有意義了,應當把驗證的注解去掉,否則容易出錯*     //@NotEmpty(message="不能為空")*     private String name;*/webDataBinder.setDisallowedFields("name");}

2.測試

后臺輸出:

name='null'

注意這兒的'null'就是null的意思。

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

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

相關文章

OpenCV 滑動條調整圖像對比度和亮度

一、知識點 1、int createTrackbar(const String & trackbarname, const String & winname, int * value, int count, TrackbarCallback onChange 0, void * userdata 0); (1)、創建一個滑動條并將其附在指定窗口上。 (2)、參數說明: trackbarname: 創建的…

ReadWriteLock(讀寫鎖)和 StampedLock

1. ReadWriteLock&#xff08;讀寫鎖&#xff09;&#xff1a;實現高性能緩存 總結&#xff1a; 要點 內容 適用場景 讀多寫少、高并發讀取場景&#xff08;如緩存&#xff09; 鎖類型 ReadWriteLock接口&#xff0c;ReentrantReadWriteLock實現 讀鎖 vs 寫鎖 多線程可…

【決勝公務員考試】求職OMG——見面課測驗1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答題&#xff0c;大家注意呀&#xff01; 博主碼字不易點個關注吧,祝期末順利~~ 1.單選題(2分) 下列說法錯誤的是:&#xff08; B &#xff09; A.選調生屬于公務員系統 B.公務員屬于事業編 C.選調生有基層鍛煉的要求 D…

vue3 el-button 自定義本地圖標

設置不生效的原因可能有&#xff1a;1.style標簽里沒加scoped <style scoped></style>2.本地圖片路徑指向錯誤3.自定義圖片長寬沒設置4.deep深度選擇器使用錯誤&#xff0c;vue3用:deep() <el-tooltip content"重新匹配" placement"top"&g…

如何在最短時間內提升打ctf(web)的水平?

剛剛刷完2遍 bugku 的 web 題&#xff0c;前來答題。 每個人對刷題理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟著writeup做了一遍就等于刷了&#xff0c;還有的人是獨立思考做了一遍就等于刷了。…

6.8 note

paxos算法_初步感知 Paxos算法保證一致性主要通過以下幾個關鍵步驟和機制&#xff1a; 準備階段 - 提議者向所有接受者發送準備請求&#xff0c;請求中包含一個唯一的編號。 - 接受者收到請求后&#xff0c;會檢查編號&#xff0c;如果編號比它之前見過的都大&#xff0c;就會承…

c++ openssl 使用 DES(數據加密標準)進行加密和解密的基本操作

使用 DES&#xff08;數據加密標準&#xff09;進行加密和解密的基本操作&#xff0c;重點展示了 ECB 和 CBC 模式&#xff0c;并且通過篡改密文的方式來進行攻擊。下面是對每個部分的詳細解析。 1. 結構體 Slip struct Slip {char from[16] { 0 }; // 交易的發起者&#x…

OpenWrt:使用ALSA實現邊錄邊播

ALSA是Linux系統中的高級音頻架構&#xff08;Advanced Linux Sound Architecture&#xff09;。目前已經成為了linux的主流音頻體系結構&#xff0c;想了解更多的關于ALSA的知識&#xff0c;詳見&#xff1a;http://www.alsa-project.org 在內核設備驅動層&#xff0c;ALSA提供…

【.net core】天地圖坐標轉換為高德地圖坐標(WGS84 坐標轉 GCJ02 坐標)

類文件 public static class WGS84ToGCJ02Helper {// 定義一些常量private const double PI 3.14159265358979324;private const double A 6378245.0;private const double EE 0.00669342162296594323;// 判斷坐標是否在中國范圍內&#xff08;不在國內則不進行轉換&#x…

Matlab自學筆記五十七:符號運算、可變精度運算、雙精度浮點型運算,三種運算精度的概念、比較、選擇和應用

1.可變精度算術的概念 默認的&#xff0c;Matlab雙精度浮點數使用16位數字精度&#xff0c;而符號數學工具箱的vpa函數&#xff0c;提供了無限大的可變精度&#xff0c;它默認使用32位數字精度&#xff0c;32位指的是有效數字的位數&#xff1b; 2.具體用法 程序示例&#x…

由匯編代碼確定switch語句

int switch2(int x) {int result0;switch(x){/* switch語句主體缺失 */}return result; }在編譯函數時&#xff0c;GCC為程序的初始部分以及跳轉表生成了如下匯編代碼。 1 MOVL 8(%ebp), %eax ;x位于相對于寄存器%ebp偏移量為8的地方。 2 ADDL $2, %eax …

java 使用HanLP 入門教程

1. 安裝 HanLP Maven 依賴 <dependency><groupId>com.hankcs</groupId><artifactId>hanlp</artifactId><version>portable-1.8.4</version> <!-- 最新版本請查看官網 --> </dependency>注意&#xff1a;portable 版本…

vm虛擬機添加虛擬機無反應,獲取所有權

問題描述 虛擬機忘記關機&#xff0c;就把電腦關了&#xff0c;早上打開用不了了&#xff0c;重新添加&#xff0c;也沒反應&#xff0c;獲取所有權后就沒了 問題解決 將虛擬機文件目錄下的.lck文件夾&#xff0c;刪除&#xff0c;或者改個名&#xff0c;我是改為了.backup方…

為何選擇Spring框架學習設計模式與編碼技巧?

&#x1f4cc; 結論先行 推薦項目&#xff1a;Spring Framework 推薦理由&#xff1a;設計模式覆蓋全面 編碼技巧教科書級實現 Java 生態基石地位 &#x1f3c6; 三維度對比分析 維度SpringMyBatisXXL-JOB設計模式??????????代碼抽象??????????生態價…

MySQL 索引:聚集索引與二級索引

在數據庫性能優化的征途中&#xff0c;索引無疑扮演著至關重要的角色。正確理解和使用索引&#xff0c;能夠顯著提升查詢效率&#xff0c;為應用帶來絲滑般的操作體驗。今天&#xff0c;我們將深入 MySQL 的心臟&#xff0c;重點探討 InnoDB 存儲引擎中兩種核心的索引類型&…

【Elasticsearch】映射:詳解 _source store 字段

映射&#xff1a;詳解 _source & store 字段 1._source 字段1.1 特點1.2 示例 2.store 字段2.1 特點2.2 示例 3.兩者對比3.1 使用建議3.2 實際應用示例 1._source 字段 _source 是 Elasticsearch 中一個特殊的元字段&#xff0c;它存儲了文檔在索引時的原始 JSON 內容。 …

新建網站部署流程

1. 新建 Node 服務&#xff0c;指定端口并代理前端靜態資源 操作步驟&#xff1a; 初始化 Node 項目mkdir my-website && cd my-website npm init -y npm install express創建 app.js&#xff08;示例代碼&#xff09;const express require(express); const app e…

時序數據庫IoTDB結合SeaTunnel實現高效數據同步

益、基本概念介紹 1.1 Apache IoTDB Apache IoTDB是一款專為工業物聯網設計的時序數據庫管理系統&#xff0c;集數據收集、存儲、管理與分析于一體&#xff0c;滿足海量數據存儲、高速讀取及復雜數據分析需求。其架構包括時序文件&#xff08;TsFile&#xff09;、數據庫引擎…

k8s業務程序聯調工具-KtConnect

概述 原理 工具作用是建立了一個從本地到集群的單向VPN&#xff0c;根據VPN原理&#xff0c;打通兩個內網必然需要借助一個公共中繼節點&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;簡化了建立連接的過程&#xff0c;apiserver間接起到了中繼節…

RFID推動新能源汽車零部件生產系統管理應用案例

RFID推動新能源汽車零部件生產系統管理應用案例 一、項目背景 新能源汽車零部件場景 在新能源汽車零部件生產領域&#xff0c;電子冷卻水泵等關鍵部件的裝配溯源需求日益增長。傳統 RFID 溯源方案采用 “網關 RFID 讀寫頭” 模式&#xff0c;存在單點位單獨頭溯源、網關布線…