1. 程式人生 > >第四章 Controller介面控制器詳解(6)

第四章 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程式碼:
Java程式碼   收藏程式碼
  1. package org.springframework.validation;  
  2. public interface Errors {  
  3.   //=========================全域性錯誤訊息(驗證/繫結物件全域性的)=============================  
  4.   //註冊一個全域性的錯誤碼()
      
  5.   void reject(String errorCode);  
  6.   //註冊一個全域性的錯誤碼,當根據errorCode沒有找到相應錯誤訊息時,使用defaultMessage作為錯誤訊息  
  7.   void reject(String errorCode, String defaultMessage);  
  8.   //註冊一個全域性的錯誤碼,當根據errorCode沒有找到相應錯誤訊息時(帶錯誤引數的),使用defaultMessage作為錯誤訊息  
  9.   void reject(String errorCode, Object[] errorArgs, String defaultMessage);  
  10.   //=========================全域性錯誤訊息(驗證/繫結整個物件的)=============================  
  11.   //=========================區域性錯誤訊息(驗證/繫結物件欄位的)=============================  
  12.   //註冊一個物件欄位的錯誤碼,field指定驗證失敗的欄位名  
  13.   void rejectValue(String field, String errorCode);  
  14.   void rejectValue(String field, String errorCode, String defaultMessage);  
  15.   void rejectValue(String field, String errorCode, Object[] errorArgs, String defaultMessage);  
  16.   //=========================區域性錯誤訊息(驗證/繫結物件欄位的)=============================  
  17.   boolean hasErrors();      ////是否有錯誤  
  18.   boolean hasGlobalErrors(); //是否有全域性錯誤  
  19.   boolean hasFieldErrors();  //是否有欄位錯誤  
  20.   Object getFieldValue(String field); //返回當前驗證通過的值,或驗證失敗時失敗的值;  
  21. }  

 

getFieldValue:可以得到驗證失敗的失敗值,這是其他Web層框架很少支援的,這樣就可以給使用者展示出錯時的值(而不是空或其他的預設值等)。

 

BindingResult:代表資料繫結的結果,繼承了Errors介面。

BindException:代表資料繫結的異常,它繼承Exception,並實現了BindingResult,這是內部使用的錯誤物件。

 

示例:

(1、控制器

 

java程式碼: Java程式碼   收藏程式碼
  1. package cn.javass.chapter4.web.controller;  
  2. //省略import  
  3. public class ErrorController extends AbstractCommandController {  
  4.        public ErrorController() {  
  5.               setCommandClass(DataBinderTestModel.class);  
  6.               setCommandName("command");  
  7.        }  
  8.        @Override  
  9.        protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object command, BindException errors) throws Exception {     
  10.               //表示使用者名稱不為空  
  11.               errors.reject("username.not.empty");  
  12.               //帶有預設錯誤訊息  
  13.               errors.reject("username.not.empty1""使用者名稱不能為空1");  
  14.               //帶有引數和預設錯誤訊息          
  15.               errors.reject("username.length.error"new Object[]{510});  
  16.                
  17.               //得到錯誤相關的模型資料  
  18.               Map model = errors.getModel();  
  19.               return new ModelAndView("bindAndValidate/error", model);  
  20.        }  
  21. }  

 

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程式碼   收藏程式碼
  1. <bean id="messageSource"  
  2.        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
  3.     <property name="basename" value="classpath:messages"/>  
  4.     <property name="fileEncodings" value="utf-8"/>  
  5.     <property name="cacheSeconds" value="120"/>  
  6. </bean>  
  7.    
  8. <bean name="/error" class="cn.javass.chapter4.web.controller.ErrorController"/>  

 

messageSource:用於獲取錯誤碼對應的錯誤訊息的,而且bean名字預設必須是messageSource。

 

messages.properties(需要執行NativeToAscii)

 

java程式碼: Java程式碼   收藏程式碼
  1. username.not.empty=使用者名稱不能為空  
  2. username.length.error=使用者名稱長度不合法,長度必須在{0}到{1}之間  

 

(3、檢視頁面(WEB-INF/jsp/bindAndValidate/error.jsp)

 

java程式碼: Java程式碼   收藏程式碼
  1. <%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>  
  2. <!-- 表單的預設命令物件名為command -->  
  3. <form:form commandName="command">  
  4.     <form:errors path="*"></form:errors>  
  5. </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程式碼   收藏程式碼
  1. package cn.javass.chapter4.web.controller;  
  2. //省略import  
  3. public class DataBinderErrorTestController extends SimpleFormController {  
  4.        public DataBinderErrorTestController() {  
  5.               setCommandClass(DataBinderTestModel.class);  
  6.               setCommandName("dataBinderTest");  
  7.        }  
  8.        @Override  
  9.        protected ModelAndView showForm(HttpServletRequest request, HttpServletResponse response, BindException errors) throws Exception {  
  10.               //如果表單提交有任何錯誤都會再回到表單展示頁面  
  11.               System.out.println(errors);  
  12.               return super.showForm(request, response, errors);  
  13.        }  
  14.        @Override  
  15.        protected void doSubmitAction(Object command) throws Exception {  
  16.               System.out.println(command); //表單提交成功(資料繫結成功)進行功能處理  
  17.     }  
  18.        @Override  
  19.        protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {  
  20.               super.initBinder(request, binder);  
  21.               //註冊自定義的屬性編輯器  
  22.               //1、日期  
  23.               DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  24.               CustomDateEditor dateEditor = new CustomDateEditor(df, true);  
  25.               //表示如果命令物件有Date型別的屬性,將使用該屬性編輯器進行型別轉換  
  26.               binder.registerCustomEditor(Date.class, dateEditor);  
  27.                
  28.               //自定義的電話號碼編輯器  
  29.               binder.registerCustomEditor(PhoneNumberModel.classnew PhoneNumberEditor());  
  30.        }  
  31. }  

此處我們使用SimpleFormController;

showForm:展示表單,當提交表單有任何資料繫結錯誤會再回到該方法進行表單輸入(在此處我們列印錯誤物件);

doSubmitAction:表單提交成功,只要當表單的資料到命令物件繫結成功時,才會執行;

 

(2、spring配置檔案chapter4-servlet.xml

 

java程式碼: Java程式碼   收藏程式碼
  1. <bean name="/dataBindError"  
  2. class="cn.javass.chapter4.web.controller.DataBinderErrorTestController">  
  3.    <property name="formView" value="bindAndValidate/input"/>  
  4.    <property name="successView" value="bindAndValidate/success"/>  
  5. </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

跟開濤學SpringMVC4.4Controller介面控制器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註解定義我們

跟開濤學SpringMVC4.1Controller接口控制器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--開發6SVM開發

  在前面的幾篇文章中,我們介紹了EasyPR中車牌定位模組的相關內容。本文開始分析車牌定位模組後續步驟的車牌判斷模組。車牌判斷模組是EasyPR中的基於機器學習模型的一個模組,這個模型就是作者前文中從機器學習談起中提到的SVM(支援向量機)。  我們已經知道,車牌定位模組的輸出是一些候選車牌的圖片。但如何從