1. 程式人生 > >SSM整合之資料校驗

SSM整合之資料校驗

什麼是校驗?

一個專案中,通常使用校驗較多的地方是前端的校驗,比如說在頁面中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>


最終效果