转自:https://blog.csdn.net/qq924862077/article/details/53524507
对SpringMVC有所了解的人肯定接触过HandlerInterceptor拦截器,HandlerInterceptor接口给我们提供了3个方法:
(1)preHandle: 在执行controller处理之前执行,返回值为boolean ,返回值为true时接着执行postHandle和afterCompletion,如果我们返回false则中断执行
(2)postHandle:在执行controller的处理后,在ModelAndView处理前执行
(3)afterCompletion :在DispatchServlet执行完ModelAndView之后执行
源码如下:
- public interface HandlerInterceptor {
- /**
- * preHandle方法是进行处理器拦截用的,顾名思义,该方法将在Controller处理之前进行调用,SpringMVC中的Interceptor拦截器是链式的,可以同时存在
- * 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在
- * Controller方法调用之前调用。SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返
- * 回值为false,当preHandle的返回值为false的时候整个请求就结束了。
- */
- boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
- throws Exception;
- /**
- * 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之
- * 后,也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操
- * 作。这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor拦截器该方法反而会后调用,这跟Struts2里面的拦截器的执行过程有点像,
- * 只是Struts2里面的intercept方法中要手动的调用ActionInvocation的invoke方法,Struts2中调用ActionInvocation的invoke方法就是调用下一个Interceptor
- * 或者是调用action,然后要在Interceptor之前调用的内容都写在调用invoke之前,要在Interceptor之后调用的内容都写在调用invoke方法之后。
- */
- void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
- throws Exception;
- /**
- * 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行,
- * 这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。
- */
- void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
- throws Exception;
- }
- public class MyInterceptor implements HandlerInterceptor {
- /**
- * @Title: preHandle
- * @Description: 在执行controller之前运行
- * @param request
- * @param response
- * @param handler
- * @return
- * @throws Exception
- */
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- return true;
- }
- /**
- * @Title: postHandle
- * @Description: 在执行完controller之后,ModelAndView渲染之前开始运行
- * @param request
- * @param response
- * @param handler
- * @param modelAndView
- * @throws Exception
- */
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
- throws Exception {
- }
- /**
- * @Title: afterCompletion
- * @Description: 该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图后执行
- * @param request
- * @param response
- * @param handler
- * @param ex
- * @throws Exception
- */
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
- throws Exception {
- }
- }
(1)preHandle: 在执行controller处理之前执行,返回值为boolean ,返回值为true时接着执行postHandle和afterCompletion,如果我们返回false则中断执行
(2)postHandle:在执行controller的处理后,在ModelAndView处理前执行
(3)afterCompletion :在DispatchServlet执行完ModelAndView之后执行
(4)afterConcurrentHandlingStarted:这个方法会在Controller方法异步执行时开始执行,而Interceptor的postHandle方法则是需要等到Controller的异步执行完才能执行,只要继承这个类并实现其方法就可以了。
- public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
- /**
- * This implementation always returns {@code true}.
- */
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
- throws Exception {
- return true;
- }
- /**
- * This implementation is empty.
- */
- @Override
- public void postHandle(
- HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
- throws Exception {
- }
- /**
- * This implementation is empty.
- */
- @Override
- public void afterCompletion(
- HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
- throws Exception {
- }
- /**
- * This implementation is empty.
- */
- @Override
- public void afterConcurrentHandlingStarted(
- HttpServletRequest request, HttpServletResponse response, Object handler)
- throws Exception {
- }
- }
AsyncHandlerInterceptor也是一个接口,提供了afterConcurrentHandlingStarted方法定义
- public interface AsyncHandlerInterceptor extends HandlerInterceptor {
- /**
- * Called instead of {@code postHandle} and {@code afterCompletion}, when
- * the a handler is being executed concurrently.
- * <p>Implementations may use the provided request and response but should
- * avoid modifying them in ways that would conflict with the concurrent
- * execution of the handler. A typical use of this method would be to
- * clean up thread-local variables.
- *
- * @param request the current request
- * @param response the current response
- * @param handler the handler (or {@link HandlerMethod}) that started async
- * execution, for type and/or instance examination
- * @throws Exception in case of errors
- */
- void afterConcurrentHandlingStarted(
- HttpServletRequest request, HttpServletResponse response, Object handler)
- throws Exception;
- }
相关推荐
springMVC 中文开发指南,适合新手,适合初学者!
在SpringMVC中,XML配置文件扮演着关键角色,它们定义了组件的装配方式,如控制器、服务、数据源等。这篇内容将深入探讨SpringMVC中XML文件的读取与显示,并结合JSP页面的实现。 首先,我们需要理解SpringMVC的配置...
在IT行业中,开源框架是构建复杂应用程序的重要工具,Spring、SpringMVC和MyBatis作为Java领域的三大核心框架,被广泛应用于企业级开发。本文将深入探讨这些框架的基础概念、核心功能以及在面试中可能遇到的相关问题...
2. **配置文件**:SpringMVC的配置通常在XML文件(如`servlet-context.xml`)中进行,包括视图解析器、模型-视图映射、拦截器、以及bean的定义。这些配置会指导SpringMVC如何处理请求和响应。 3. **模型(Model)**:...
ViewResolver 是视图解析器,它的职责是根据 ModelAndView 中的视图名,找到具体的视图进行渲染。SpringMVC 支持多种视图技术,如 JSP、FreeMarker、Thymeleaf 等。 七、注解驱动开发 SpringMVC 提供了丰富的注解,...
在这个"SpringMVC demo 完整源码实例下载.zip"压缩包中,我们可以深入学习和理解SpringMVC的各种核心特性和实际应用。 首先,SpringMVC通过DispatcherServlet作为前端控制器,它负责接收HTTP请求,并根据请求的URL...
这个项目可以作为学习SpringMVC的起点,帮助理解如何在IDEA中配置和运行SpringMVC项目,以及如何利用其特性处理实际问题。通过这个小项目,你可以深入理解SpringMVC的运作机制,为进一步的Web开发打下坚实的基础。
SpringMVC和SQLiteJDBC是两个在Java开发中常见的组件,它们分别用于构建Web应用程序和服务端数据存储。这里我们详细探讨这两个技术以及它们如何协同工作。 **SpringMVC** SpringMVC是Spring框架的一个模块,专门...
spring mvc视频 之控制器映射
在SpringMVC中,核心组件包括DispatcherServlet、ModelAndView、Controller、ViewResolver等。DispatcherServlet作为入口点,负责接收HTTP请求,并根据配置的HandlerMapping找到对应的Controller进行处理。...
这个名为"SpringMVC Demo_java_springmvc_DEMO_"的项目是一个演示示例,旨在展示如何在Java项目中集成和使用SpringMVC。通过这个项目,我们可以学习到以下关键知识点: 1. **环境配置**:首先,我们需要一个Java...
在SpringMVC中,我们首先会接触到配置文件,这通常是`springmvc-config.xml`,在这个文件中,我们会定义DispatcherServlet,它是SpringMVC的入口点,负责处理所有的HTTP请求。同时,这里还会配置视图解析器,如`...
这份文档可能从快速入门示例开始,引导读者理解基本概念,然后逐步深入,探讨更高级的话题,如拦截器、AOP(面向切面编程)在SpringMVC中的应用,以及如何集成WebSocket进行实时通信。此外,它可能还会讨论最佳实践...
在这个实例详解中,我们将深入理解SpringMVC的核心概念以及如何与MySQL数据库进行集成。 首先,我们从SpringMVC的基本组件开始。在MVC模式中,“模型”负责处理业务逻辑和数据管理,通常由JavaBeans或实体类表示;...
SpringMVC和MyBatis是Java Web开发中的两个核心框架,它们在构建高效、模块化的应用程序方面发挥着重要作用。SpringMVC是Spring框架的一部分,主要负责处理HTTP请求和响应,而MyBatis则是一个轻量级的持久层框架,...
SpringMVC 拦截器项目是一个典型的 Web 应用开发示例,它利用 SpringMVC 框架中的拦截器(Interceptor)机制来实现特定的功能,如权限控制、日志记录、性能统计等。SpringMVC 是 Spring 框架的一部分,专为构建基于 ...
在这个"SpringMVC demo 完整源码实例下载"中,我们能够深入理解并学习SpringMVC的核心概念和实际应用。 首先,SpringMVC是Spring框架的一部分,它通过Model-View-Controller(MVC)设计模式来分离应用程序的业务...
2. **配置文件**:在SpringMVC中,通常有两个重要的配置文件:`servlet-context.xml`(Spring MVC配置)和`applicationContext.xml`(Spring核心配置)。在"SpringMVCLearningChapter1"里,我们可能会看到如何在`...
2. **配置与设置**:讲解如何在项目中配置SpringMVC,包括web.xml中的DispatcherServlet配置、Spring MVC的配置文件、以及如何将SpringMVC集成到Spring IoC容器中。 3. **处理器映射器与适配器**:解释...