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

*springmvc使用JSR-303校验规范,JSR-303是javaEE6的规范。

springmvc具体使用hibernate-validator校验框架(和hibernate的ORM没有关系),基于的bean的属性校验。*

所以需要导入jar包:

1:springmvc中数据校验的实现

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

简单介绍下:

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也可以同时指定多个分组

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>

演示结果:

2:springmvc中异常处理流程:

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源代码如下:*

时间: 2024-10-11 13:49:41

Spingmvc中数据校验和异常处理详解的相关文章

linux-2.6.26内核中ARM中断实现详解(转)

转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJRaD 作者:刘洪涛,华清远见嵌入式学院金牌讲师,ARM ATC授权培训讲师. 看了一些网络上关于linux中断实现的文章,感觉有一些写的非常好,在这里首先感谢他们的无私付出,然后也想再补充自己对一些问题的理解.先从函数注册引出问题吧. 一.中断注册方法 在linux内核中用于申请中断的函数是req

python中的tcp示例详解

python中的tcp示例详解  目录 TCP简介 TCP介绍 TCP特点 TCP与UDP的不同点 udp通信模型 tcp客户端 tcp服务器 tcp注意点 TCP简介 TCP介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义. TCP通信需要经过创建连接.数据传送.终止连接三个步骤. TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发

iOS中UIWebView的使用详解

iOS中UIWebView的使用详解 一.初始化与三种加载方式 UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种: 第一种: - (void)loadRequest:(NSURLRequest *)request; 这是加载网页最常用的一种方式,通过一个网页URL来进行加载,这个URL可以是远程的也可以是本地的,例如我加载百度的主页:     UIWebView * view = [[UIWebView al

JQuery中$.ajax()方法参数详解

url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 delete也可以使用,但仅部分浏览器支持. timeout: 要求为Number类型的参数,设置请求超时时间(毫秒).此设置将覆盖$.ajaxSetup()方法的全局设 置. async:要求为Boolean类型的参数,默认设置为true,所有请求均为异步请求. 如果需要发送同步请求,请将此选项

Scala 深入浅出实战经典 第53讲:Scala中结构类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/pR_4sY0cJLs/优酷:http://v.youku.com/v_show/id_

js 中中括号,大括号使用详解

一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数.如:var LangShen = {"Name":"Langshen","AGE":"28"};上面声明了一个名为"LangShen"的对象,多个属性或函数用,(逗号)隔开,因为是对象的属性,所以访问时,应该用.(点)来层层访问:LangShen.Name.LangShen.AGE,当然我们也可以用数组的方式来访问,如:Lang

PHP异常处理详解

PHP异常处理详解 异常处理(又称为错误处理)功能提供了处理程序运行时出现的错误或异常情况的方法. 异常处理通常是防止未知错误产生所采取的处理措施.异常处理的好处是你不用再绞尽脑汁去考虑各种错误,这为处理某一类错误提供了一个很有效的方法,使编程效率大大提高.当异常被触发时,通常会发生:          当前代码状态被保存         代码执行被切换到预定义的异常处理器函数          根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚

java中的io系统详解

java中的io系统详解 分类: JAVA开发应用 笔记(读书.心得)2009-03-04 11:26 46118人阅读 评论(37) 收藏 举报 javaiostreamconstructorstringbyte 相关读书笔记.心得文章列表 Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他

JDK中的URLConnection参数详解

JDK中的URLConnection参数详解 来自:http://www.blogjava.net/supercrsky/articles/247449.html 针对JDK中的URLConnection连接Servlet的问题,网上有虽然有所涉及,但是只是说明了某一个或几个问题,是以FAQ的方式来解决的,而且比较零散,现在对这个类的使用就本人在项目中的使用经验做如下总结: 1:> URL请求的类别: 分为二类,GET与POST请求.二者的区别在于:      a:) get请求可以获取静态页面