Spring - Spring MVC

news/2026/1/21 16:24:34/文章来源:https://www.cnblogs.com/liushoushou/p/19512588

Spring 核心 —— Spring MVC

1. 核心理论:什么是 Spring MVC?

Spring MVC 是 Spring Framework 提供的一个用于构建 Web 应用程序的模块。它基于 MVC (Model-View-Controller, 模型-视图-控制器) 设计模式,将 Web 应用的各个部分解耦,提高了代码的可维护性和可扩展性。

  • MVC 设计模式:

    • Model (模型): 应用程序的数据和业务逻辑。通常是 POJO (Plain Old Java Object, 简单无侵入 Java 对象)。
    • View (视图): 用于渲染 Model 数据,向用户展示界面。例如 JSP, Thymeleaf, JSON 等。
    • Controller (控制器): 接收用户请求,调用业务逻辑处理,并返回 Model 和 View。
  • 核心思想: Spring MVC 的核心是一个前端控制器 (Front Controller),即 DispatcherServlet(前端控制器)。所有的请求都会先经过 DispatcherServlet(前端控制器),然后由它统一分发给不同的处理器进行处理。


2. 深度剖析:Spring MVC 的核心流程

下图清晰地展示了 Spring MVC 的完整工作流程:

+------------+   1. 发送请求   +-----------------------+
|  Client    | ------------> |  DispatcherServlet    |
| (浏览器)    |               |    (前端控制器)       |
+------------+               +-----------+-----------+|| 2. 查询处理器v+-----------------------+|    HandlerMapping     ||   (处理器映射器)      |+-----------------------+|+-------------------------------+ 3. 返回 HandlerExecutionChain|                                         (包含 Handler 和 Interceptors)v
+--------+----------+
|  DispatcherServlet |
+--------+----------+|| 4. 请求 HandlerAdapter 执行 Handlerv
+-----------------------+      +--------------------------+
|    HandlerAdapter     | ---> |  Handler (Controller)    |
|    (处理器适配器)     |      |       (你的代码)         |
+-----------------------+      +------------+-------------+|+--------------------------------+ 5. Controller 返回 ModelAndView|v
+--------+----------+
|  DispatcherServlet |
+--------+----------+|| 6. 请求 ViewResolver 解析视图v
+-----------------------+
|     ViewResolver      |
|     (视图解析器)      |
+-----------------------+|+-------------------------------+ 7. 返回具体的 View|v
+--------+----------+
|  DispatcherServlet |
+--------+----------+|| 8. 渲染视图 (将 Model 数据填充到 View)v
+-----------------------+      +----------------+
|         View          | ---> |     Model      |
|        (视图)         |      |     (数据)     |
+-----------------------+      +----------------+|+-------------------------------+ 9. 返回响应|v
+------------+
|   Client   |
+------------+

当一个 HTTP 请求到达时,Spring MVC 的处理流程如下:

  1. 请求到达 DispatcherServlet(前端控制器): 所有的请求首先由前端控制器 DispatcherServlet接收。
  2. DispatcherServlet(前端控制器) 查询 HandlerMapping(处理器映射器): DispatcherServlet(前端控制器) 会调用 HandlerMapping (处理器映射器),请求它根据请求的 URL 找到对应的处理器(即 Controller(控制器) 的方法)。HandlerMapping(处理器映射器) 会返回一个 HandlerExecutionChain(处理器执行链) 对象。
    • HandlerExecutionChain (处理器执行链): 这是一个重要的内部对象,它不仅仅包含了找到的处理器(Handler),还包含了所有匹配该请求的拦截器 (HandlerInterceptor)。这就像一条流水线,请求在到达真正的处理器之前,需要先经过一系列的拦截器(如权限检查、日志记录等)。
  3. 执行处理器: DispatcherServlet(前端控制器) 会根据 HandlerAdapter (处理器适配器),先按顺序执行 HandlerExecutionChain(处理器执行链) 中的拦截器的 preHandle 方法,然后再调用相应的处理器方法。
  4. 处理器返回 ModelAndView(模型与视图): Controller(控制器) 方法执行完毕后,会返回一个 ModelAndView(模型与视图) 对象,其中包含了数据模型(Model)和逻辑视图名(View Name)。
  5. DispatcherServlet(前端控制器) 请求 ViewResolver(视图解析器): DispatcherServlet(前端控制器) 将 ModelAndView(模型与视图) 中的逻辑视图名传递给 ViewResolver(视图解析器)。
  6. ViewResolver(视图解析器) 返回 View(视图): ViewResolver(视图解析器) 解析逻辑视图名,并返回一个具体的 View(视图) 对象(如 JspView, ThymeleafView 等)。
  7. DispatcherServlet(前端控制器) 渲染视图: DispatcherServlet(前端控制器) 调用 View(视图) 对象的 render() 方法,将 Model 数据填充到视图中。
  8. 返回响应: DispatcherServlet(前端控制器) 将渲染后的视图作为 HTTP 响应返回给客户端。
  • 生活比喻: 想象你去一家大型医院看病
    • 你 (用户): 发起一个“看病”的请求。
    • DispatcherServlet (总服务台/导诊台): 你首先会去总服务台,而不是直接闯进某个科室。总服务台会接收你所有的请求。
    • HandlerMapping (分诊系统): 总服务台会根据你的“病症”(请求的 URL),查询分诊系统,告诉你应该去哪个科室找哪个医生(找到对应的 Controller 方法)。
    • Controller (医生): 你找到对应的医生,医生为你进行诊断(处理业务逻辑),并开出药方(返回 ModelAndView(模型与视图))。
    • ModelAndView (药方): 药方上写着你需要的数据(Model)和需要做的检查项目(View 的名称)。
    • ViewResolver (计价/导航系统): 你拿着药方去计价处,计价处会根据药方上的项目名称,告诉你具体要去哪个窗口缴费、哪个窗口取药(解析视图名称,找到具体的 View 实现)。
    • View (药房/检查科室): 你最终在药房取到了药,或者在检查科室完成了检查(渲染视图,生成最终的 HTML 或 JSON 响应)。

3. 核心组件与常用注解

3.1 核心组件详解

  • DispatcherServlet (前端控制器): 是整个 Spring MVC 的心脏和大脑,负责请求的统一分发和协调。
  • HandlerMapping (处理器映射器): 负责根据请求信息(如 URL)找到对应的处理器(Handler)。
  • HandlerAdapter (处理器适配器): 负责以一种统一的方式调用不同类型的处理器。
  • Controller (控制器): 处理器,负责处理用户请求,并返回 ModelAndView
  • ModelAndView (模型与视图): 模型和视图的容器,用于在 ControllerView 之间传递数据。
  • ViewResolver (视图解析器): 负责将逻辑视图名解析为具体的 View 对象。
  • View (视图): 负责渲染模型数据,生成最终的响应内容。

3.2 常用注解详解

  • @Controller / @RestController:

    • @Controller: 标记一个类为 Web 控制器,其方法的返回值通常是一个字符串,代表一个逻辑视图名 (View Name)。Spring MVC 会根据这个名字,找到对应的模板(如 JSP),然后将 Model 数据渲染成 HTML 页面返回给浏览器。
    • @RestController: 专门用于构建 RESTful Web 服务。它是一个组合注解,相当于 @Controller + @ResponseBody。它告诉 Spring,该控制器所有方法的返回值都应该被直接序列化(通常是转为 JSON),并作为 HTTP 响应的正文返回。
  • @RequestMapping / @GetMapping / @PostMapping:

    • @RequestMapping: 将 HTTP 请求映射到 Controller 的处理方法上,可以指定 URL、请求方法等。
    • @GetMapping: @RequestMapping(method = RequestMethod.GET) 的简写。
    • @PostMapping: @RequestMapping(method = RequestMethod.POST) 的简写。
  • @RequestParam / @PathVariable / @RequestBody:

    • @RequestParam: 用于获取 URL 中的查询参数(如 ?name=value)。
    • @PathVariable: 用于获取 URL 路径中的模板变量(如 /users/{id} 中的 id)。
    • @RequestBody: 用于将 HTTP 请求的 body 内容(通常是 JSON 或 XML)绑定到方法的参数上。
  • @ModelAttribute / @ResponseBody:

    • @ModelAttribute: 将方法的返回值或参数添加到 Model 中。
    • @ResponseBody: 标记在方法上,表示该方法的返回值直接作为 HTTP 响应的 body 内容返回,而不是解析为视图。

3.3 Spring MVC 中的父子容器 (Parent-Child Containers)

在一个典型的 Spring MVC Web 应用中,通常会存在两个 Spring 容器,它们构成了父子容器的关系。

  1. 父容器 (Parent Container / Root WebApplicationContext)

    • 创建者:通常由 ContextLoaderListener (在 web.xml 中配置) 创建。
    • 职责:负责管理业务层数据访问层的 Bean,例如 Service, Repository/DAO, DataSource, TransactionManager 等。这些是整个应用程序共享的、与 Web 层无关的 Bean。
  2. 子容器 (Child Container / Servlet WebApplicationContext)

    • 创建者:由 DispatcherServlet 创建。
    • 职责:负责管理Web 层的 Bean,例如 @Controller, ViewResolver, HandlerMapping, HandlerAdapter 等。这些 Bean 只与特定的 DispatcherServlet 相关。

父子容器的特点与优势:

  • 可见性规则
    • 子容器可以访问父容器中的 Bean:这意味着在 Controller (子容器中) 可以通过 @Autowired 注入 Service (父容器中)。
    • 父容器不能访问子容器中的 BeanService (父容器中) 不能注入 Controller (子容器中)。
  • 实现分层与解耦:这种结构清晰地将 Web 层与业务逻辑层分离开来,实现了关注点分离,使得系统架构更清晰。
  • 共享与隔离:多个 DispatcherServlet 可以共享同一个父容器中的业务 Bean,但每个 DispatcherServlet 又可以有自己独立的 Web 层配置,互不干扰。

4. 代码示例:创建一个简单的 Spring MVC 应用

我们将创建一个简单的 Web 应用,用于显示“Hello, Spring MVC!”。

4.1 Web 项目配置

要运行 Spring MVC,我们需要一个 Web 容器(如 Tomcat)和一个 web.xml 文件来配置 DispatcherServlet(前端控制器)

pom.xml (添加 Web 依赖)

<!-- ... 其他依赖 ... -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version>
</dependency>
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
</dependency>

web.xml (配置 DispatcherServlet)

<web-app ...><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextClass</param-name><param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value></init-param><init-param><param-name>contextConfigLocation</param-name><param-value>com.study.spring.mvc.AppConfig</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

4.2 Spring 配置与代码

// AppConfig.java (Spring 配置类)
package com.study.spring.mvc;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;@Configuration
@EnableWebMvc // 启用 Spring MVC
@ComponentScan("com.study.spring.mvc")
public class AppConfig {// 配置视图解析器 (ViewResolver)@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;}
}// HelloController.java (控制器)
package com.study.spring.mvc;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;@Controller
public class HelloController {@RequestMapping("/hello")public String sayHello(@RequestParam(value = "name", defaultValue = "World") String name, Model model) {// 1. 准备 Model 数据model.addAttribute("message", "Hello, " + name + "!");// 2. 返回逻辑视图名return "hello";}
}

4.3 视图 (JSP)

/WEB-INF/views/hello.jsp

<html>
<body><h2>${message}</h2>
</body>
</html>
  • 运行流程: 当用户访问 /hello?name=Spring 时,DispatcherServlet 会找到 HelloControllersayHello 方法。该方法将 message 属性添加到 Model 中,并返回逻辑视图名 helloViewResolverhello 解析为 /WEB-INF/views/hello.jsp,然后 Spring 将 Model 中的 message 数据渲染到 JSP 页面中,最终生成 HTML 响应。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1195413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Glyph艺术领域应用:画作描述生成系统搭建实战

Glyph艺术领域应用&#xff1a;画作描述生成系统搭建实战 1. 引言&#xff1a;当视觉推理遇上艺术创作 你有没有想过&#xff0c;一幅画作除了用眼睛欣赏&#xff0c;还能被“读懂”&#xff1f;不是靠人去解读&#xff0c;而是让AI真正理解画面中的内容&#xff0c;并用自然…

(2026年Dify插件趋势白皮书):仅限内部流传的3个顶级插件使用策略

第一章&#xff1a;Dify插件市场2026年有哪些好用的插件 随着Dify平台生态的持续演进&#xff0c;其插件市场在2026年已汇聚大量高效、智能的扩展工具&#xff0c;显著提升了开发者与企业的自动化能力。这些插件覆盖自然语言处理、数据集成、安全验证等多个关键领域&#xff0c…

MCP Server中API KEY配置的5大陷阱与最佳实践(90%开发者都忽略了)

第一章&#xff1a;MCP Server中API KEY配置的核心概念 在MCP&#xff08;Model Control Plane&#xff09;Server架构中&#xff0c;API KEY是实现服务间安全通信与访问控制的关键凭证。它不仅用于身份验证&#xff0c;还决定了调用方的权限范围和操作能力。合理配置API KEY能…

开发者入门必看:Qwen3-0.6B镜像开箱即用部署实战测评

开发者入门必看&#xff1a;Qwen3-0.6B镜像开箱即用部署实战测评 1. Qwen3-0.6B&#xff1a;轻量级大模型的高效选择 如果你是刚接触大语言模型的开发者&#xff0c;想找一个既能快速上手、又具备真实可用能力的小参数模型&#xff0c;那Qwen3-0.6B绝对值得你关注。它不是那种…

Spring 全家桶核心概念辨析:Spring, Spring MVC, Spring Boot, Spring Cloud

Spring 全家桶核心概念辨析:Spring, Spring MVC, Spring Boot, Spring Cloud 本文档旨在用最简洁的语言和比喻,帮助你快速理解 Spring 生态中最核心的四个概念之间的关系。 核心比喻:从积木到城市 想象一下你正在用…

从协议设计到实际调用,MCP与OpenAI Function Calling的技术鸿沟究竟有多深?

第一章&#xff1a;MCP与OpenAI Function Calling的技术鸿沟概述 在现代AI系统集成中&#xff0c;MCP&#xff08;Model Control Protocol&#xff09;与OpenAI Function Calling代表了两种截然不同的函数调用范式。前者强调模型与控制层之间的紧耦合通信机制&#xff0c;通常用…

机器人丝滑动作背后:被忽略的科研算力密码

当 31 个关节的人形机器人完成精准协作&#xff0c;用流畅动作打破科技与艺术的边界时&#xff0c;多数人惊叹于技术的炫酷&#xff0c;却鲜少追问&#xff1a;这些「钢铁舞者」何以实现毫秒级响应&#xff1f;答案藏在科研级硬件的核心 ——GPU 服务器的算力支撑里。一、机器人…

【道路缺陷检测】基于计算机视觉的道路缺陷检测附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#…

收藏!裁员潮下程序员破局:2026高价值赛道锁定大模型应用开发

年底大厂裁员传闻此起彼伏&#xff0c;不少程序员直呼就业市场“寒冬刺骨”。但看似机会萎缩的背后&#xff0c;实则是行业的结构性洗牌——程序员的高价值赛道已悄然迭代&#xff0c;过去的通用技能路径正在失效&#xff0c;新的黄金赛道已然浮现。 2026年&#xff0c;在AI技…

Spring - IoC/DI、Bean 作用域与生命周期

Spring 核心 —— IoC/DI、Bean 作用域与生命周期 1. 什么是 Bean? 在 Spring 框架中,Bean 就是由 Spring IoC 容器实例化、组装、管理的对象。简单来说,它就是 Spring 容器中的一个普通对象。生活比喻: 我们可以把…

cv_unet_image-matting图像抠图部署教程:从环境搭建到批量处理详细步骤

cv_unet_image-matting图像抠图部署教程&#xff1a;从环境搭建到批量处理详细步骤 1. 引言&#xff1a;为什么你需要这款AI抠图工具&#xff1f; 你是否还在为繁琐的图像抠图工作头疼&#xff1f;手动用PS一点点描边、调整蒙版&#xff0c;不仅耗时还容易出错。尤其是在电商…

Z-Image-Turbo错误码解读:StatusCode异常处理指南

Z-Image-Turbo错误码解读&#xff1a;StatusCode异常处理指南 Z-Image-Turbo_UI界面是一个直观、易用的图形化操作平台&#xff0c;专为图像生成任务设计。它将复杂的模型调用过程封装成简洁的交互流程&#xff0c;用户无需编写代码即可完成高质量图像的生成。界面布局清晰&am…

基于多目标分析的F-T柴油机SOOT和NOx排放物优化研究Matlab实现

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#…

kylin-安装cmake3.13过程与方法

kylin-安装cmake3.13过程与方法下载或者找到“cmake-3.13.2-x86.tar.gz”文件 解压“cmake-3.13.2-x86.tar.gz”文件到当前目录 打开“/usr/bin”目录,把“cmake”文件改名为“cmake3.5”备份一下 打开“/usr/bin”目…

GPEN与Stable Diffusion对比:生成模型在人像修复中的差异

GPEN与Stable Diffusion对比&#xff1a;生成模型在人像修复中的差异 你有没有遇到过这样的情况&#xff1f;一张老照片模糊不清&#xff0c;人脸细节几乎看不出来&#xff0c;想修复却无从下手。或者拍了一张低分辨率的自拍&#xff0c;发朋友圈都显得不够精致。这时候&#…

Speech Seaco Paraformer实战案例:学术讲座内容自动摘要生成

Speech Seaco Paraformer实战案例&#xff1a;学术讲座内容自动摘要生成 1. 为什么学术讲座需要自动摘要&#xff1f; 你有没有过这样的经历&#xff1a;参加一场90分钟的AI前沿讲座&#xff0c;记了满满三页笔记&#xff0c;结果回看时发现重点分散、逻辑断层、关键结论淹没…

珍藏版:RAG优化秘籍,助你轻松应对大模型面试与实战

文章系统介绍RAG三大优化层面&#xff1a;检索器优化&#xff08;混合检索、两阶段检索等&#xff09;、索引与分块优化&#xff08;精细化分块、元数据等&#xff09;和生成器优化&#xff08;Prompt设计、事实一致性验证等&#xff09;。提供工程落地方法和前沿创新方向&…

MicroSIP自定义web拨打协议

需求&#xff1a;通过网页电话号码呼叫指定MicroSIP。技术调研&#xff1a;MicroSIP支持sip:10086 进行网页调用进行呼叫。实现&#xff1a;一台电脑安装多个sip&#xff0c;可以自定义Session Initiation Protocol&#xff0c;会话初始协议&#xff0c;可以把sip换成自己任意的…

桥式起重机远程运维管理系统方案

一、行业背景桥式起重机是港口、物流园区、工厂车间等场所广泛使用的大型起重搬运设备&#xff0c;主要负责各类货物的装卸、转运与堆存作业。其运行稳定性直接关系到港口作业效率、仓储物流周转能力及生产线的连续性。在实际应用场景中&#xff0c;桥式起重机常需与堆场设备、…

为什么顶级AI项目都在转向MCP协议?揭开本地文件操作的安全黑箱

第一章&#xff1a;为什么顶级AI项目都在转向MCP协议&#xff1f;揭开本地文件操作的安全黑箱 在AI模型训练和部署过程中&#xff0c;本地文件系统的安全访问长期被视为“理所当然”的底层能力。然而&#xff0c;随着数据泄露事件频发&#xff0c;传统文件读写机制的脆弱性逐渐…