Spring MVC 框架 的核心概念、组件关系及流程的详细说明,并附表格总结

以下是 Spring MVC 框架 的核心概念、组件关系及流程的详细说明,并附表格总结:


1. 核心理念

Spring MVC 是基于 MVC(Model-View-Controller)设计模式 的 Web 框架,其核心思想是 解耦:

  • Model:数据模型,负责业务逻辑和数据处理。
  • View:视图层,负责数据展示(如 HTML、JSON)。
  • Controller:控制器,负责接收请求、调用 Model、选择 View。

2. 核心组件详解

2.1 DispatcherServlet(前端控制器)
  • 作用 :
    Spring MVC 的核心,处理所有请求的入口点。
  • 功能 :
    • 接收 HTTP 请求。
    • 分发请求到合适的 Handler(处理器)。
    • 组合 Model 和 View,返回最终响应。
  • 配置 :
    在 web.xml 中配置为 Servlet,或通过 @SpringBootApplication 自动配置。
2.2 HandlerMapping(处理器映射器)
  • 作用 :
    根据请求 URL 找到对应的 Handler(处理器)。

  • 功能 :

    • 将请求 URL 映射到具体的 Controller 方法。
    • 支持多种映射方式(如 @RequestMapping、@GetMapping)。
  • 示例 :

    java 复制代码
    @Controller
    @RequestMapping("/user")
    public class UserController {
        @GetMapping("/list")
        public String list() { ... }
    }
2.3 HandlerAdapter(处理器适配器)
  • 作用 :
    调用 Handler(处理器)并获取处理结果(ModelAndView)。
  • 功能 :
    • 将请求参数绑定到方法参数(如 @RequestParam、@PathVariable)。
    • 调用 Controller 方法,处理业务逻辑。
    • 将返回值(如 String、ModelAndView)转换为 ModelAndView 对象。
  • 适用场景 :
    适配不同类型的处理器(如 @Controller、@RestController)。
2.4 ViewResolver(视图解析器)
  • 作用 :
    将逻辑视图名(如 "user/list")转换为具体的 View 对象。

  • 功能 :

    • 根据配置规则(如前缀、后缀)查找视图资源。
    • 支持多种视图技术(如 Thymeleaf、JSP、FreeMarker)。
  • 配置示例 :

    properties 复制代码
    spring.mvc.view.prefix=/WEB-INF/views/
    spring.mvc.view.suffix=.jsp
2.5 Model(模型)
  • 作用 :
    存储数据,供视图渲染使用。
  • 功能 :
    • 通过 Model、ModelAndView 或 @ModelAttribute 注入数据。

    • 示例:

      java 复制代码
      @Controller
      public class UserController {
          @GetMapping("/user/{id}")
          public String getUser(@PathVariable Long id, Model model) {
              User user = userService.findById(id);
              model.addAttribute("user", user); // 存入 Model
              return "user/detail";
          }
      }
2.6 View(视图)
  • 作用 :
    将 Model 中的数据渲染为最终的响应(如 HTML 页面、JSON 数据)。
  • 实现方式 :
    • Thymeleaf :<div th:text="${user.name}"></div>。
    • JSP :<%= user.getName() %>。
    • JSON :通过 @ResponseBody 或 @RestController 直接返回对象。
2.7 Controller(控制器)
  • 作用 :
    处理 HTTP 请求,调用 Model 并选择 View。
  • 功能 :
    • 通过 @Controller 或 @RestController 标记。

    • 使用 @RequestMapping 系列注解定义请求映射。

    • 示例:

      java 复制代码
      @RestController
      public class UserController {
          @GetMapping("/api/user/{id}")
          public User getUser(@PathVariable Long id) {
              return userService.findById(id);
          }
      }
2.8 拦截器(HandlerInterceptor)
  • 作用 :
    在请求处理前后执行自定义逻辑(如权限校验、日志记录)。
  • 功能 :
    • 实现 HandlerInterceptor 接口。

    • 通过 WebMvcConfigurer 注册拦截器。

    • 示例:

      java 复制代码
      public class AuthInterceptor implements HandlerInterceptor {
          @Override
          public boolean preHandle(HttpServletRequest request, 
                                  HttpServletResponse response, 
                                  Object handler) {
              // 权限校验
              return true; // 继续处理请求
          }
      }

3. 核心组件关系图

plaintext 复制代码
用户请求 → DispatcherServlet → HandlerMapping → Handler(Controller)
           ↓
           HandlerAdapter → 处理请求 → Model + View名称
           ↓
           ViewResolver → 解析View → 渲染响应 → 返回客户端

4. 请求处理流程

  1. 请求到达 DispatcherServlet :
    客户端发送 HTTP 请求到 DispatcherServlet。
  2. 映射处理器 :
    HandlerMapping 根据 URL 找到对应的 Handler(如 UserController 的 list() 方法)。
  3. 调用处理器 :
    HandlerAdapter 调用 Handler 方法,获取 ModelAndView(包含数据和逻辑视图名)。
  4. 解析视图 :
    ViewResolver 将逻辑视图名(如 "user/list")转换为具体的 View(如 /WEB-INF/views/user/list.jsp)。
  5. 渲染响应 :
    View 使用 Model 数据生成最终响应(HTML、JSON 等),返回给客户端。

5. 表格总结

组件 作用 角色 示例/配置
DispatcherServlet 接收请求,分发到 Handler,组合 Model 和 View。 中央调度器,核心组件。 @SpringBootApplication 自动配置。
HandlerMapping 映射请求 URL 到对应的 Handler(Controller)。 请求路由的桥梁。 @RequestMapping、@GetMapping。
HandlerAdapter 调用 Handler 方法,处理参数绑定和返回值转换。 调用处理器的适配器。 支持 @RequestParam、@PathVariable。
ViewResolver 将逻辑视图名转换为具体的 View 对象。 视图解析器,支持多种模板引擎。 spring.mvc.view.prefix=/views/、spring.mvc.view.suffix=.jsp。
Model 存储数据,供视图渲染。 数据容器。 Model、@ModelAttribute。
View 渲染最终的响应(HTML、JSON 等)。 响应生成器。 Thymeleaf、JSP、FreeMarker。
Controller 处理请求,调用 Model,选择 View。 业务逻辑处理器。 @Controller、@RestController。
HandlerInterceptor 在请求处理前后执行拦截逻辑(如权限校验)。 请求拦截器。 实现 HandlerInterceptor 接口,通过 WebMvcConfigurer 注册。

6. 关键概念关系图

plaintext 复制代码
用户请求 → DispatcherServlet → HandlerMapping(找到 Controller) → HandlerAdapter(调用 Controller 方法)
           ↓
           Model(存储数据) → ViewResolver(解析视图) → View(渲染响应)

7. 注意事项

  • 注解驱动 :通过 @EnableWebMvc 或 @SpringBootApplication 启用注解支持。
  • 异步处理 :通过 @Async 或 DeferredResult 实现异步请求。
  • 异常处理 :通过 @ControllerAdvice 统一处理全局异常。

通过以上组件和流程,Spring MVC 实现了请求的解耦和高效处理,是构建现代化 Web 应用的首选框架。

一、Spring MVC 请求处理全流程详解

1. 请求参数接收
  • 实现方式 :通过方法参数注解(如 @RequestParam, @PathVariable, @RequestBody)直接绑定请求参数。

    java 复制代码
    @GetMapping("/user/{id}")
    public String getUser(@PathVariable String id, 
                         @RequestParam String name) {
        // 参数绑定到方法参数
    }
  • 核心类 :ServletInvocableHandlerMethod 负责参数解析,通过 HandlerMethodArgumentResolver 解析不同注解的参数。


2. 请求分发到控制器方法
  • 流程 :DispatcherServlet 通过 HandlerMapping 定位处理器(Controller方法)。

    • 关键类 :RequestMappingHandlerMapping 根据 @RequestMapping 注解匹配 URL 和 HTTP 方法。
    • 匹配逻辑 :解析 @RequestMapping 的 path、method 等属性,生成 HandlerExecutionChain。
    java 复制代码
    // 示例:匹配到 UserController 的 getUser 方法
    @Controller
    @RequestMapping("/user")
    public class UserController {
        @GetMapping("/{id}")
        public String getUser(@PathVariable String id) { ... }
    }

3. 视图定位与渲染
  • 视图解析 :ViewResolver 根据逻辑视图名(如 user/list)解析为实际视图(如 JSP 文件)。

    • 核心类 :InternalResourceViewResolver 将视图名转换为 /WEB-INF/views/user/list.jsp。
    java 复制代码
    // 配置视图解析器
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
  • 视图类型 :JSP、Thymeleaf、FreeMarker 等,通过 View 接口实现。


二、流程可省略与可自定义部分

1. 可省略的流程
流程阶段 省略条件 替代处理方式
视图解析 返回值添加 @ResponseBody 由 HttpMessageConverter 直接序列化返回
视图渲染 返回 JSON/XML 等数据格式 无需渲染,直接写入响应体
Session管理 无会话需求(如 REST API) 关闭 Session 支持(@Controller 不继承 @SessionAttributes)

2. 可自定义的流程
流程阶段 自定义方式 实现类/注解
参数绑定 自定义参数解析器 HandlerMethodArgumentResolver
处理器映射 自定义请求到方法的匹配规则 HandlerMapping
视图解析 自定义视图解析逻辑 ViewResolver
异常处理 自定义全局异常处理器 @ControllerAdvice + @ExceptionHandler

三、DispatcherServlet.properties 定义的类及作用

1. 核心类列表
类名 作用
RequestMappingHandlerMapping 根据 @RequestMapping 注解匹配 Controller 方法
RequestMappingHandlerAdapter 调用 Controller 方法并处理方法参数和返回值
BeanNameUrlHandlerMapping 根据 Bean 名称直接映射 URL(如 loginController 对应 /loginController)
SimpleUrlHandlerMapping 简单的 URL 映射配置(通过 XML 配置 URL 和 Controller 关联)
DefaultAnnotationHandlerMapping 旧版注解处理器映射(Spring 3.0 后逐步被 RequestMappingHandlerMapping 替代)
InternalResourceViewResolver 解析 JSP 视图,将逻辑视图名转换为实际资源路径
ContentNegotiatingViewResolver 根据请求的 Accept 头选择合适视图(如 JSON 或 HTML)
HandlerExceptionResolver 全局异常处理,将异常转换为视图或 HTTP 状态码
2. 流程总结表格
流程阶段 是否可省略 是否可自定义 默认实现类
参数绑定 否 是 ServletModelAttributeMethodProcessor
请求分发 否 是 RequestMappingHandlerMapping
视图解析 是 是 InternalResourceViewResolver
视图渲染 是 是 JstlView(JSP)
异常处理 否 是 DefaultHandlerExceptionResolver

四、关键代码注释示例

java 复制代码
// 1. Controller 方法参数绑定示例
@GetMapping("/search")
public String search(@RequestParam String keyword, 
                    @RequestBody User user) { 
    // @RequestParam 绑定查询参数,@RequestBody 绑定 JSON 请求体
}

// 2. 自定义视图解析器(实现 ViewResolver 接口)
public class CustomViewResolver implements ViewResolver {
    @Override
    public View resolveViewName(String viewName, Locale locale) {
        // 自定义逻辑:根据 viewName 返回自定义 View 实现
        return new CustomView();
    }
}

// 3. @ResponseBody 省略视图流程
@GetMapping("/api/user")
@ResponseBody
public User getUserAsJson() {
    // 直接返回对象,由 Jackson 转换为 JSON,跳过视图解析
}
相关推荐
panxianren2 小时前
Bun 1.4 的 bun test --parallel 将 4 秒的测试套件缩短到约 1 秒
java·javascript
sunshine22 girl3 小时前
Java学习七 Java 项目实战2-注册业务
java·学习
省钱兄--zs4 小时前
北京24小时自助健身房系统软件开发实战:从架构设计到部署指南
java·数据仓库·spring boot·小程序·需求分析
youdexiang4 小时前
Android录音软件时间关键词检索功能分析
java·人工智能
sunshine22 girl5 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
code2cat5 小时前
Java进阶篇之AtomicStampedReference:引用回到原值,版本戳仍能记住变化
java·cas·并发编程·aba
泡茶喝茶写代码6 小时前
A股量化数据工程:从 REST 接口到策略信号(第 8 篇):成长能力因子:营收与利润增速
java·python·股票数据api·股票数据api接口·股票量化数据api·股票量化数据接口·股票数据api数据
\光辉岁月/7 小时前
7.javase-面向对象
java·开发语言
weixin_531094697 小时前
heap_4内存管理
java·开发语言·算法
程序员南飞8 小时前
win系统安装minio
java·数据结构·算法