Spring MVC

Spring MVC

基本概念

简单来说,Spring MVC 是 Spring 对 MVC 的实现,对传统的 MVC 做了扩展。

  • 将 Model 层分为了业务模型(Service)和数据模型(Repository)
  • Controller 层分为了前端控制器(DispatcherServlet)和后端控制器(Controller)

以前的 Servlet + JSP 模式,开发要写很多的 Servlet,现在和 Servlet 解耦,简化了 Web 开发

工作流程

Spring MVC 的工作流程可以分为以下几个关键步骤:

  1. 客户端请求 :用户发送 HTTP 请求,DispatcherServlet 接收请求。
  2. 执行拦截器的 preHandle() :如果配置了拦截器,Spring MVC 会首先执行 preHandle() 方法。如果返回 false,请求处理终止;否则,继续处理。
  3. 请求映射DispatcherServlet 通过 HandlerMapping 找到对应的 HandlerExecutionChain (这里面包含了很多定义的 HandlerInterceptor ,拦截器),然后通过 HandlerAdapter 适配器的适配(适配器模式)后,执行 handler,即通过 Controller 的调用。
  4. 执行控制器方法 :如果返回的是视图(如 JSP、Thymeleaf),则执行视图解析器进行视图解析和渲染;如果返回的是对象(如 JSON),则通过消息转换器(如 MappingJackson2HttpMessageConverter)将对象转换为 JSON 数据。
  5. 执行拦截器的 postHandle() :如果返回视图,拦截器的 postHandle() 方法会在视图渲染之前执行。对于 JSON 响应,该方法仍然会执行。
  6. 视图渲染或 JSON 响应:对于视图,视图解析器会解析视图名称,并将其渲染为 HTML 页面。对于 JSON 响应,Spring MVC 会将对象序列化为 JSON,并返回给客户端。
  7. 执行拦截器的 afterCompletion() :视图渲染或 JSON 响应完成后,Spring MVC 调用拦截器的 afterCompletion() 方法,进行资源清理或日志记录。
  8. 响应客户端:最终将渲染的视图或 JSON 数据返回给客户端。

拦截器(Interceptor)

拦截器就是对请求起到一个拦截、过滤的作用,允许用户在方法执行前后进行自定义逻辑。

常见应用场景

  • 身份认证
  • 权限校验
  • 日志记录等

拦截器三个核心方法

  1. preHandle() :在控制器方法执行之前调用。如果该方法返回 false,请求将被拦截,不会进入控制器方法。
  2. postHandle():在控制器方法执行之后,视图渲染之前调用。可以用于修改模型数据或视图。
  3. afterCompletion():在视图渲染完成后调用,用于清理资源或记录执行时间等。

拦截器的配置

在 Spring MVC 中,可以通过实现 HandlerInterceptor 接口来定义拦截器,并在配置文件或 Java 配置类中注册拦截器。

java 复制代码
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在处理器方法调用前进行拦截
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 处理器方法执行后,但视图渲染前执行
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 视图渲染后执行
    }
}

实现 WebMvcConfigurer 接口来注册拦截器:

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/**") // 拦截所有路径
                .excludePathPatterns("/login", "/error"); // 排除某些路径
    }
}
相关推荐
带刺的坐椅8 分钟前
Solon v3.4.7, v3.5.6, v3.6.1 发布(国产优秀应用开发框架)
java·spring·solon
四谎真好看2 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程2 小时前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t2 小时前
ZIP工具类
java·zip
lang201509282 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
pengzhuofan3 小时前
第10章 Maven
java·maven
百锦再4 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说4 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多4 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring
百锦再4 小时前
对前后端分离与前后端不分离(通常指服务端渲染)的架构进行全方位的对比分析
java·开发语言·python·架构·eclipse·php·maven