Spring MVC 是 Spring 框架的一个 基于 Java 的 Web 开发模块,它实现了 MVC(Model-View-Controller)架构模式,用于构建灵活、松耦合的 Web 应用程序。
它是 Spring 生态的核心组件之一,通过简化 HTTP 请求处理、数据绑定和视图渲染,帮助开发者高效构建企业级 Web 应用。
Spring MVC 是 Spring 生态中用于构建 Web 应用的核心模块,它的核心优势在于 模块化设计 和 注解驱动开发,能够高效处理 HTTP 请求并支持灵活的视图技术。我个人认为它的主要优点可以从以下几个方面展开:
(1) 松耦合的模块化设计
首先,Spring MVC 基于 前端控制器模式(DispatcherServlet
),将请求分发、业务处理、视图渲染等职责分离。
这种设计让各组件(如 Controller
、ViewResolver
)可以独立替换或扩展,比如从 JSP 切换到 Thymeleaf 只需修改配置,无需改动业务代码。
(2) 注解驱动的开发效率
其次,它通过 注解(如 @Controller
、@GetMapping
)极大简化了开发。对比传统的 Servlet 或 Struts2,代码量减少 50% 以上,且意图更清晰。
(3) 强大的数据绑定与验证
Spring MVC 支持 自动参数绑定(如 @RequestParam
、@ModelAttribute
)和 JSR-303 验证(如 @Valid
)。开发者无需手动解析 HTTP 参数,还能通过 BindingResult
统一处理校验错误,提升代码健壮性。
(4) 灵活的视图技术整合
它支持多种视图技术(JSP、Thymeleaf、Freemarker),并能无缝切换。对于前后端分离项目,还可以直接返回 JSON/XML(通过 @ResponseBody
),适应现代开发需求。
(5) 与 Spring 生态深度集成
作为 Spring 的一部分,它可以轻松整合其他组件,比如用 @Transactional
管理事务,或通过 Spring Security
实现权限控制。这种一致性降低了学习成本,也便于维护。
综上,Spring MVC 特别适合 需要快速开发 且 要求高可维护性 的项目,比如企业级后台管理系统或 RESTful API。它的灵活性和与 Spring 生态的无缝整合,是许多团队选择它的主要原因。
Spring MVC 框架由多个核心组件组成,它们协同工作来处理 HTTP 请求并生成响应。以下是主要组件及其功能:
DispatcherServlet 是 Spring MVC 框架的核心组件,它充当了前端控制器的角色,负责协调整个请求处理流程。
Spring MVC控制器是处理客户端请求并返回响应的核心组件,它负责接收用户请求、协调业务逻辑处理,并决定如何响应客户端。
可以补充以下关键点:
@Controller
和@RestController
注解标识@RequestMapping
及其变体(@GetMapping
等)定义URL映射@RestController
简化RESTful API开发在Spring MVC架构中,控制器位于DispatcherServlet之后:
Spring MVC中的控制器默认是单例的(Singleton),这是由Spring容器的默认作用域决定的。在Spring中,所有Bean默认都是单例的,包括使用@Controller
和@RestController
注解的类。
1. 避免使用实例变量(推荐)
最佳实践是控制器中不定义任何实例变量,所有请求特定的数据都应通过方法参数传递。
2. 使用方法局部变量
所有请求特定的数据都应在方法内部创建:
注意:
(1)适配器调用前执行 (preHandle
)
preHandle
返回 false
,后续拦截器和控制器方法均不会执行(2)适配器调用后执行 (postHandle
)
(3)请求完成后执行 (afterCompletion
)
特性 |
过滤器(Filter) |
拦截器(Interceptor) |
所属规范 |
Servlet 规范 |
Spring MVC 机制 |
执行位置 |
DispatcherServlet 前 |
DispatcherServlet 后 |
依赖 |
依赖 Servlet 容器 |
依赖 Spring 容器 |
可访问对象 |
ServletRequest/Response |
可以获取 HandlerMethod 等Spring对象 |
使用场景 |
底层请求/响应处理 |
业务相关的横切关注点 |
Spring MVC 提供了丰富的注解来简化 Web 开发,以下是常用注解分类整理:
注解 |
作用 |
示例 |
|
通用请求映射(可指定HTTP方法、头等) |
|
|
简化GET请求映射 |
|
|
简化POST请求映射 |
|
|
简化PUT请求映射 |
|
|
简化DELETE请求映射 |
|
|
简化PATCH请求映射 |
|
注解 |
作用 |
示例 |
|
获取URL查询参数或表单数据 |
|
|
获取URI模板变量 |
|
|
接收JSON/XML请求体 |
|
|
获取请求头值 |
|
|
获取Cookie值 |
|
|
绑定参数到模型对象 |
|
注解 |
作用 |
示例 |
|
将返回值直接写入HTTP响应体 |
|
|
自定义HTTP响应状态码 |
|
|
|
|
注解 |
作用 |
示例 |
|
处理控制器内的异常 |
|
|
全局异常处理(配合 |
|
注解 |
作用 |
示例 |
|
触发JSR-303验证 |
|
|
Spring的验证注解(支持分组验证) |
|
|
字段非空校验(需配合 |
|
注解 |
作用 |
示例 |
|
定义控制器类 |
|
|
模型属性存入Session |
|
|
解决跨域问题 |
|
注解 |
作用 |
示例 |
|
自定义数据绑定逻辑 |
|
|
日期格式转换 |
|
@RestController
是@Controller
+@ResponseBody
的组合@RequestParam
默认必传,可通过required=false
改为可选@Valid
需与JSR-303注解(如@NotNull
)配合使用@GetMapping
/@PostMapping
等简化注解掌握这些注解可以覆盖90%的Spring MVC开发场景!
@Controller
是 Spring MVC 中最核心的注解之一,用于标记一个类作为控制器(Controller),专门处理 HTTP 请求并返回响应。以下是它的详细作用解析:
@RequestMapping
等注解配合,定义处理特定 URL 请求的方法。@RequestMapping
是 Spring MVC 中最核心的注解之一,用于将 HTTP 请求映射到特定的控制器方法或类上。它提供了灵活的 URL 匹配规则,支持定义请求方法、参数、头部等条件。以下是详细解析:
/users
)/users/{id}
)/resources/**
)@ResponseBody
是 Spring MVC 中用于将方法返回值直接写入 HTTP 响应体的核心注解,通常用于构建 RESTful API 或处理 AJAX 请求。以下是它的详细解析:
Accept
头或 URL 后缀(如 .json
),自动选择合适的 HttpMessageConverter
进行序列化。@PathVariable
和 @RequestParam
是 Spring MVC 中用于处理 HTTP 请求参数的两种核心注解,它们的主要区别体现在 参数来源、使用场景 和 URL 风格 上。以下是详细对比:
特性 |
|
|
参数来源 |
从 URL 路径 中提取 |
从 URL 查询字符串 或 表单数据 中提取 |
URL 示例 |
|
|
是否必传 |
默认必传(除非指定默认值) |
可通过 设为可选 |
RESTful 风格 |
是(推荐用于资源标识) |
否(传统查询方式) |
数据类型转换 |
自动(Spring 类型转换机制) |
自动(Spring 类型转换机制) |
1. @PathVariable
(路径变量)
2. @RequestParam
(请求参数)