当前位置: 首页 > news >正文

Spring MVC

Spring MVC 是 Spring Framework 中用于构建 Web 应用程序(特别是 RESTful API 和传统服务端渲染页面)的核心模块。它是基于 Servlet API 构建的,遵循经典的 Model-View-Controller (MVC) 设计模式。

在 Spring Boot 出现之前,配置 Spring MVC 非常繁琐(需要 web.xml, spring-mvc-servlet.xml 等)。而在 Spring Boot 时代,它通过“自动配置”变得极其简单,成为了 Java 后端开发的事实标准。


1. 核心架构:请求处理流程

理解 Spring MVC 的关键在于理解它的核心组件如何协作处理一个 HTTP 请求:

  1. DispatcherServlet (前端控制器):

    • 这是整个流程的入口。所有请求首先到达它。
    • 它负责协调其他组件,但不直接处理业务逻辑。
    • 在 Spring Boot 中,它默认注册为 / 路径,拦截所有请求。
  2. HandlerMapping (处理器映射):

    • DispatcherServlet 咨询 HandlerMapping:“哪个控制器(Controller)能处理这个 URL?”
    • 它根据 URL、HTTP 方法、参数等找到对应的 Handler (通常是 @Controller@RestController 中的方法)。
  3. HandlerAdapter (处理器适配器):

    • 找到 Handler 后,DispatcherServlet 通过 HandlerAdapter 去执行它。
    • 适配器负责调用具体的方法,处理参数绑定(将 request 参数转为 Java 对象),并获取返回值。
  4. Controller (控制器):

    • 开发者编写的业务逻辑入口(标注 @Controller@RestController)。
    • 处理请求,调用 Service 层,返回 ModelAndView (视图名+数据) 或直接返回 数据对象 (JSON/XML)。
  5. ViewResolver (视图解析器):

    • 如果返回的是视图名称(如 "home"),ViewResolver 会将其解析为具体的视图实现(如 Thymeleaf 模板、JSP 文件)。
    • 注:如果是 RESTful API (@RestController),通常跳过此步,直接使用消息转换器。
  6. HttpMessageConverter (消息转换器):

    • 关键组件。负责将 Controller 返回的 Java 对象(如 User 对象)序列化为 JSON/XML 写入 Response。
    • 同时也负责将 Request Body 中的 JSON/XML 反序列化为 Java 对象传入 Controller 方法参数。
    • 默认内置了 Jackson (JSON), JAXB (XML) 等转换器。
  7. View (视图):

    • 最终渲染结果(HTML 页面 或 JSON 数据流)返回给客户端。

2. 核心注解与用法 (现代开发风格)

在现代 Spring Boot 开发中,我们主要使用 注解驱动 的方式,完全摒弃 XML 配置。

A. 定义控制器

  • @Controller: 用于传统的 Web 应用,通常返回视图名称(HTML 页面)。
  • @RestController: 最常用。组合了 @Controller + @ResponseBody。表示该类的所有方法直接返回数据(JSON/XML),而不是视图。适用于构建 RESTful API。
@RestController
@RequestMapping("/api/users") // 类级别的路径前缀
public class UserController {@Autowiredprivate UserService userService;// GET /api/users/1@GetMapping("/{id}")public User getUser(@PathVariable Long id) {return userService.findById(id);}// POST /api/users// @RequestBody 自动将 JSON 转为 User 对象@PostMappingpublic User createUser(@RequestBody @Valid User user) {return userService.save(user);}// GET /api/users?name=John&page=1@GetMappingpublic List<User> listUsers(@RequestParam String name, @RequestParam(defaultValue = "0") int page) {return userService.findByName(name, page);}
}

B. 常用注解详解

注解 作用 示例
@RequestMapping 通用映射,可指定 method @RequestMapping(value="/users", method=GET)
@GetMapping 简化版,仅映射 GET 请求 @GetMapping("/id")
@PostMapping 简化版,仅映射 POST 请求 @PostMapping
@PutMapping / @DeleteMapping 对应 PUT / DELETE @DeleteMapping("/{id}")
@PathVariable 提取 URL 路径中的变量 /users/{id} -> @PathVariable Long id
@RequestParam 提取查询参数 (?key=value) ?page=1 -> @RequestParam int page
@RequestBody 读取 HTTP Body (JSON/XML) 并反序列化 @RequestBody UserDto dto
@ResponseBody 将返回值序列化为 JSON/XML (已包含在 @RestController 中) (通常不单独用在类上)
@RequestHeader 提取 HTTP 头信息 @RequestHeader("Authorization") String token
@Valid / @Validated 触发 JSR-303/Bean Validation 参数校验 配合 @NotNull, @Size 使用

3. 全局异常处理

在 Spring MVC 中,推荐使用 @ControllerAdvice (或 @RestControllerAdvice) 结合 @ExceptionHandler 来统一处理异常,避免在每个 Controller 中写 try-catch。

@RestControllerAdvice
public class GlobalExceptionHandler {// 处理参数校验失败异常@ExceptionHandler(MethodArgumentNotValidException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {Map<String, String> errors = new HashMap<>();ex.getBindingResult().getFieldErrors().forEach(error -> errors.put(error.getField(), error.getDefaultMessage()));return errors;}// 处理自定义业务异常@ExceptionHandler(BusinessException.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)public ErrorResponse handleBusinessException(BusinessException ex) {return new ErrorResponse(ex.getCode(), ex.getMessage());}// 处理所有其他未知异常@ExceptionHandler(Exception.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)public ErrorResponse handleGenericException(Exception ex) {// 记录日志...return new ErrorResponse(500, "系统内部错误");}
}

4. Spring MVC vs Spring WebFlux

这是 2026 年开发者常面临的选择:

特性 Spring MVC Spring WebFlux
底层模型 Servlet API (阻塞 I/O) Reactor Netty (非阻塞 I/O, 响应式)
线程模型 每个请求占用一个线程 (Thread-per-request) 事件循环 (Event Loop),少量线程处理大量并发
编程风格 同步、命令式 (Imperative) 异步、响应式 (Reactive, Flux/Mono)
适用场景 大多数 CRUD 业务,依赖传统阻塞库 (JDBC, JPA) 高并发、流式数据、实时通信,或使用响应式栈 (R2DBC)
2026 趋势 依然是主流。配合 Java 21 虚拟线程,性能大幅提升,弥补了阻塞模型的短板。 在特定高并发场景下使用,但学习曲线较陡峭。

结论:除非你有明确的超高并发需求或必须使用响应式技术栈,否则 Spring MVC + 虚拟线程 是 2026 年更推荐的选择,因为它开发效率高、生态兼容性好。


5. Spring Boot 中的自动配置细节

当你引入 spring-boot-starter-web 时,Spring Boot 自动为你做了以下配置:

  1. 注册 DispatcherServlet: 默认 URL 模式为 /
  2. 配置 ViewResolver: 如果使用 Thymeleaf/FreeMarker/JSP,自动配置对应的解析器。
  3. 注册 HttpMessageConverters: 自动检测 classpath 下的 Jackson/Gson/JAXB,并注册相应的转换器(默认优先 Jackson)。
  4. 静态资源映射: 自动将 /static, /public, /resources, /META-INF/resources 目录映射到根路径。
  5. 默认错误页面: 提供 /error 路径的默认处理逻辑(Whitelabel Error Page 或 JSON 错误响应)。

你可以通过 application.properties 轻松修改这些约定:

# 修改端口
server.port=8081
# 修改上下文路径
server.servlet.context-path=/my-api
# 修改日期格式
spring.mvc.format.date=yyyy-MM-dd
# 禁用默认 Whitelabel 错误页
server.error.whitelabel.enabled=false

总结

Spring MVC 是构建 Java Web 后端最成熟、最稳定的框架。

  • 核心: DispatcherServlet 调度一切。
  • 开发: 使用 @RestController + 注解快速构建 REST API。
  • 数据: 依靠 HttpMessageConverter 自动处理 JSON 交互。
  • 异常: 使用 @ControllerAdvice 统一兜底。
  • 未来: 在 Spring Boot 3 + Java 21 环境下,结合虚拟线程,它依然保持着强大的生命力和性能表现。
http://www.jsqmd.com/news/428595/

相关文章:

  • 2026年光学仪器精密零件加工厂家评测:镜头镜筒CNC加工优质供应商名单 - 余文22
  • 2026 BI 私有化部署方案商推荐:专业厂商与服务商实力盘点 - 品牌2026
  • 2026年激光打标机厂家推荐排行榜:涵盖光纤/紫外/CO2/手持/3D等全系列精密激光打标设备,实力品牌深度解析 - 品牌企业推荐师(官方)
  • 9款AI论文神器:一键生成综述+真实引注,3天搞定毕业论文 - 麟书学长
  • 项目上线出Bug:我踩过的4个大坑及事后反思
  • 2026年高稳定性CNC加工长期供应商推荐:聚焦中小批量订单与全流程质量管控体系 - 余文22
  • 购物中心、机场、高铁站玻璃隔热:打造舒适公共空间 - 包罗万闻
  • 2026电商系统开发公司推荐排行top,国内国外
  • 摆脱论文困扰! 8个AI论文网站测评:研究生毕业论文+开题报告必备工具推荐
  • 【电力系统】光伏MPPT发电+负载+储能SOC恒压控制直流微电网仿真,附参考文献
  • 2026年长治排行前列的矩阵代运营企业口碑排行,微信朋友圈广告/抖音头条信息流广告/抖音广告代运营,抖音矩阵公司推荐榜单 - 品牌推荐师
  • 国内合规玻尿酸品牌 - 中媒介
  • 用过才敢说 一键生成论文工具 千笔·专业学术智能体 VS 学术猹 专科生专属
  • SpringBoot 如何实现 约定优于配置
  • 学长亲荐!AI论文写作软件 千笔写作工具 VS 灵感ai 更贴合专科生需求
  • AI 知识库私有化部署指南:优质方案商、厂商、服务商全汇总 - 品牌2026
  • 2026年穿越机FPV碳纤维机架加工厂家推荐:高精度倒角与专业质量控制解析 - 余文22
  • 2026年 激光设备厂家推荐榜单:自动化与智能激光设备,创新技术与高效解决方案深度解析 - 品牌企业推荐师(官方)
  • 摆脱论文困扰! 千笔·降AI率助手 VS 学术猹,MBA专属降AI率平台
  • 想要做GEO?租用多IP站群服务器就对了
  • AI 的血肉补丁:当 Waymo 停在路边等待外卖员关门
  • 摆脱论文困扰! 9个降AI率软件降AIGC网站深度测评与推荐
  • 2026年美术培训机构推荐榜单:十大画室实力解析,专业师资与升学口碑深度测评 - 品牌企业推荐师(官方)
  • 万字精华总结“金三银四 Java 复习笔记”(共计 22 个技术专题)
  • 特朗普刚下禁令,美军动用Claude空袭!军用版或已达Opus 5.5水平
  • 吃透 WAF 绕过核心思路,这些实用技巧你必须掌握
  • 2026年国际社媒推广/TikTok运营/外贸社媒推广公司评测推荐:深圳昊客网络 - 深圳昊客网络
  • 【图像加密】图像加密性能分析 GUI 系统,覆盖图像密钥生成、加密性能指标计算(相关性、NPCRUACI、MSEPSNR、熵)附matlab代码
  • 云桌面和 VDI 到底有何不同?一文看懂核心差异
  • 端口占用问题解决方案