Validation

在我们的Struts2中,我们是继承ActionSupport来实现校验的…它有两种方式来实现校验的功能

  • 手写代码
  • XML配置
    • 这两种方式也是可以特定处理方法或者整个Action的

而SpringMVC使用JSR-303(javaEE6规范的一部分)校验规范,springmvc使用的是Hibernate Validator(和Hibernate的ORM无关)

快速入门

导入jar包

配置校验器

  1. <!-- 校验器 -->
  2. <bean id="validator"
  3. class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
  4. <!-- 校验器 -->
  5. <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
  6. <!-- 指定校验使用的资源文件,如果不指定则默认使用classpath下的ValidationMessages.properties -->
  7. <property name="validationMessageSource" ref="messageSource" />
  8. </bean>

错误信息的校验文件配置


  1. <!-- 校验错误信息配置文件 -->
  2. <bean id="messageSource"
  3. class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
  4. <!-- 资源文件名 -->
  5. <property name="basenames">
  6. <list>
  7. <value>classpath:CustomValidationMessages</value>
  8. </list>
  9. </property>
  10. <!-- 资源文件编码格式 -->
  11. <property name="fileEncodings" value="utf-8" />
  12. <!-- 对资源文件内容缓存时间,单位秒 -->
  13. <property name="cacheSeconds" value="120" />
  14. </bean>

添加到自定义参数绑定的WebBindingInitializer中


  1. <!-- 自定义webBinder -->
  2. <bean id="customBinder"
  3. class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
  4. <!-- 配置validator -->
  5. <property name="validator" ref="validator" />
  6. </bean>

最终添加到适配器中


  1. <!-- 注解适配器 -->
  2. <bean
  3. class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
  4. <!-- 在webBindingInitializer中注入自定义属性编辑器、自定义转换器 -->
  5. <property name="webBindingInitializer" ref="customBinder"></property>
  6. </bean>

创建CustomValidationMessages配置文件

定义规则

  1. package entity;
  2. import javax.validation.constraints.NotNull;
  3. import javax.validation.constraints.Size;
  4. import java.util.Date;
  5. public class Items {
  6. private Integer id;
  7. //商品名称的长度请限制在1到30个字符
  8. @Size(min=1,max=30,message="{items.name.length.error}")
  9. private String name;
  10. private Float price;
  11. private String pic;
  12. //请输入商品生产日期
  13. @NotNull(message="{items.createtime.is.notnull}")
  14. private Date createtime;
  15. private String detail;
  16. public Integer getId() {
  17. return id;
  18. }
  19. public void setId(Integer id) {
  20. this.id = id;
  21. }
  22. public String getName() {
  23. return name;
  24. }
  25. public void setName(String name) {
  26. this.name = name == null ? null : name.trim();
  27. }
  28. public Float getPrice() {
  29. return price;
  30. }
  31. public void setPrice(Float price) {
  32. this.price = price;
  33. }
  34. public String getPic() {
  35. return pic;
  36. }
  37. public void setPic(String pic) {
  38. this.pic = pic == null ? null : pic.trim();
  39. }
  40. public Date getCreatetime() {
  41. return createtime;
  42. }
  43. public void setCreatetime(Date createtime) {
  44. this.createtime = createtime;
  45. }
  46. public String getDetail() {
  47. return detail;
  48. }
  49. public void setDetail(String detail) {
  50. this.detail = detail == null ? null : detail.trim();
  51. }
  52. }

测试:

  1. <%--
  2. Created by IntelliJ IDEA.
  3. User: ozc
  4. Date: 2017/8/11
  5. Time: 9:56
  6. To change this template use File | Settings | File Templates.
  7. --%>
  8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9. <html>
  10. <head>
  11. <title>测试文件上传</title>
  12. </head>
  13. <body>
  14. <form action="${pageContext.request.contextPath}/validation.action" method="post" >
  15. 名称:<input type="text" name="name">
  16. 日期:<input type="text" name="createtime">
  17. <input type="submit" value="submit">
  18. </form>
  19. </body>
  20. </html>

Controller需要在校验的参数上添加@Validation注解…拿到BindingResult对象…


  1. @RequestMapping("/validation")
  2. public void validation(@Validated Items items, BindingResult bindingResult) {
  3. List<ObjectError> allErrors = bindingResult.getAllErrors();
  4. for (ObjectError allError : allErrors) {
  5. System.out.println(allError.getDefaultMessage());
  6. }
  7. }

由于我在测试的时候,已经把日期转换器关掉了,因此提示了字符串不能转换成日期,但是名称的校验已经是出来了…


分组校验

分组校验其实就是为了我们的校验更加灵活,有的时候,我们并不需要把我们当前配置的属性都进行校验,而需要的是当前的方法仅仅校验某些的属性。那么此时,我们就可以用到分组校验了…

步骤:

  • 定义分组的接口【主要是标识】
  • 定于校验规则属于哪一各组
  • 在Controller方法中定义使用校验分组


统一异常处理

在我们之前SSH,使用Struts2的时候也配置过统一处理异常…

当时候是这么干的:

  • 在service层中自定义异常
  • 在action层也自定义异常
  • 对于Dao层的异常我们先不管【因为我们管不着,dao层的异常太致命了】
  • service层抛出异常,Action把service层的异常接住,通过service抛出的异常来判断是否让请求通过
  • 如果不通过,那么接着抛出Action异常
  • 在Struts的配置文件中定义全局视图,页面显示错误信息

详情可看:http://blog.csdn.net/hon_3y/article/details/72772559

那么我们这次的统一处理异常的方案是什么呢????

我们知道Java中的异常可以分为两类

  • 编译时期异常
  • 运行期异常

对于运行期异常我们是无法掌控的,只能通过代码质量、在系统测试时详细测试等排除运行时异常

而对于编译时期的异常,我们可以在代码手动处理异常可以try/catch捕获,可以向上抛出。

我们可以换个思路,自定义一个模块化的异常信息,比如:商品类别的异常


  1. public class CustomException extends Exception {
  2. //异常信息
  3. private String message;
  4. public CustomException(String message){
  5. super(message);
  6. this.message = message;
  7. }
  8. public String getMessage() {
  9. return message;
  10. }
  11. public void setMessage(String message) {
  12. this.message = message;
  13. }
  14. }

我们在查看Spring源码的时候发现:前端控制器DispatcherServlet在进行HandlerMapping、调用HandlerAdapter执行Handler过程中,如果遇到异常,在系统中自定义统一的异常处理器,写系统自己的异常处理代码。。

我们也可以学着点,定义一个统一的处理器类来处理异常…

定义统一异常处理器类


  1. public class CustomExceptionResolver implements HandlerExceptionResolver {
  2. //前端控制器DispatcherServlet在进行HandlerMapping、调用HandlerAdapter执行Handler过程中,如果遇到异常就会执行此方法
  3. //handler最终要执行的Handler,它的真实身份是HandlerMethod
  4. //Exception ex就是接收到异常信息
  5. @Override
  6. public ModelAndView resolveException(HttpServletRequest request,
  7. HttpServletResponse response, Object handler, Exception ex) {
  8. //输出异常
  9. ex.printStackTrace();
  10. //统一异常处理代码
  11. //针对系统自定义的CustomException异常,就可以直接从异常类中获取异常信息,将异常处理在错误页面展示
  12. //异常信息
  13. String message = null;
  14. CustomException customException = null;
  15. //如果ex是系统 自定义的异常,直接取出异常信息
  16. if(ex instanceof CustomException){
  17. customException = (CustomException)ex;
  18. }else{
  19. //针对非CustomException异常,对这类重新构造成一个CustomException,异常信息为“未知错误”
  20. customException = new CustomException("未知错误");
  21. }
  22. //错误 信息
  23. message = customException.getMessage();
  24. request.setAttribute("message", message);
  25. try {
  26. //转向到错误 页面
  27. request.getRequestDispatcher("/WEB-INF/jsp/error.jsp").forward(request, response);
  28. } catch (ServletException e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. } catch (IOException e) {
  32. // TODO Auto-generated catch block
  33. e.printStackTrace();
  34. }
  35. return new ModelAndView();
  36. }
  37. }

配置统一异常处理器


  1. <!-- 定义统一异常处理器 -->
  2. <bean class="cn.itcast.ssm.exception.CustomExceptionResolver"></bean>


SpringMVC第六篇【校验、统一处理异常】的更多相关文章

  1. SpringMVC【校验器、统一处理异常、RESTful、拦截器】

    前言 本博文主要讲解的知识点如下: 校验器 统一处理异常 RESTful 拦截器 Validation 在我们的Struts2中,我们是继承ActionSupport来实现校验的...它有两种方式来实 ...

  2. 【Python之旅】第六篇(七):开发简易主机批量管理工具

    [Python之旅]第六篇(七):开发简易主机批量管理工具 python 软件开发 Paramiko模块 批量主机管理 摘要: 通过前面对Paramiko模块的学习与使用,以及Python中多线程与多 ...

  3. “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第六篇(图片新闻的添加以及带分页的静态页的生成)

    “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第六篇(图片新闻的添加以及带分页的静态页的生成) 一.这篇文章主要是要实现:图片新闻的添加,无刷新图片的上传,以及添加新闻静 ...

  4. SpringBoot统一处理异常

    在springboot项目,报错有着默认的提示,这篇文章介绍一下如何统一处理异常. 新建项目,pom文件如下: <?xml version="1.0" encoding=&q ...

  5. SpringMVC 使用JSR-303进行校验 @Valid

    注意:1 public String save(@ModelAttribute("house") @Valid House entity, BindingResult result ...

  6. Flask最强攻略 - 跟DragonFire学Flask - 第六篇 Flask 中内置的 Session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 1. Flask 中 session 是需要 secret_key 的 from ...

  7. SpringMVC由浅入深day02_5数据回显_6异常处理器

    5 数据回显 5.1 什么数据回显 表单提交失败需要再回到表单页面重新填写,原来提交的数据需要重新在页面上显示. 5.2 pojo数据回显方法 1.springmvc默认对pojo数据进行回显. po ...

  8. 第六篇 ANDROID窗口系统机制之显示机制

    第六篇 ANDROID窗口系统机制之显示机制 ANDROID的显示系统是整个框架中最复杂的系统之一,涉及包括窗口管理服务.VIEW视图系统.SurfaceFlinger本地服务.硬件加速等.窗口管理服 ...

  9. 【SpringMVC学习06】SpringMVC中的数据校验

    这一篇博文主要总结一下springmvc中对数据的校验.在实际中,通常使用较多是前端的校验,比如页面中js校验,对于安全要求较高的建议在服务端也要进行校验.服务端校验可以是在控制层conroller, ...

随机推荐

  1. 【Ubuntu16】apt-get安装MariaDB

    一.Mysql背景信息 Mysql在互联网早期就流行了,追求速度.简单.坚持开源.几乎支持所有操作系统.完全支持多用户.多线程,支持海量数据存储,采用MyISAM.InnoDB两大存储引擎优势互补.但 ...

  2. Eclipse关闭项目

    Eclipse 关闭项目 为什么要关闭项目? Eclipse 工作空间包含了多个项目.一个项目可以是关闭或开启状态. 项目打开过多影响有: 消耗内存 占用编译时间:在删除项目.class 文件(Cle ...

  3. HBuilder打包App方法

    HBuilder是DCloud(数字天堂)推出的一款支持HTML5的Web开发IDE.该软件既可以支持web代码编写,也可以将已经编写好的项目代码打包为手机APP. HBuilder提供的打包有云端打 ...

  4. TCON板新选择--NCS8807 LVDS转mLVDS芯片

    NCS8807 LVDS-to-mLVDS w/ Scaler (4K TCON w/ Scaler) General Description NCS8807 is an LVDS 4K TCON w ...

  5. 安装sklearn过程

    sklearn是scikit-learn的简称,诸多python工具包都需要这个库 安装顺序: wheel numpy scipy sklearn 因为这个库一直安装不好,都没有动力继续深造机器学习了 ...

  6. LVS之-LAMP搭建wordpress

    author:JevonWei 版权声明:原创作品 LVS搭建wordpress,涉及的知识点有DNS,LAMP,NFS及LVS 网络拓扑图 网络环境 NFS 192.168.198.130 mysq ...

  7. JS中 事件冒泡与事件捕获

    [JS中的事件流]  1.事件冒泡:当某DOm元素触发一种事件时,会从当前节点开始,逐级往上触发其祖先节点的同类型事件,直到DOM根节点:   >>>什么情况下会产生事件冒泡 ① D ...

  8. chrome开发工具指南(八)

    编辑 DOM Chrome DevTools 的 Elements 面板中的 DOM 树视图可以显示当前网页的 DOM 结构.通过 DOM 更新实时修改页面的内容和结构. DOM 定义您的页面结构.每 ...

  9. Swiper 滑动

    1.http://www.swiper.com.cn/download/  下载Swiper.JS  Swiper.CSS 2.引入项目,添加html <div class="cont ...

  10. 软工+C(2017第1期) 题目设计、点评和评分

    // 下一篇:分数和checklist 如何设计题目 教学中的一个问题是老师出题太简单了,题目设计一开始上来就不紧凑,我认为一个好的课程应该上来就给你紧凑感,而不是先上来"轻松2-3周&qu ...