第四章 Controller介面控制器詳解(6)
4.16.2、資料驗證
1、資料繫結失敗:比如需要數字卻輸入了字母;
2、資料不合法:可以認為是業務錯誤,通過自定義驗證器驗證,如使用者名稱長度必須在5-20之間,我們卻輸入了100個字元等;
3、錯誤物件:當我們資料繫結失敗或驗證失敗後,錯誤資訊存放的物件,我們叫錯誤物件,在Spring Web MVC中Errors是具體的代表者;執行緒不安全物件;
4、錯誤訊息:是硬編碼,還是可配置?實際工作應該使用配置方式,我們只是把錯誤碼(errorCode)放入錯誤物件,在展示時讀取相應的錯誤訊息配置檔案來獲取要顯示的錯誤訊息(errorMessage);
4.16.2.1、驗證流程
1、首先進行資料繫結驗證,如果驗證失敗會通過MessageCodesResolver生成錯誤碼放入Errors錯誤物件;
2、資料不合法驗證,通過自定義的驗證器驗證,如果失敗需要手動將錯誤碼放入Errors錯誤物件;
4.16.2.2、錯誤物件和錯誤訊息
錯誤物件的代表者是Errors介面,並且提供了幾個實現者,在Spring Web MVC中我們使用的是如下實現:
相關的錯誤方法如下:
Errors:儲存和暴露關於資料繫結錯誤和驗證錯誤相關資訊的介面,提供了相關儲存和獲取錯誤訊息的方法:
java程式碼:
- package org.springframework.validation;
- public interface Errors {
- //=========================全域性錯誤訊息(驗證/繫結物件全域性的)=============================
- //註冊一個全域性的錯誤碼()
- void reject(String errorCode);
- //註冊一個全域性的錯誤碼,當根據errorCode沒有找到相應錯誤訊息時,使用defaultMessage作為錯誤訊息
- void reject(String errorCode, String defaultMessage);
- //註冊一個全域性的錯誤碼,當根據errorCode沒有找到相應錯誤訊息時(帶錯誤引數的),使用defaultMessage作為錯誤訊息
- void reject(String errorCode, Object[] errorArgs, String defaultMessage);
- //=========================全域性錯誤訊息(驗證/繫結整個物件的)=============================
- //=========================區域性錯誤訊息(驗證/繫結物件欄位的)=============================
- //註冊一個物件欄位的錯誤碼,field指定驗證失敗的欄位名
- void rejectValue(String field, String errorCode);
- void rejectValue(String field, String errorCode, String defaultMessage);
- void rejectValue(String field, String errorCode, Object[] errorArgs, String defaultMessage);
- //=========================區域性錯誤訊息(驗證/繫結物件欄位的)=============================
- boolean hasErrors(); ////是否有錯誤
- boolean hasGlobalErrors(); //是否有全域性錯誤
- boolean hasFieldErrors(); //是否有欄位錯誤
- Object getFieldValue(String field); //返回當前驗證通過的值,或驗證失敗時失敗的值;
- }
getFieldValue:可以得到驗證失敗的失敗值,這是其他Web層框架很少支援的,這樣就可以給使用者展示出錯時的值(而不是空或其他的預設值等)。
BindingResult:代表資料繫結的結果,繼承了Errors介面。
BindException:代表資料繫結的異常,它繼承Exception,並實現了BindingResult,這是內部使用的錯誤物件。
示例:
(1、控制器
java程式碼: Java程式碼
- package cn.javass.chapter4.web.controller;
- //省略import
- public class ErrorController extends AbstractCommandController {
- public ErrorController() {
- setCommandClass(DataBinderTestModel.class);
- setCommandName("command");
- }
- @Override
- protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object command, BindException errors) throws Exception {
- //表示使用者名稱不為空
- errors.reject("username.not.empty");
- //帶有預設錯誤訊息
- errors.reject("username.not.empty1", "使用者名稱不能為空1");
- //帶有引數和預設錯誤訊息
- errors.reject("username.length.error", new Object[]{5, 10});
- //得到錯誤相關的模型資料
- Map model = errors.getModel();
- return new ModelAndView("bindAndValidate/error", model);
- }
- }
errors.reject("username.not.empty"):註冊全域性錯誤碼“username.not.empty”,我們必須提供messageSource來提供錯誤碼“username.not.empty”對應的錯誤資訊(如果沒有會丟擲NoSuchMessageException異常);
errors.reject("username.not.empty1", "使用者名稱不能為空1"):註冊全域性錯誤碼“username.not.empty1”,如果從messageSource沒沒有找到錯誤碼“username.not.empty1”對應的錯誤資訊,則將顯示預設訊息“使用者名稱不能為空1”;
errors.reject("username.length.error", new Object[]{5, 10}):錯誤碼為“username.length.error”,而且錯誤資訊需要兩個引數,如我們在我們的配置檔案中定義“使用者名稱長度不合法,長度必須在{0}到{1}之間”,則實際的錯誤訊息為“使用者名稱長度不合法,長度必須在5到10之間”
errors.getModel():當有錯誤資訊時,一定將errors.getModel()放入我們要返回的ModelAndView中,以便使用裡邊的錯誤物件來顯示錯誤資訊。
(2、spring配置檔案chapter4-servlet.xml
java程式碼: Java程式碼
- <bean id="messageSource"
- class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
- <property name="basename" value="classpath:messages"/>
- <property name="fileEncodings" value="utf-8"/>
- <property name="cacheSeconds" value="120"/>
- </bean>
- <bean name="/error" class="cn.javass.chapter4.web.controller.ErrorController"/>
messageSource:用於獲取錯誤碼對應的錯誤訊息的,而且bean名字預設必須是messageSource。
messages.properties(需要執行NativeToAscii)
java程式碼: Java程式碼
- username.not.empty=使用者名稱不能為空
- username.length.error=使用者名稱長度不合法,長度必須在{0}到{1}之間
(3、檢視頁面(WEB-INF/jsp/bindAndValidate/error.jsp)
java程式碼: Java程式碼
- <%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
- <!-- 表單的預設命令物件名為command -->
- <form:form commandName="command">
- <form:errors path="*"></form:errors>
- </form:form>
form標籤庫:此處我們使用了spring的form標籤庫;
<form:form commandName="command">:表示我們的表單標籤,commandName表示繫結的命令物件名字,預設為command;
<form:errors path="*"></form:errors>:表示顯示錯誤資訊的標籤,如果path為“*”表示顯示所有錯誤資訊。
接下來我們來看一下 資料繫結失敗和資料不合法時,如何處理。
4.16.2.3、資料繫結失敗
如我們的DataBinderTestModel類:
bool:boolean型別,此時如果我們前臺傳入非相容的資料,則會資料繫結失敗;
date:Date型別,此時如果我們前臺傳入非相容的資料,同樣會資料繫結失敗;
phoneNumber:自定義的PhoneNumberModel型別,如果如果我們前臺傳入非相容的資料,同樣會資料繫結失敗。
示例:
(1、控制器,DataBinderErrorTestController。
java程式碼: Java程式碼
- package cn.javass.chapter4.web.controller;
- //省略import
- public class DataBinderErrorTestController extends SimpleFormController {
- public DataBinderErrorTestController() {
- setCommandClass(DataBinderTestModel.class);
- setCommandName("dataBinderTest");
- }
- @Override
- protected ModelAndView showForm(HttpServletRequest request, HttpServletResponse response, BindException errors) throws Exception {
- //如果表單提交有任何錯誤都會再回到表單展示頁面
- System.out.println(errors);
- return super.showForm(request, response, errors);
- }
- @Override
- protected void doSubmitAction(Object command) throws Exception {
- System.out.println(command); //表單提交成功(資料繫結成功)進行功能處理
- }
- @Override
- protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
- super.initBinder(request, binder);
- //註冊自定義的屬性編輯器
- //1、日期
- DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- CustomDateEditor dateEditor = new CustomDateEditor(df, true);
- //表示如果命令物件有Date型別的屬性,將使用該屬性編輯器進行型別轉換
- binder.registerCustomEditor(Date.class, dateEditor);
- //自定義的電話號碼編輯器
- binder.registerCustomEditor(PhoneNumberModel.class, new PhoneNumberEditor());
- }
- }
此處我們使用SimpleFormController;
showForm:展示表單,當提交表單有任何資料繫結錯誤會再回到該方法進行表單輸入(在此處我們列印錯誤物件);
doSubmitAction:表單提交成功,只要當表單的資料到命令物件繫結成功時,才會執行;
(2、spring配置檔案chapter4-servlet.xml
java程式碼: Java程式碼
- <bean name="/dataBindError"
- class="cn.javass.chapter4.web.controller.DataBinderErrorTestController">
- <property name="formView" value="bindAndValidate/input"/>
- <property name="successView" value="bindAndValidate/success"/>
- </bean>
(3、檢視頁面(WEB-INF/jsp/bindAndValidate/ input.jsp)
java程式碼:
相關推薦
第四章 Controller介面控制器詳解(6)
4.16.2、資料驗證 1、資料繫結失敗:比如需要數字卻輸入了字母; 2、資料不合法:可以認為是業務錯誤,通過自定義驗證器驗證,如使用者名稱長度必須在5-20之間,我們卻輸入了100個字元等; 3、錯誤物件:當我們資料繫結失敗或驗證失敗後,錯誤資訊存放的物件,我們叫錯誤物件,在S
第四章 Controller介面控制器詳解(5)
4.16、資料型別轉換和資料驗證 流程: 1、首先建立資料繫結器,在此此會建立ServletRequestDataBinder類的物件,並設定messageCodesResolver(錯誤碼解析器); 2、提供第一個擴充套件點,初始化資料繫結器,在此處我們可以覆蓋該方法註
第四章 Controller介面控制器詳解(4)
4.15、MultiActionController 之前學過的控制器如AbstractCommandController、SimpleFormController等一般對應一個功能處理方法(如新增),如果我要實現比如最簡單的使用者增刪改查(CRUD Create-Read-Update-Del
第四章 Controller介面控制器詳解(3)
4.11、AbstractWizardFormController 嚮導控制器類提供了多步驟(嚮導)表單的支援(如完善個人資料時分步驟填寫基本資訊、工作資訊、學校資訊等) 假設現在做一個完善個人資訊的功能,分三個頁面展示: 1、頁面1完善基本資訊; 2、頁面2完善學校資訊;
第四章 Controller介面控制器詳解(2)
4.5、ServletForwardingController 將接收到的請求轉發到一個命名的servlet,具體示例如下: java程式碼: Java程式碼
Controller介面控制器詳解(2)
4.5、ServletForwardingController 將接收到的請求轉發到一個命名的servlet,具體示例如下: package cn.javass.chapter4.web.servlet; public class ForwardingServle
跟開濤學SpringMVC(4.4):Controller介面控制器詳解(4)
4.12、ParameterizableViewController 引數化檢視控制器,不進行功能處理(即靜態檢視),根據引數的邏輯檢視名直接選擇需要展示的檢視。 Java程式碼 1 2 3 4 <bean name="/par
第六章 註解式控制器詳解——SpringMVC強大的資料繫結(2)
6.6.2、@RequestParam繫結單個請求引數值 @RequestParam用於將請求引數區資料對映到功能處理方法的引數上。 public String requestparam1(@RequestParam String username) 請求中包含username引數(如/
第六章 註解式控制器詳解—SpringMVC強大的資料繫結(1)
到目前為止,請求已經能交給我們的處理器進行處理了,接下來的事情是要進行收集資料啦,接下來我們看看我們能從請求中收集到哪些資料,如圖6-11: 圖6-11 1、@RequestParam繫結單個請求引數值; 2、@PathVariabl
第六章 註解式控制器詳解
6.1、註解式控制器簡介 一、Spring2.5之前,我們都是通過實現Controller介面或其實現來定義我們的處理器類。已經@Deprecated。 二、Spring2.5引入註解式處理器支援,通過@Controller 和 @RequestMapping註解定義我們的處理器類。 並
【Java】SpringMVC Controller介面控制器詳解
1、ParameterizableViewController 引數化檢視控制器,不進行功能處理(即靜態檢視),根據引數的邏輯檢視名直接選擇需要展示的檢視。 Java程式碼 <bean name="/parameterizableView" class
第六章 註解式控制器詳解——註解式控制器執行流程及處理器定義
6.1、註解式控制器簡介 一、Spring2.5之前,我們都是通過實現Controller介面或其實現來定義我們的處理器類。已經@Deprecated。 二、Spring2.5引入註解式處理器支援,通過@Controller 和 @RequestMapping註解定義我們
跟開濤學SpringMVC(4.1):Controller接口控制器詳解(1)
詳解 shu fix gmv 控制器 input abstract pre pdf http://www.importnew.com/19397.html http://blog.csdn.net/u014607184/article/details/5207453
“全棧2019”Java第三十章:數組詳解(下篇)
允許 頭條 維數 數組 學習小組 更多 同步 技術 intel 難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文鏈接 “全棧2019”Java第三十章:數組詳解(下篇)
GZIP壓縮原理分析(04)——第三章 gzip檔案格式詳解(三02) gzip檔案頭
檔案頭由固定長度的部分和擴充套件部分組成,擴充套件部分不一定存在,尤其是網路傳輸使用的HTTP壓縮,如果使用了gzip格式,那麼對應的壓縮報文一般都不帶擴充套件部分。gzip檔案格式通過將頭部中定長部
跟我學Kafka之Controller控制器詳解(一)
我們的kafka原始碼分享已經進行過很多期了,主要的內容也都分享的差不多了,那麼那麼在今後的分享中,主要集中在kafka效能優化和使用 Kafka叢集中的其中一個Broker會被選舉為Controller,主要負責Partition管理和副本狀態管理,也會執行類似於重分配Partition之類的管理任務
抽象類和介面的詳解(例項)
抽象類和介面在我們的程式碼中,生活中息息相關,與上圖所示,操縱複雜,密切相關,那麼問題來了,何謂抽象類,何謂介面? 帶著這層薄紗,慢慢揭開這層薄紗;也許在古代,新婚之夜,透過這層薄紗,你看到的或者是驚喜,或許是驚悚,不要怕,無論是驚悚還是驚喜,她都會伴你一
面向介面程式設計詳解(三)——模式研究
通過前面兩篇,我想各位朋友對“面向介面程式設計”的思想有了一定認識,並通過第二篇的例子,獲得了一定的直觀印象。但是,第二篇中的例子旨在展示面向介面程式設計的實現方法,比較簡單,不能體現出面向介面程式設計的優勢和這種思想的內涵。那麼,這一篇作為本系列的終結篇,將通過分析幾個比較
git 使用詳解(6)—— 3種撤消操作
direct ash 存在 其中 分支 stash card mas 相關 接下來,我們會介紹一些基本的撤消操作相關的命令。請註意,有些操作並不總是可以撤消的,所以請務必謹慎小心,一旦失誤,就有可能丟失部分工作成果。 修改最後一次提交 git commit --amend
EasyPR--開發詳解(6)SVM開發詳解
在前面的幾篇文章中,我們介紹了EasyPR中車牌定位模組的相關內容。本文開始分析車牌定位模組後續步驟的車牌判斷模組。車牌判斷模組是EasyPR中的基於機器學習模型的一個模組,這個模型就是作者前文中從機器學習談起中提到的SVM(支援向量機)。 我們已經知道,車牌定位模組的輸出是一些候選車牌的圖片。但如何從