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 id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
       
bean>

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


如果使用错误配置文件需要在注解中使用占位符,替换错误信息
配置如下:

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
       
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
        
        <property name="validationMessageSource" ref="messageSource" />
    bean>

    
    <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        
        <property name="basenames">   
         <list>    
            
            <value>classpath:studentValidationMessagesvalue> 
         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";
        }

    }

页面显示代码:

"${pageContext.request.contextPath }/student/insert.action" method="post"> nametype="text" name="name" value="${student.name }">
age:type="text" name="age" value="${student.age }">
type="submit" value="添加" >
打印校验信息 forEach items="${errors}" var="err"> ${err.defaultMessage } 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张图片

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