前言:本篇主要介绍SpringMVC的数据绑定流程中数据校验的相关概念与用法。
Spring MVC 通过HandlerExceptionResolver处理程序的异常,包括 Handler 映射、数据绑定以及目标方法执行时发生的异常。测试页面如下:
1. HandlerExceptionResolver的实现类
DispatcherServlet 会默认装配HandlerExceptionResolver实现类:
若没有使用 <mvc:annotation-driven/> 配置:
- AnnotationMethodHandlerExceptionResolver(已过时);
- ResponseStatusExceptionResolver;
- DefaultHandlerExceptionResolver;
若使用 <mvc:annotation-driven/> 配置:
- ExceptionHandlerExceptionResolver;
- ResponseStatusExceptionResolver;
- DefaultHandlerExceptionResolver;
使用SpringMVC作为MVC框架时,一般都需要配置<mvc:annotation-driven/>,ExceptionHandlerExceptionResolver也是主要处理Hander中异常的主要手段。
2. ExceptionHandlerExceptionResolver
ExceptionHandlerExceptionResolver主要处理控制器Handler中用@ExceptionHandler注解定义的方法。
@ExceptionHandler 注解定义的方法优先级问题:例如. 发生的是NullPointerException,但是声明的异常有RuntimeException 和 Exception,此候会根据异常的最近继承关系找到继承深度最浅的那个@ExceptionHandler注解方法,即标记了 RuntimeException 的方法。
ExceptionHandlerMethodResolver内部若找不到@ExceptionHandler注解的方法,会全局找@ControllerAdvice中的@ExceptionHandler方法。
后台测试代码:
@RequestMapping("/testExceptionHandlerExceptionResolver.action") public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i){ System.out.println("result: " + (10 / i)); // 除数为0的话会出现ArithmeticException运行时异常 return "success"; } /** * 1. 在 @ExceptionHandler 方法的入参中可以加入 Exception 类型的参数, 该参数即对应发生的异常对象 * 2. @ExceptionHandler 方法的入参中不能传入 Map. 若希望把异常信息传导页面上, 需要使用 ModelAndView 作为返回值 * 3. @ExceptionHandler 方法标记的异常有优先级的问题. * 4. @ControllerAdvice: 如果在当前 Handler 中找不到 @ExceptionHandler 方法来出来当前方法出现的异常, * 则将去 @ControllerAdvice 标记的类中查找 @ExceptionHandler 标记的方法来处理异常. */ @ExceptionHandler({ArithmeticException.class}) public ModelAndView handleArithmeticException(Exception ex){ System.out.println("【ArithmeticException】: " + ex); ModelAndView mv = new ModelAndView("error"); mv.addObject("exception", ex); return mv; } @ExceptionHandler({RuntimeException.class}) public ModelAndView handleArithmeticException2(Exception ex){ System.out.println("【RuntimeException】: " + ex); ModelAndView mv = new ModelAndView("error"); mv.addObject("exception", ex); return mv; }
如果testExceptionHandlerExceptionResolver方法抛出ArithmeticException异常,根据异常优先级,会先被handleArithmeticException方法捕获。如果上述handleArithmeticException和handleArithmeticException2异常处理方法都未定义,但在SpringMVCTestExceptionHandler类中定义异常处理,如下所示:
@ControllerAdvice public class SpringMVCTestExceptionHandler { @ExceptionHandler({ArithmeticException.class}) public ModelAndView handleArithmeticException(Exception ex){ System.out.println("【ControllerAdvice】" + ex); ModelAndView mv = new ModelAndView("error"); mv.addObject("exception", ex); return mv; } }
处理器内部若找不到@ExceptionHandler注解的方法,会全局找@ControllerAdvice中的@ExceptionHandler方法进行异常处理。
3. ResponseStatusExceptionResolver
在控制器方法上或是修饰异常类使用@ResponseStatus 注解,则ResponseStatusExceptionResolver会使用这个注解的属性进行处理。
后台测试代码:
1. 首先@ResponseStatus修饰异常处理类:
@ResponseStatus(value=HttpStatus.FORBIDDEN, reason="自定义异常") public class CustomizedException extends RuntimeException{ private static final long serialVersionUID = 1L; }
2. 然后是@ResponseStatus在控制器中修饰方法(测试中同时是功能处理方法):
@ResponseStatus(reason="测试",value=HttpStatus.NOT_FOUND) @RequestMapping("/testResponseStatusExceptionResolver.action") public String testResponseStatusExceptionResolver(@RequestParam("i") int i){ if(i == 13){ throw new CustomizedException(); } System.out.println("testResponseStatusExceptionResolver..."); return "success"; }
说明:若i == 13,则返回异常类定义的响应;若i != 13,则返回异常方法定义的响应。
3. 前台代码略,可参见附件代码
4. 测试结果
(测试的时候将ExceptionHandlerExceptionResolver对异常处理的操作去掉,以免会捕获i == 13时抛出的自定义异常!)
当i == 13时
当 i != 13时:
4. DefaultHandlerExceptionResolver
DefaultHandlerExceptionResolver对一些特殊的异常进行处理,如:
相关推荐
7. **异常处理**:SpringMVC允许自定义全局或特定异常处理器,可以捕获和处理程序运行时可能出现的异常,将其转换为适当的HTTP响应。 8. **国际化与本地化**:SpringMVC支持多语言环境,通过资源文件配置,可以提供...
11. **异常处理**:全局异常处理器可以通过实现 `HandlerExceptionResolver` 接口或使用 `@ExceptionHandler` 注解来捕获并处理异常,提供统一的错误页面。 12. **Ajax 支持**:Spring MVC 也支持异步请求处理,...
SpringMVC提供了丰富的功能,包括依赖注入、数据绑定、异常处理以及视图解析等,使得开发者可以更专注于业务逻辑,而不是基础设施的实现。 Ajax,即Asynchronous JavaScript and XML,是一种在无需重新加载整个网页...
将两者集成可以实现灵活的数据访问和高效的业务处理。在"springmvc_mybatis3.01.zip"压缩包中,包含了一个SpringMVC与MyBatis 3.01集成的实例,同时也涉及到了事务管理和安全漏洞的相关知识。 1. **SpringMVC与...
7. **统一异常处理**: 可以通过`@ExceptionHandler`注解自定义全局异常处理器,提高代码的可维护性。 8. **改进的测试支持**: 提供了`MockMVC`类,方便进行单元测试和集成测试。 ### JPA(Java Persistence API) ...
**异常处理**:通过 `@ExceptionHandler` 注解,你可以自定义全局或特定控制器的异常处理策略,以优雅地处理程序中的异常。\n\n9. **RESTful 风格**:Spring MVC 支持创建 RESTful API,通过 `@RestController` ...
13. **异常处理**:通过 @ExceptionHandler 或统一异常处理类,可以优雅地处理应用程序中抛出的异常,提供友好的错误页面。 14. **数据绑定和验证**:Spring MVC 自动支持模型属性与请求参数的绑定,以及基于 JSR-...
因此,我们需要添加异常处理机制,捕获并处理这些异常,向用户返回友好的错误信息。 6. **安全考虑** 为了防止恶意文件上传,应限制上传文件的大小、类型,并确保上传的文件名安全,避免路径遍历攻击。同时,对...
5. **异常处理(Exception Handling)**:通过统一的异常处理机制,可以优雅地处理程序中的异常,提供友好的错误页面。 6. **RESTful支持**:SpringMVC通过注解可以轻松实现RESTful风格的Web服务,便于API开发。 7...
SpringMVC还提供了一整套工具来处理表单数据、异常处理和视图解析。 **MyBatis**:MyBatis 是一个轻量级的持久层框架,它解决了Java开发中数据库操作的繁琐性。MyBatis允许开发者将SQL语句直接写在XML配置文件或者...
5. **异常处理** 使用`@ExceptionHandler`注解,可以自定义处理特定异常的方法,提升代码的可维护性和可读性。全局异常处理器`@ControllerAdvice`可以统一处理所有控制器中的异常。 6. **验证与数据绑定** ...
例如,我们可以使用 `@ExceptionHandler` 注解来定义特定异常的处理逻辑,或者使用 JSR-303/JSR-349 验证注解(如 `@NotNull`, `@Size` 等)来确保数据的有效性。 9. **视图解析器** 视图解析器(如 ...
3. `@ExceptionHandler`:捕获并处理异常,提供统一的错误页面或响应。 以上是对SpringMVC中注解的概述,实际开发中还有许多其他注解,如`@SessionAttribute`、`@CookieValue`、`@RequestParam`等,它们共同构成了...
6. **异常处理**:Controller 中可以通过 `@ExceptionHandler` 注解来处理特定的运行时异常,或者定义全局异常处理器,增强应用的健壮性。 7. **国际化与主题支持**:Spring MVC 提供了国际化和主题切换的功能,...
SpringMVC是Spring框架的一个核心部分,它提供了全面的MVC功能,包括注解驱动的控制器、数据绑定、异常处理、国际化支持以及与Spring其他模块(如AOP、事务管理)的无缝集成。 至于压缩包内的“新建文本文档.txt”...
它简化了Web应用的开发,通过DispatcherServlet进行请求分发,HandlerMapping处理映射,ModelAndView构建模型和视图,ViewResolver解析视图,以及一系列拦截器和异常处理器。 1. 请求处理流程:客户端发起请求到达...
异常处理 SpringMVC_1_开发环境搭建 SpringMVC_10_拦截器 SpringMVC_2_HelloWorld SpringMVC_3_方法入参 SpringMVC_4_方法返回值 SpringMVC_5_常用注解 SpringMVC_6_数据校验 SpringMVC_7_国际化 SpringMVC_8_标签库...
此外,Spring MVC还支持数据绑定、异常处理、视图解析等特性,大大提高了开发效率。 接着,我们来看MyBatis。MyBatis是一个SQL映射框架,它将SQL语句与Java代码分离,使得数据库操作更加直观和简单。MyBatis通过XML...
7. **异常处理**: 通过@ControllerAdvice和@ExceptionHandler注解,可以全局处理应用程序可能抛出的异常,提供统一的错误页面。 8. **RESTful Web服务**: Spring MVC 支持构建RESTful API,通过HTTP动词(GET、...
本篇将详细介绍如何利用Maven和SpringMVC来实现统一的异常处理机制。 首先,我们需要理解什么是统一异常处理。在Web应用中,异常处理通常是分散在各个控制器方法中的,这使得代码复用性差,且不易维护。统一异常...