为控制器添加通知
与SpringAOP一样,SpringMVC也可以为控制器加入通知,它主要涉及4个注解:
- @ControllerAdvice:作用于类,用以标识全局性的控制的拦截器,将应用于对应的控制器
- @InitBinder:允许在构造控制器参数的时候,加入一定的自定义控制
- @ExceptionHandler:当控制器发生异常时,就会跳转到该方法上
- @ModelAttribute:先于控制器方法执行,当标注方法返回对象时,会保存到数据模型中,并传递给拦截的控制器
一个控制器通知的实例。
//标识控制器通知,并且指定对应的包 @ControllerAdvice(basePackages = {"com.wise.tiger.controller.advice"}) public class CommonControllerAdvice { /** * 定义http对应参数处理规则 */ @InitBinder public void initBinder(WebDataBinder binder){ //针对日期类型的格式化,其中CustomDateEditor是客户自定义编辑器 //boolean值表示是否允许为空 binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), false)); } @ModelAttribute //处理数据模型 public void populateModel(Model model){ model.addAttribute("projectName","peppa"); } //被拦截控制器出现Exception异常时,会调用该方法,该方法返回会返回exception视图 @ExceptionHandler(Exception.class) public String exception(){ return "exception"; } }
- @ControllerAdvice已经标记了@Component,它的属性packages则是指定拦截的控制器,然后通过注解@InitBinder可以获得一个参数----WebDataBinder,它是一个可以指定pojo参数属性转换的数据绑定。这里被拦截到的控制器关于日期对象的参数都会被它处理不需要我们自己制定Formatter了。
- @ModelAttribute是关于数据模型的,它会在进入控制器方法前运行,加入一个数据模型键值对"projectName"->"peppa".
- @ExceptionHandler作用是制定被拦截到的控制器发生异常后,如果异常匹配,就会使用该方法处理,返回视图exception去响应,这样可以避免异常页面的不友好
也可以在控制器当中使用@InitBinder、@ExceptionHandler、@ModelAttribute,此时标注的方法只对当前控制器有效,控制器形参可以通过@ModelAttribute("参数名")获得提前保存在数据模型中的数据,拿上面的例子来说,如果一个控制器方法想获得projectName参数的值:
@RequestMapping(value="getProjectName") public String getProjectName(@ModelAttribute("projectName") String name){ System.out.println(name);//name的最终值为peppa }
处理异常
控制器的通知注解@ExceptionHandler可以处理异常,此外,spring mvc还提供了其他的异常处理机制,使用它们可以获取更为精确的信息,从而为定位问题带来方便。在默认情况下,spring会将自身产生的异常转换为合适的状态码,通过这些状态码可以进一步确定异常发生的原因,以便找到对应的问题。
spring中部分异常默认映射码
BindException | 400 - Bad Request |
ConversionNotSupportedException | 500 - Internal Server Error |
HttpMediaTypeNotAcceptableException | 406 - Not Acceptable |
HttpMediaTypeNotSupportedException | 415 - Unsupported Media Type |
HttpMessageNotReadableException | 400 - Bad Request |
HttpMessageNotWritableException | 500 - Internal Server Error |
HttpRequestMethodNotSupportedException | 405 - Method Not Allowed |
MethodArgumentNotValidException | 400 - Bad Request |
MissingServletRequestParameterException | 400 - Bad Request |
MissingServletRequesPartException | 400 - Bad Request |
NoSuchRequestHandlingMethodException | 404 - Not Found |
TypeMismatchException | 400 - Bad Request |
有时候可以自定义一些异常,比如定义一个找不到角色异常
@ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "找不到角色信息异常") public class RoleException extends RuntimeException { // ... }通过注解@ResponseStatus将异常映射为某一种状态码,通过配置reason可以了解配置产生异常的原因。
- 处理方式一:通过配置专门的错误页(可以在web.xml中使用<error-page>标签进行配置)进行处理
<web-app> <error-page> <error-code>404</error-code> <location>/404.html</location> </error-page> </web-app>
- 处理方式二: 在Controller中添加一个或多个用于处理异常的方法并在方法上用@ExceptionHandler加以注解,并指明该方法可以处理的异常类型,该方法可以返回错误视图的视图名或者返回ModelAndView对象
@Controller public class RoleController { //当前控制器发生RoleException异常时,进入该方法 @ExceptionHandler(RoleException.class) public String handleRoleException(Model model, RoleException ex) { model.addAttribute("hint", ex.getMessage()); //返回指定的页面,避免不友好 return "error"; } }
- 处理方式三:多个控制器有公共的异常需要统一处理,那么可以通过@ControllerAdvice为控制器写一个处理异常的Advice
@ControllerAdvice public class ControllerExceptionAdvice { @ExceptionHandler(RoleException.class) public ModelAndView handleRE(Model model, RoleException ex) { ModelAndView mav = new ModelAndView("error"); mav.addObject("hint", ex.getMessage()); return mav; } }
相关推荐
6. **HandlerAdapter**:适配器模式,使得Spring MVC可以调用不同类型的控制器方法。 在创建Spring MVC项目时,我们需要进行以下步骤: 1. **项目初始化**:可以使用Spring Initializr或者Maven Archetype来快速...
它基于Spring框架,提供了模型-视图-控制器(MVC)架构,简化了开发过程并支持多种集成技术。在搭建Spring MVC环境时,需要引入一系列的jar包来确保所有组件能正常工作。以下将详细阐述这些关键jar包的作用及其在...
Spring MVC是Spring框架的一个核心模块,专为构建Web应用程序而设计。它提供了模型-视图-控制器(MVC)架构,使开发者能够更方便地处理HTTP请求、展示数据和控制业务逻辑。本压缩包包含了一系列Spring MVC运行所需的...
5. **引入(Introduction)**:允许在运行时为现有类添加新的方法或字段。 二、基于注解的AOP配置 1. **启用AOP代理**:在Spring配置文件中,通过元素启用基于注解的AOP。 ```xml <beans xmlns="http://www....
Spring MVC是Spring框架的一部分,它提供了模型-视图-控制器(MVC)架构,用于开发Web应用程序。以下是对给定文件信息中所提及的Jar包的详细说明: 1. **standard-1.1.2.jar**: 这个文件可能是Apache Commons Lang...
Spring MVC是Spring框架的一部分,它专注于Web应用程序的模型-视图-控制器(MVC)架构。而JdbcTemplate是Spring提供的一个工具类库,简化了与数据库的交互,无需编写大量SQL代码或手动管理连接。 首先,让我们从...
Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它提供了模型-视图-控制器(MVC)架构模式来构建可维护、可扩展的Web应用。Log4j 是一个广泛使用的日志记录框架,它提供了灵活的日志配置和多种输出格式,便于...
在Spring MVC中,我们通常使用@Controller注解来标识控制器类。 5. **RequestMapping**:这是一个常用的注解,用于将HTTP请求映射到控制器的方法上。例如,`@RequestMapping("/hello")`表示当访问"/hello"路径时,...
综合以上,本文通过具体的代码示例和技术细节深入讲解了如何使用Spring MVC拦截器实现session控制,包括如何监听session的创建和销毁,如何实现用户的重复登录控制以及如何在拦截器中处理未登录用户的访问权限问题,...
1. **spring-webmvc.jar**:这是 Spring MVC 的核心库,包含了 DispatcherServlet、HandlerMapping、ViewController、ViewResolver 等关键组件,负责处理 HTTP 请求并分发到对应的控制器。 2. **spring-beans.jar**...
Spring MVC 的核心在于提供了一个灵活的控制器,使得开发者可以方便地定义处理请求和响应的逻辑。 在搭建 Spring MVC 项目时,确保正确地引入所有必需的 jar 包至关重要。这些 jar 包通常来自 Spring 框架的核心库...
在Spring MVC框架中,AOP(面向切面编程)是一种强大的工具,用于实现跨切面的关注点,如日志、事务管理、权限控制等。当我们想通过注解方式拦截Controller层的方法时,可能会遇到一些问题。本文将详细介绍如何使用...
另外,确保你的MVC控制器方法不是静态的,因为静态方法不能被AOP代理。 最后,`index.jsp`、`WEB-INF`和`META-INF`这些文件是典型的Web应用结构,`index.jsp`是默认的入口页面,`WEB-INF`目录下通常存放应用的配置...
这个框架组合能够有效地实现模型-视图-控制器(MVC)架构,简化项目构建并提供强大的数据访问能力。下面将详细介绍SSM框架的各个组件以及它们在实际应用中的作用。 1. Maven: Maven是一个项目管理和综合工具,它...
Spring MVC通过注解简化了控制器类的编写,避免了XML配置的繁琐。主要的注解包括: 1. `@Controller`:标识一个类作为Spring MVC的控制器,处理HTTP请求。 2. `@RequestMapping`:用于映射HTTP请求,可以应用于类或...
Spring Web MVC是Spring框架的一部分,主要用于处理Web应用程序的模型-视图-控制器(MVC)架构。Struts则是Apache组织维护的另一个流行的MVC框架。当开发者需要在一个已经使用Struts的项目中引入Spring的高级特性,...
Spring MVC是Spring框架的一部分,它是一个轻量级的、模型-视图-控制器(MVC)架构,用于构建Web应用程序。AOP则是Spring框架的一个核心特性,它允许我们在不修改原有代码的情况下,插入新的行为或功能,比如日志...
- **Spring MVC**:负责处理HTTP请求,将请求映射到相应的控制器方法,支持RESTful风格的URL。 此外,系统还采用了工厂模式进行模块化开发,利用J2EE和AJAX技术增强了系统的动态扩展能力和用户体验。UML建模工具的...
`spring-mvc-3.1.xsd` 文件定义了与 MVC 相关的配置元素,如控制器(Controller)、视图解析器(View Resolver)、模型-视图映射(Model-View-Mapping)等。通过版本号 3.1,我们可以看到这是针对 Spring 3.1 版本的...