java元婴期(30)----java进阶(springmvc(4)---参数绑定(下)springmvc校验异常处理)
包裝類型pojo參數綁定
需求
商品查詢controller方法中實現商品查詢條件傳入。
實現方法
- 第一種方法:在形參中 添加HttpServletRequest request參數,通過request接收查詢條件參數。
- 第二種方法:在形參中讓包裝類型的pojo接收查詢條件參數。
???????? 分析:
???????? 頁面傳參數的特點:復雜,多樣性。條件包括 :用戶賬號、商品編號、訂單信息。。。
???????? 如果將用戶賬號、商品編號、訂單信息等放在簡單pojo(屬性是簡單類型)中,pojo類屬性比較多,比較亂。
???????? 建議使用包裝類型的pojo,pojo中屬性是pojo。
頁面參數和controller方法形參定義
頁面參數:
???????? 商品名稱:<input name="itemsCustom.name" />
???????? 注意:itemsCustom和包裝pojo中的屬性一致即可。
controller方法形參:
???????? public ModelAndView queryItems(HttpServletRequest request,ItemsQueryVo itemsQueryVo) throws Exception
集合類型綁定
數組綁定
需求
商品批量刪除,用戶在頁面選擇多個商品,批量刪除。
?
表現層實現
關鍵:將頁面選擇(多選)的商品id,傳到controller方法的形參,方法形參使用數組接收頁面請求的多個商品id。(思路)
controller方法定義:
頁面定義:
list綁定
需求
通常在需要批量提交數據時,將提交的數據綁定到list<pojo>中,比如:成績錄入(錄入多門課成績,批量提交),
本例子需求:批量商品修改,在頁面輸入多個商品信息,將多個商品信息提交到controller方法中。
表現層實現
controller方法定義:
?使用List接收頁面提交的批量數據,通過包裝pojo接收,在包裝pojo中定義list<pojo>屬性
頁面定義:
?
map綁定
?
也通過在包裝pojo中定義map類型屬性。
在包裝類中定義Map對象,并添加get/set方法,action使用包裝對象接收。
包裝類中定義Map對象如下:
Public class QueryVo { private Map<String, Object> itemInfo = new HashMap<String, Object>();//get/set方法.. }頁面定義如下:
<tr> <td>學生信息:</td> <td> 姓名:<inputtype="text"name="itemInfo['name']"/> 年齡:<inputtype="text"name="itemInfo['price']"/> .. .. .. </td> </tr>Contrller方法定義如下:
public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{ System.out.println(queryVo.getStudentinfo()); }?
springmvc校驗
校驗理解
項目中,通常使用較多是前端的校驗,比如頁面中js校驗。對于安全要求較高點建議在服務端進行校驗。
服務端校驗:
???????? 控制層conroller:校驗頁面請求的參數的合法性。在服務端控制層conroller校驗,不區分客戶端類型(瀏覽器、手機客戶端、遠程調用)
???????? 業務層service(使用較多):主要校驗關鍵業務參數,僅限于service接口中使用的參數。
???????? 持久層dao:一般是不校驗的。
springmvc校驗需求
springmvc使用hibernate的校驗框架validation(和hibernate沒有任何關系)。
校驗思路:
???????? 頁面提交請求的參數,請求到controller方法中,使用validation進行校驗。如果校驗出錯,將錯誤信息展示到頁面。
具體需求:
???????? 商品修改,添加校驗(校驗商品名稱長度,生產日期的非空校驗),如果校驗出錯,在商品修改頁面顯示錯誤信息。
環境準備
hibernate的校驗框架validation所需要jar包:
配置校驗器
校驗器注入到處理器適配器中
?
在pojo中添加校驗規則
在ItemsCustom.java中添加校驗規則:
CustomValidationMessages.properties
在CustomValidationMessages.properties配置校驗錯誤信息:
捕獲校驗錯誤信息
//在需要校驗的pojo前邊添加@Validated,在需要校驗的pojo后邊添加BindingResult bindingResult接收校驗出錯信息
?? //注意:@Validated和BindingResult bindingResult是配對出現,并且形參順序是固定的(一前一后)。
在頁面顯示校驗錯誤信息
在controller中將錯誤信息傳到頁面即可。
頁面顯示錯誤信息:
?
分組校驗
需求
在pojo中定義校驗規則,而pojo是被多個 controller所共用,當不同的controller方法對同一個pojo進行校驗,但是每個controller方法需要不同的校驗。
解決方法:
定義多個校驗分組(其實是一個java接口),分組中定義有哪些規則
每個controller方法使用不同的校驗分組
校驗分組
在校驗規則中添加分組
在controller方法使用指定分組的校驗
?
?
?
?
異常處理
系統中異常包括兩類:預期異常和運行時異常RuntimeException,前者通過捕獲異常從而獲取異常信息,后者主要通過規范代碼開發、測試通過手段減少運行時異常的發生。
???????? 系統的dao、service、controller出現都通過throws Exception向上拋出,最后由springmvc前端控制器交由異常處理器進行異常處理,如下圖:
springmvc提供全局異常處理器(一個系統只有一個異常處理器)進行統一異常處理。
??????????????自定義異常類
對不同的異常類型定義異常類,繼承Exception。
全局異常處理器
思路:
???????? 系統遇到異常,在程序中手動拋出,dao拋給service、service給controller、controller拋給前端控制器,前端控制器調用全局異常處理器。
???????? 全局異常處理器處理思路:
?????????????????? 解析出異常類型
- ?????????????????? 如果該 異常類型是系統 自定義的異常,直接取出異常信息,在錯誤頁面展示
- ?????????????????? 如果該 異常類型不是系統 自定義的異常,構造一個自定義的異常類型(信息為“未知錯誤”)
springmvc提供一個HandlerExceptionResolver接口
@Overridepublic ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) {//handler就是處理器適配器要執行Handler對象(只有method)// 解析出異常類型 // 如果該 異常類型是系統 自定義的異常,直接取出異常信息,在錯誤頁面展示 // String message = null; // if(ex instanceof CustomException){ // message = ((CustomException)ex).getMessage(); // }else{如果該 異常類型不是系統 自定義的異常,構造一個自定義的異常類型(信息為“未知錯誤”) // message="未知錯誤"; // }//上邊代碼變為CustomException customException = null;if(ex instanceof CustomException){customException = (CustomException)ex;}else{customException = new CustomException("未知錯誤");}//錯誤信息String message = customException.getMessage();ModelAndView modelAndView = new ModelAndView();//將錯誤信息傳到頁面modelAndView.addObject("message", message);//指向錯誤頁面modelAndView.setViewName("error");return modelAndView;}錯誤頁面
在springmvc.xml配置全局異常處理器
異常測試
在controller、service、dao中任意一處需要手動拋出異常。
如果是程序中手動拋出的異常,在錯誤頁面中顯示自定義的異常信息,如果不是手動拋出異常說明是一個運行時異常,在錯誤頁面只顯示“未知錯誤”。
在商品修改的controller方法中拋出異常 .
在service接口中拋出異常:
如果與業務功能相關的異常,建議在service中拋出異常。
與業務功能沒有關系的異常,建議在controller中拋出。
上邊的功能,建議在service中拋出異常。
總結
以上是生活随笔為你收集整理的java元婴期(30)----java进阶(springmvc(4)---参数绑定(下)springmvc校验异常处理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java元婴期(29)----java进
- 下一篇: java元婴期(31)----java进