Spingmvc中数据校验和异常处理详解

*springmvc使用JSR-303校验规范,JSR-303是javaEE6的规范。
springmvc具体使用hibernate-validator校验框架(和hibernate的ORM没有关系),基于的bean的属性校验。*
所以需要导入jar包:
Spingmvc中数据校验和异常处理详解_第1张图片

1:springmvc中数据校验的实现

1.1注解用法:具体可以参考:hibernate官方文档:http://docs.jboss.org/hibernate/validator/4.2/reference/zh-CN/html_single/#validator-usingvalidator

简单介绍下:
Spingmvc中数据校验和异常处理详解_第2张图片
Spingmvc中数据校验和异常处理详解_第3张图片
1.2使用bean校验,需要的配置,需要在springmvc中配置:


如果不使用配置文件直接在注解中写入错误信息,需要配置校验器
<!-- 配置bean的校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
       <!-- 校验器-->
</bean>

然后在mvc注解驱动中引用即可
<mvc:annotation-driven validator="validator"/>
<context:component-scan base-package="com.leige.controler" />


如果使用错误配置文件需要在注解中使用占位符,替换错误信息
配置如下:
<!-- 配置bean的校验器 -->
<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">
        <!-- 资源文件名-->
        <property name="basenames">   
         <list>    
            <!-- 错误配置信息,注意不要写文件后缀studentValidationMessages.properties, 这个错误,害我调了两个多小时fuck 千万不要写 -->
            <value>classpath:studentValidationMessages</value> 
         </list>   
        </property>
        <!-- 资源文件编码格式 -->
        <property name="fileEncodings" value="utf-8" />
        <!-- 对资源文件内容缓存时间,单位秒 -->
        <property name="cacheSeconds" value="120" />
</bean>
然后引用即可:
<mvc:annotation-driven validator="validator"/>
<context:component-scan base-package="com.leige.controler" />

在bean字段上使用注解校验,这里一起综合讲一下,分组校验,配置文件校验,还希望大家能接受:


public class Student {

    private Integer sid;

    /** * 数据校验的错误信息可以直接写在注解中如(@NotNull(message="name不可为空")  @Size(min=3,max=15,message="名字必须在3-15之间")) * ,也可以写在配置文件中如(  @NotNull(message="${student.error.age.null}")),使用占位符替代 * 前提是首先要springmvc中加载配置文件,读取错误信息 * */
    @NotNull(message="{student.name.null}",groups=(Validation1.class))
    @Size(min=3,max=15,message="{student.name.size}",groups=(Validation1.class))
    private String name;
    @NotNull(message="{student.age.null}",groups=(Validation1.class))
    private Integer age;
    setter..
    getter...
}

分组校验使用接口区分,不能使用类,接口中什么都不需要写,只是起到区分的作用,表示该校验规则使用哪个组,groups也可以同时指定多个分组

Spingmvc中数据校验和异常处理详解_第4张图片

controler中应用校验规则


    /** * @param model * @param student * @param bindingResult * @Validated和bindingResult是配对使用, * 位置要固定,@Validated在校验的po对象的前边, * bindingResult用于接收校验错误信息,要放在被校验对象的后边。 * @Validated(value=(Validation1.class)指定适用于哪个组 */
    @RequestMapping("/insert.action")
    public String insertStudent(@Validated(value=(Validation1.class)) Student student,BindingResult bindingResult,Model model){

        if(bindingResult.hasErrors()){//如果校验出错,则显示错误信息,并且回显
            model.addAttribute("errors", bindingResult.getAllErrors());
            //返回原页面
            return "insert";
        }else{
            studentService.insert(student);
            //成功返回success页面
            return "success";
        }

    }

页面显示代码:

<form action="${pageContext.request.contextPath }/student/insert.action" method="post">
name<input type="text" name="name" value="${student.name }"><br/>
age:<input type="text" name="age" value="${student.age }"><br/>
<input type="submit"  value="添加" >
<hr/>
</form>
打印校验信息
<c:forEach items="${errors}" var="err">
${err.defaultMessage }
</c:forEach>

演示结果:
Spingmvc中数据校验和异常处理详解_第5张图片

2:springmvc中异常处理流程:

Spingmvc中数据校验和异常处理详解_第6张图片
2.1所以,异常处理首先创建自定义异常

package com.leige.exception;

public class StudentException extends Exception {
    //接收异常信息
    public StudentException(String message) {
        super(message);

    }

}

2.2创建自定义异常的异常处理器

package com.leige.exception.handler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import com.leige.exception.StudentException;

/** * @author 自定义异常处理器需要实现springmvc异常处理接口HandlerExceptionResolver * * */
public class StudentExceptionHandler implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex) {
        // TODO Auto-generated method stub
        //判断异常类型
    ModelAndView modelAndView=new ModelAndView();
        if(ex instanceof StudentException){
            StudentException studentException=(StudentException) ex;
            //处理自定义异常
            modelAndView.addObject("error",studentException.getMessage());
        }else{
            //如果是runtime异常,提示异常信息,例如:网站忙,请稍后连接
            modelAndView.addObject("error","网站忙,请稍后连接");
        }
        //设置异常页面 
        modelAndView.setViewName("WEB-INF/jsp/error");
        return modelAndView;
    }

}

2.3创建异常页面就不用说了

2.4在springmvc中配置异常处理器,只需要加入如下配置即可:

<!-- 异常处理器 ,配置你的自定义异常处理器-->
<bean class="com.leige.exception.handler.StudentExceptionHandler"></bean>

测试大家可以自己测试,这里就不在演示了,异常处理机制和struts2的有很多地方都是类似的\

最最重要的一点需要注意::

注意注意
*异常处理器可以配置多个
配置多个异常处理器的目的是针对不同的异常类型分别进行处理,并且springmvc在执行异常处理器时是按配置的顺序去执行的,但是需要注意的是除最后一个异常处理器返回ModelAndView外,其它的异常处理器返回null,springmvc源代码如下:*
Spingmvc中数据校验和异常处理详解_第7张图片

你可能感兴趣的:(java,框架,异常处理,springMVC,ee,数据校验)