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"); // 排除某些路径
    }
}
相关推荐
FYKJ_20101 小时前
springboot校园兼职平台--附源码02041
java·javascript·spring boot·python·eclipse·django·php
书源丶2 小时前
三十六、File 类与 IO 流基础——文件操作的「第一步」
java
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题】【Java基础篇】第30题:JDK动态代理和CGLIB动态代理有什么区别
java·开发语言·后端·面试·代理模式
hERS EOUS2 小时前
SpringBoot 使用 spring.profiles.active 来区分不同环境配置
spring boot·后端·spring
DFT计算杂谈2 小时前
wannier90 参数详解大全
java·前端·css·html·css3
marsh02063 小时前
43 openclaw熔断与降级:保障系统在异常情况下的可用性
java·运维·网络·ai·编程·技术
张健11564096483 小时前
临界区和同一线程上锁
java·开发语言·jvm
超梦dasgg4 小时前
智慧充电系统设备管理服务对外接口实现方案
java·spring·微服务
xiaoye37084 小时前
Spring 事务传播机制 + 隔离级别
java·后端·spring