Chapter4Chapter4_第1頁
Chapter4Chapter4_第2頁
Chapter4Chapter4_第3頁
Chapter4Chapter4_第4頁
Chapter4Chapter4_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

Chapter4 數(shù)據(jù)驗證與異常處理*課程回顧*1 傳參與取值2 高級參數(shù)綁定 *教學(xué)導(dǎo)航*1 數(shù)據(jù)校驗2 數(shù)據(jù)回顯3 SpringMvc異常處理1、 SpringMvc數(shù)據(jù)校驗這個比較好理解,就是用來驗證客戶輸入的數(shù)據(jù)是否合法,比如客戶登錄時,用戶名不能為空,或者不能超出指定長度等要求,這就叫做數(shù)據(jù)校驗。數(shù)據(jù)校驗分為客戶端校驗和服務(wù)端校驗客戶端校驗:js校驗服務(wù)端校驗:springmvc使用validation校驗,struts2使用validation校驗。都有自己的一套校驗規(guī)則。Springmvc本身沒有校驗功能,SpringMVC支持JSR(Java Specification Result,Java規(guī)范提案)303-Bean Validation數(shù)據(jù)驗證規(guī)范。而該規(guī)范的實現(xiàn)者很多,其中較常用的是Hibernate Validator。需要注意的是,Hibernate Validator是與Hibernate ORM并列的Hibernate的產(chǎn)品之一。# SpringMvc的校驗示例 #校驗思路:頁面提交請求的參數(shù),請求到controller方法中,使用validation進行校驗。如果校驗出錯,將錯誤信息展示到頁面。具體需求:商品修改,添加校驗(校驗商品名稱長度,價格的非空校驗),如果校驗出錯,在商品修改頁面顯示錯誤信息。(1) 在javaWeb工程項目SpringMvcTwo基礎(chǔ)上修改,添加依賴新的jar包在項目SrpingMvcTwo的基礎(chǔ)上增加Hibernate的校驗框架validation所需要jar包:hibernate-validator.jar,validation-api.jar,jboss-logging.jar,添加classmate.jar,否則出現(xiàn)java.lang.ClassNotFoundException: com.fasterxml.classmate.Filter(2) 在springmvc.xml中配置validator classpath:validationMessageSource (3) 將validator注冊到適配器中1. 方式一注解式(推薦):添加紅色部分2. 方式二:如果配置文件中使用的是非注解方式編寫的適配器,則這樣配置(4) 添加驗證提示信息資源文件在類的根路徑下添加資源文件:validationMessageSperties .size = 商品名稱必須是1-20個字符之間items.price.notnull = 商品價格不能為空(5) 在pojo中指定校驗規(guī)則在Item.java中添加校驗規(guī)則:列舉兩個校驗規(guī)則(使用的是注解校驗)private Integer id; /提示信息不用資源文件就只能直接用文字 Size(min=6,max=20,message=.size) private String name; NotNull(message=items.price.notnull) private Float price; private String detail; private String pic; private Date createtime;.size和items.createtime.notnull:就是讀取validationMessageSperties中的配置信息。從這里就可以理解該配置文件的意義,防止硬編碼。(6) controller中對其校驗綁定進行使用修改ItemController updateItem方法 RequestMapping(/updateitem) public String updateItem(Model model,Validated Item item,BindingResult bindingResult) if(bindingResult.hasErrors() List allErrors = bindingResult.getAllErrors(); for (ObjectError objectError : allErrors) System.out.println(objectError.getDefaultMessage(); model.addAttribute(allErrors,allErrors); return /goods/itemEdit.jsp; itemService.updateItemById(item); / 返回成功頁面 return /goods/success.jsp; 注意:1、Validated作用就是將pojo內(nèi)的注解數(shù)據(jù)校驗規(guī)則(NotNull等)生效,如果沒有該注解的聲明,pojo內(nèi)有注解數(shù)據(jù)校驗規(guī)則也不會生效2、BindingResult對象用來獲取校驗失敗的信息(NotNull中的message),與Validated注解必須配對使用,一前一后。3、代碼中的邏輯應(yīng)該很容易看懂,就是將result中所有的錯誤信息取出來,然后到原先的頁面將錯誤信息進行顯示,注意,要使用model對象,則需要在形參中聲明Model model(后面的內(nèi)容繼續(xù)介紹Model)。(7) 在內(nèi)頁顯示校驗錯誤提示信息:在itemEdit.jsp頁面添加下面紅色內(nèi)容 0$err.defaultMessage (8) tomcat部署運行顯示主頁,請求地址為:http:/localhost:8080/SpringMvcTwo/itemList.action入口進入修改頁面測試觀察結(jié)果#分組校驗 #在pojo中定義校驗規(guī)則,而pojo是被多個 controller所共用,當(dāng)不同的controller方法對同一個pojo進行校驗,但是每個controller方法可能需要不同的校驗。解決方法:定義多個校驗分組(其實是一個java接口),分組中定義有哪些規(guī)則每個controller方法使用不同的校驗分組1、 定義校驗分組接口就是定義空的接口,接口類只作為這個分組標(biāo)識來使用,看下面的用法,就知道其意義何在了2、 校驗規(guī)則中添加分組3、 在controller方法使用指定分組的校驗在這個方法中,那么就只會校驗item這個pojo中有ValidGroup1這個分組的校驗注解,而不會在校驗其他的2、 數(shù)據(jù)回顯1. 什么數(shù)據(jù)回顯提交后,如果出現(xiàn)錯誤,將剛才提交的數(shù)據(jù)回顯到剛才的提交頁面。2. 簡單類型數(shù)據(jù)回顯基本數(shù)據(jù)類型的數(shù)據(jù)可以使用最簡單方法使用model。model.addAttribute(id, id);3. pojo數(shù)據(jù)回顯方法1 springmvc默認對pojo數(shù)據(jù)進行回顯。pojo數(shù)據(jù)傳入controller方法后,springmvc自動將pojo數(shù)據(jù)放到request域,key等于pojo類型(首字母小寫)使用ModelAttribute指定pojo回顯到頁面在request中的key2 ModelAttribute還可以將方法的返回值傳到頁面在商品查詢列表頁面,通過商品類型查詢商品信息。在controller中定義商品類型查詢方法,最終將商品類型傳到頁面。3 使用最簡單方法使用model,可以不用ModelAttribute3、 異常處理springmvc在處理請求過程中出現(xiàn)異常信息交由異常處理器進行處理,自定義異常處理器可以實現(xiàn)一個系統(tǒng)的異常處理邏輯。(1) 異常處理思路系統(tǒng)中異常包括兩類:預(yù)期異常和運行時異常RuntimeException,前者通過捕獲異常從而獲取異常信息,后者主要通過規(guī)范代碼開發(fā)、測試通過手段減少運行時異常的發(fā)生。系統(tǒng)的dao、service、controller出現(xiàn)都通過throws Exception向上拋出,最后由springmvc前端控制器交由異常處理器進行異常處理,如左圖:springmvc提供全局異常處理器(一個系統(tǒng)只有一個異常處理器)進行統(tǒng)一異常處理。(2) 自定義異常類為了區(qū)別不同的異常通常根據(jù)異常類型自定義異常類,這里我們創(chuàng)建一個自定義系統(tǒng)異常,繼承Exception。public class CustomerException extends Exception private String expMessage;public CustomerException(String message) super(message); this.message = message;public CustomerException(String msg) this.expMessage = msg;public String getExpMessage() return expMessage;public void setExpMessage(String expMessage) this.expMessage = expMessage;(3) 自定義全局異常處理器思路:1. 解析出異常類型。2. 如果該異常類型是系統(tǒng)自定義的異常,直接取出異常信息,在錯誤頁面展示。3. 如果該異常類型不是系統(tǒng)自定義的異常,那么應(yīng)取出錯誤的堆棧信息,并記錄下來,在錯誤頁面展示。SpringMVC提供一個HandlerExceptionResolver接口,自定義全局異常處理器CustomeExceptionResolver必須要實現(xiàn)這個接口,所以編寫一個自定義全局異常處理器,如下:public class CustomeExceptionResolver implements HandlerExceptionResolver Overridepublic ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) /handler就是處理器適配器要執(zhí)行Handler對象(只有method)/解析出異常類型/如果該 異常類型是系統(tǒng) 自定義的異常,直接取出異常信息,在錯誤頁面展示/String message = null;/if(ex instanceof CustomException)/message = (CustomException)ex).getMessage();/else/如果該 異常類型不是系統(tǒng) 自定義的異常,構(gòu)造一個自定義的異常類型(信息為“未知錯誤”)/message=未知錯誤;/上邊代碼變?yōu)镃ustomException customException = null;if(ex instanceof CustomException)customException = (CustomException)ex;elsecustomException = new CustomException(未知錯誤);/錯誤信息String message = customException.getMessage();ModelAndView modelAndView = new ModelAndView();/將錯誤信息傳到頁面modelAndView.addObject(message, message);/指向錯誤頁面modelAndView.setViewName(error);return modelAndView;(4) 記得還要在/WEB-INF/jsp目錄下提供一個錯誤頁面error.jsp,如下:(5) 在springmvc.xml配置全局異常處理器就是覆蓋原先默認的異常處理器,沒配置就是使用默認的,默認的就是系統(tǒng)自帶的。拿到了異常就直接按我們經(jīng)常顯示404或者500或者別的錯誤信息的頁面返回。但是通過我們上面自定義的異常處理器,當(dāng)有異常時就捕捉到(為什么能捕捉到呢?所以為了讓其能夠捕捉到,所以我們需要配置我們自定義的異常處理器,這樣有了異常才會交給它來處理),然后進行處理,然后在轉(zhuǎn)到我們專門顯示錯誤的頁面(6) 異常測試在controller、service、dao中任意一處需要手動拋出異常。如果是程序中手動

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論