SSM整合之数据校验

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fjnmbb12/article/details/73862999

什么是校验?

一个项目中,通常使用校验较多的地方是前端的校验,比如说在页面中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>


 
  
 
  

最终效果

 
  
 
 


猜你喜欢

转载自blog.csdn.net/fjnmbb12/article/details/73862999