Spring MVC

Spring MVC 是基于 Java 的 Web 应用框架,是 Spring 框架的重要组成部分,遵循 MVC(Model-View-Controller)架构模式,用于构建灵活、可维护的 Web 应用程序。以下是其核心概念和特点:

一、MVC 架构模式

MVC 将应用程序分为三个核心组件:

  1. Model(模型):处理业务逻辑和数据,如数据库操作。
  2. View(视图):负责数据展示,如 JSP、Thymeleaf 模板。
  3. Controller(控制器):接收请求,调用模型处理数据,选择视图返回结果。

二、Spring MVC 的核心组件

  1. DispatcherServlet(前端控制器)

    • 所有请求的入口点,负责分发请求到合适的控制器。
    • 通过配置文件或注解自动注册。
  2. HandlerMapping(处理器映射器)

    • 将请求映射到具体的控制器方法。
    • 支持基于 URL、注解(如 @RequestMapping)等方式。
  3. Controller(控制器)

    • 处理请求的组件,通常使用 @Controller@RestController 注解。
    • 通过方法处理特定请求并返回数据或视图。
  4. ModelAndView(模型与视图)

    • 封装处理结果(数据和视图名称),传递给 DispatcherServlet。
  5. ViewResolver(视图解析器)

    • 根据视图名称解析实际视图(如 JSP、HTML)。

三、工作流程

  1. 请求到达 DispatcherServlet

    • 所有请求首先被 DispatcherServlet 拦截。
  2. HandlerMapping 确定处理器

    • 根据请求 URL 查找对应的 Controller 方法。
  3. Controller 处理请求

    • 调用业务逻辑,返回 ModelAndView 对象。
  4. ViewResolver 解析视图

    • 将逻辑视图名解析为实际视图(如 JSP 文件)。
  5. 视图渲染

    • 将模型数据填充到视图中,返回响应给客户端。

四、核心注解

  • @Controller:标识控制器类。
  • @RestController:组合注解,等价于 @Controller + @ResponseBody,用于 RESTful API。
  • @RequestMapping:映射请求路径,支持 GETPOST 等方法。
  • @RequestBody:将请求体解析为 Java 对象。
  • @ResponseBody:将返回值直接作为响应体。
  • @PathVariable:获取 URL 中的路径变量。
  • @RequestParam:获取请求参数。

五、优点

  1. 松耦合设计:各组件职责清晰,易于维护和测试。
  2. 灵活的视图支持:支持 JSP、Thymeleaf、Freemarker、JSON 等多种视图技术。
  3. 强大的注解支持:简化配置,提高开发效率。
  4. 集成 Spring 生态:无缝整合 Spring 的 IoC、AOP 等功能。
  5. 国际化与本地化:内置支持多语言。

六、简单示例

以下是一个典型的 Spring MVC 控制器示例:

java

复制代码
@RestController
@RequestMapping("/api")
public class UserController {

    // 依赖注入服务层
    @Autowired
    private UserService userService;

    // 处理 GET 请求:/api/users/{id}
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.getUserById(id);
    }

    // 处理 POST 请求:/api/users
    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        return userService.saveUser(user);
    }
}

七、与 Spring Boot 的关系

Spring Boot 简化了 Spring MVC 的配置:

  • 自动配置 DispatcherServlet 和 ViewResolver。
  • 内嵌 Tomcat、Jetty 等服务器,无需部署 WAR 文件。
  • 通过 spring-boot-starter-web 依赖快速集成 Spring MVC。