SSM整合之資料校驗
阿新 • • 發佈:2019-01-22
什麼是校驗?
一個專案中,通常使用校驗較多的地方是前端的校驗,比如說在頁面中js的校驗(表單驗證)。對於安全性要求較高的,則會要求在服務端也進行校驗。 服務端校驗: 控制層Controller: 校驗頁面請求引數(形參)的合法性。在控制層controller校驗,不區分客戶端型別(瀏覽器、手機客戶端、遠端介面的呼叫webService) 業務層Service(使用較多):主要校驗關鍵的業務引數,僅限於service介面中使用的引數 持久層dao:一般是不用校驗的springmvc校驗
springmvc使用hibernate的一個校驗框架validation(與hibernate無任何關係校驗思路
頁面提交請求的引數,請求到Controller方法中,使用validation進行校驗。若校驗出錯,則將錯誤資訊展示到頁面需求
商品修改,新增校驗(校驗商品名稱長度,日期的非空校驗),若校驗出錯,在商品修改頁面顯示錯誤資訊。環境準備
hibernate的校驗框架所需jar包:將其加入至工程librery
配置校驗器
<!-- 校驗器 --> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <!-- 校驗器--> <property name="providerClass" value="org.hibernate.validator.HibernateValidator" /> <!-- 指定校驗使用的資原始檔,在檔案中配置校驗的錯誤資訊,如果不指定則預設使用classpath下的ValidationMessages.properties --> <property name="validationMessageSource" ref="messageSource" /> </bean> <!-- 校驗錯誤資訊配置檔案 --> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <!-- 資原始檔名,使用basenames,不用加字尾名--> <property name="basenames"> <list> <value>classpath:CustomValidationMessages</value> </list> </property> <!-- 資原始檔編碼格式 --> <property name="fileEncodings" value="utf-8" /> <!-- 對資原始檔內容快取時間,單位秒 --> <property name="cacheSeconds" value="120" /> </bean>
注意:此處配置資原始檔名時,property的name是basenames,不是basename。要不會報錯。
將校驗器注入至處理器介面卡中
<mvc:annotation-driven conversion-service="conversionService" validator="validator"></mvc:annotation-driven>
在pojo中新增校驗規則
在ItemsCustom.java中新增校驗規則//校驗名稱:1-30字元之間 //message提示校驗出錯顯示的資訊 @Size(min = 1,max = 30,message = "{items.name.length.error}") private String name; private Float price; private String pic; //非空校驗 @NotNull(message = "{items.createtime.isNull}")
CustomValidationMessages.properties
配置校驗的所有錯誤資訊#新增校驗錯誤提示資訊
items.name.length.error = 請輸入1到30個字元的商品名稱
items.createtime.isNull = 請輸入商品的生產日期
注!!!!!!此處不支援中文,請使用ASCII格式編碼,如\u671f等
捕獲校驗錯誤資訊
//商品修改
//在需要校驗的pojo前,新增@Validated,在需要校驗的pojo後新增BindingResult bindingResult接收校驗出錯資訊
//注意!!@Validated和BindingResult bindingResult 是配對出現的,並且在形參裡的順序是固定的(一前一後)
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(HttpServletRequest request, Integer id, @Validated ItemsCustom itemsCustom , BindingResult bindingResult) throws Exception{
在頁面顯示校驗錯誤資訊
//在需要校驗的pojo前,新增@Validated,在需要校驗的pojo後新增BindingResult bindingResult接收校驗出錯資訊
//注意!!@Validated和BindingResult bindingResult 是配對出現的,並且在形參裡的順序是固定的(一前一後)
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(Model model,HttpServletRequest request, Integer id, @Validated ItemsCustom itemsCustom , BindingResult bindingResult) throws Exception{
//獲取校驗的錯誤資訊
if(bindingResult.hasErrors()){
//輸出錯誤資訊
List<ObjectError> allErrors = bindingResult.getAllErrors();
//將錯誤資訊傳至頁面
model.addAttribute("allErrors",allErrors);
//出錯則重新至商品更新頁面
return "items/editItems";
}
//呼叫service更新商品資訊,頁面需要將商品資訊傳到此方法
itemsService.updateItems(id,itemsCustom);
//頁面轉發
return "success";
}
頁面程式碼
<!-- 顯示錯誤資訊 -->
<c:if test="${allErrors != null }">
<c:forEach items="${allErrors }" var="error">
<font color="red" >${ error.defaultMessage}</font>
</c:forEach>
</c:if>