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"); // 排除某些路径
    }
}
相关推荐
我命由我123455 分钟前
Android 开发问题:Plugin [id: ‘org.jetbrains.kotlin.android‘] was not found
android·java·开发语言·java-ee·kotlin·安卓·android-studio
androidwork6 分钟前
使用 Kotlin 实现 Android 自定义 Lint 检查规则的步骤指南
android·java·kotlin
Orlando cron1 小时前
Jenkins分配对应项目权限与用户管理
java·运维·jenkins
曼岛_1 小时前
[Java实战]Spring Boot切面编程实现日志记录(三十六)
java·开发语言·spring boot
一点博客2 小时前
Redisson WatchDog会一直续期吗?
java·开发语言
zkmall2 小时前
B2C商城架构对比:ZKmall模板商城为何选择 Spring Cloud
spring·spring cloud·架构
coding随想2 小时前
多语言视角下的 DOM 操作:从 JavaScript 到 Python、Java 与 C#
java·javascript·python
on the way 1232 小时前
创建型模式之Abstract Factory(抽象工厂)
java·开发语言
LDM>W<2 小时前
黑马点评-分布式锁Lua脚本
java·分布式·lua