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

SpringMVC 入门详解: MVC 思想(附核心流程)

SpringMVC 入门详解: MVC 思想(附核心流程)

在 Java 后端开发中,“表述层”(也就是和前端交互的部分)是项目的 “门面”—— 用户的请求要靠它接收,处理结果要靠它返回。而 SpringMVC 就是目前 Java EE 表述层开发的 “首选方案”,几乎所有中大型 Java 项目都会用到它。

这篇文章从基础的 MVC 思想讲起,带你搞懂 SpringMVC 是什么、它的核心逻辑,最后再用一个简单案例上手实战,新手也能轻松理解。

一、先搞懂 MVC:软件架构的 “分工思维”

在学 SpringMVC 之前,得先明白它的 “源头”——MVC 思想。MVC 不是技术,而是一种 “分工合作” 的软件设计思路,目的是让代码职责更清晰、更好维护。

1. 什么是 MVC?

MVC 是 Model(模型)、View(视图)、Controller(控制器) 的缩写,它把软件分成 3 个部分,每个部分负责不同的工作:

  • 「视图」负责 “展示”:给用户看的页面(比如 HTML、JSP);

  • 「控制器」负责 “调度”:接收用户请求,安排谁来处理;

  • 「模型」负责 “干活”:处理业务逻辑、操作数据(比如计算价格、查数据库)。

简单说:MVC 就是让 “展示、调度、干活” 分开,避免代码全堆在一起(比如早期 JSP 里又写 HTML 又写 Java 代码,乱得没法维护)。

2. MVC 的 3 个核心角色(职责要分清)

(1)Model(模型层):“干活的人”

对应工程里的 JavaBean,专门处理数据和业务逻辑,分两类:

  • 实体类 Bean:存数据的 “容器”,比如 User(存用户名、密码)、Order(存订单号、金额),字段和数据库表字段对应;

  • 业务处理 Bean:干具体活的,比如 UserService(处理用户登录、注册逻辑)、OrderDao(操作订单数据的增删改查)。

(2)View(视图层):“展示的窗口”

对应工程里的 HTML、JSP、Vue 页面 等,负责和用户交互:

  • 接收用户输入(比如表单填写);

  • 展示处理结果(比如页面显示用户信息、订单列表)。

(3)Controller(控制层):“调度的管家”

对应工程里的 Servlet(早期)或 SpringMVC 的 @Controller 类,负责 “承上启下”:

  • 接收用户从 View 发来的请求(比如点击 “登录” 按钮);

  • 调用 Model 层处理请求(比如让 UserService 验证账号密码);

  • 把处理结果交给 View 展示(比如登录成功跳首页,失败提示错误)。

3. MVC 工作流程(通俗版)

用 “用户登录” 举个例子,一步一步看 MVC 怎么协作:

  1. 用户在登录页面(View)输入账号密码,点击 “登录”;
  2. 请求被 Controller(比如 LoginController)接收;
  3. Controller 调用 Model 层的 UserService,让它验证账号密码;
  4. UserService 调用 UserDao 查数据库,确认账号密码是否正确,返回结果给 Controller;
  5. Controller 拿到结果:如果正确,让 View 跳转到首页;如果错误,让 View 显示 “账号密码错误”;
  6. View 把最终结果展示给用户。

二、SpringMVC 是什么:Spring 家族的 “表述层专家”

了解了 MVC,再看 SpringMVC 就简单了 —— 它是 Spring 家族专门为 “表述层” 设计的框架,是 MVC 思想的 “落地实现”,而且和 Spring 无缝整合(不用额外写一堆配置)。

1. SpringMVC 的定义

SpringMVC 是 Spring 的子项目,为 Java EE 表述层提供全套解决方案

  • 解决 “接收请求、处理请求、返回响应” 的全流程问题;

  • 替代早期的 Servlet(不用每个请求写一个 Servlet,代码量锐减);

  • 支持 RESTful 接口、文件上传下载、拦截器、异常统一处理等常用功能。

2. 三层架构中的 SpringMVC(定位要明确)

我们常说的 “三层架构”(表述层、业务逻辑层、数据访问层),SpringMVC 就是 “表述层” 的核心:

三层架构职责对应技术 / 组件
表述层(展示层)接收请求、返回响应SpringMVC、HTML、Vue
业务逻辑层处理核心业务(比如订单计算)Spring Service(@Service)
数据访问层操作数据库(增删改查)MyBatis、Spring Data JPA

简单说:用户的请求先到 SpringMVC(表述层),再传给 Service(业务层),最后到 Dao(数据层);处理结果反向返回,最终由 SpringMVC 响应给用户。

三、SpringMVC 的核心特点:为什么大家都选它?

SpringMVC 能成为主流,靠的是它 “好用、灵活、能扛住大项目” 的特点,每一个都戳中开发者的痛点:

1. Spring 家族原生产品:无缝整合

和 Spring IOC 容器(管理 Bean 的核心)天生兼容,不用额外做整合配置。比如在 SpringMVC 的 @Controller 里,直接用 @Autowired 注入 Spring 的 @Service Bean,开箱即用:

@Controller // SpringMVC 控制器
public class UserController {// 直接注入 Spring 业务层 Bean,不用额外配置@Autowiredprivate UserService userService;
}

2. 前端控制器:DispatcherServlet(“调度中心”)

这是 SpringMVC 的 “核心大脑”,所有用户请求都先经过它,再由它统一分配给其他组件处理。不用像早期 Servlet 那样,每个请求写一个 XXXServlet(比如登录写 LoginServlet,注册写 RegisterServlet),代码量大大减少。

简单理解:DispatcherServlet 就像公司的 “前台”,所有访客(请求)先找前台,前台再告诉 TA 该找哪个部门(组件)处理。

3. 功能全覆盖:不用找第三方

表述层需要的功能,SpringMVC 基本都自带,不用额外引入其他框架:

  • 路由映射:@RequestMapping 注解轻松配置请求路径;

  • 参数绑定:自动把请求参数(比如表单数据)转成 Java 对象;

  • 视图解析:自动找到要渲染的页面(JSP/HTML);

  • 异常处理:@ControllerAdvice 统一处理所有控制器的异常;

  • 文件上传:MultipartFile 轻松处理文件上传。

4. 代码简洁:注解驱动开发

用注解替代传统 XML 配置,几行代码就能写一个接口。比如下面这个控制器,不用写任何 XML,就能处理 /user/login 请求:

@Controller
public class UserController {// 配置请求路径:/user/login,处理 POST 请求@PostMapping("/user/login")// 请求参数自动绑定到 User 对象public String login(User user) {// 调用业务层处理登录boolean success = userService.login(user);// 登录成功跳首页,失败跳登录页return success ? "index" : "login";}
}

5. 性能优秀:适合大型项目

内部组件化程度高,可插拔(比如不想用默认的视图解析器,自己配一个就行),而且基于原生 Servlet 开发,性能损耗小,能扛住超大型互联网项目的并发(比如电商平台的订单接口)。

四、SpringMVC 核心工作流程(请求 “走流程” 的全过程)

前面说的 DispatcherServlet 是核心,那一个请求从进来,到 SpringMVC 处理完返回,具体走了哪些步骤?

  1. 用户发请求:比如在浏览器输入 http://localhost:8080/user/login,请求先到 Tomcat 服务器,再传给 SpringMVC 的 DispatcherServlet;

  2. DispatcherServlet 找 “路由表”:它会问「处理器映射器(HandlerMapping)」:“/user/login 这个路径对应哪个 Controller?”,处理器映射器返回对应的 Controller 信息(比如 UserController 的 login 方法);

  3. DispatcherServlet 找 “执行者”:它再问「处理器适配器(HandlerAdapter)」:“怎么调用这个 Controller 的 login 方法?”,处理器适配器会按照 SpringMVC 的规则,准备好调用参数;

  4. 调用 Controller 处理请求:处理器适配器调用 UserController 的 login 方法,Controller 会调用 UserService 处理业务逻辑(比如查数据库验证账号);

  5. 返回处理结果:Controller 处理完,返回一个 ModelAndView 对象(包含 “数据” 和 “要展示的页面”,比如数据是用户信息,页面是 index.jsp);

  6. DispatcherServlet 找 “页面解析器”:它把 ModelAndView 传给「视图解析器(ViewResolver)」,视图解析器找到实际的页面路径(比如把 index 解析成 /WEB-INF/views/index.jsp);

  7. 渲染视图:视图解析器把页面和数据结合,生成最终的 HTML 页面;

  8. 响应给用户:DispatcherServlet 把 HTML 页面返回给浏览器,用户看到首页。

简单画个流程图,更直观:

用户请求 → DispatcherServlet → 处理器映射器 → 处理器适配器 → Controller → ModelAndView → 视图解析器 → 渲染视图 → 响应用户

五、总结:SpringMVC 的核心价值

SpringMVC 之所以成为 Java 表述层的 “王者”,核心在于它解决了开发者的实际痛点:

  • 「解耦」:把请求接收、业务处理、视图展示分开,代码更易维护;

  • 「简洁」:注解驱动开发,几行代码就能写一个接口,不用堆 XML;

  • 「整合」:和 Spring 无缝对接,不用额外做兼容;

  • 「全能」:从参数绑定到异常处理,从文件上传到 RESTful 接口,功能全满足;

  • 「能扛」:性能优秀,支持大型项目高并发。

如果你是 Java 后端开发者,SpringMVC 是必须掌握的核心框架 —— 它不仅是面试高频考点,更是实际工作中每天都会用到的 “工具”。后续可以深入学习它的拦截器、异常统一处理、RESTful 风格优化等高级功能,让接口设计更专业。


文章转载自:

http://qYzgtoTj.rzdpd.cn
http://uW3iuI54.rzdpd.cn
http://ofyIBuj1.rzdpd.cn
http://sTxtD73h.rzdpd.cn
http://fTCWEPH9.rzdpd.cn
http://B1yTSogr.rzdpd.cn
http://ft0NhiId.rzdpd.cn
http://hRus8mu0.rzdpd.cn
http://vMwnuJvc.rzdpd.cn
http://Fvi0DhT2.rzdpd.cn
http://68PRyhJX.rzdpd.cn
http://HurybA4N.rzdpd.cn
http://c7hsP6Mh.rzdpd.cn
http://0JEEoEs6.rzdpd.cn
http://mnKhtaCK.rzdpd.cn
http://f73jeksY.rzdpd.cn
http://gYJ4g18a.rzdpd.cn
http://XLZ5eFbC.rzdpd.cn
http://e7uQ8upn.rzdpd.cn
http://SrzW1utb.rzdpd.cn
http://ROA5sB8m.rzdpd.cn
http://Pg0EBPZu.rzdpd.cn
http://zNTzNkER.rzdpd.cn
http://JUfB9kOC.rzdpd.cn
http://qxLXhHcp.rzdpd.cn
http://dMrZYDIO.rzdpd.cn
http://UPY9gbjB.rzdpd.cn
http://TN5gZcMn.rzdpd.cn
http://AsdJ678B.rzdpd.cn
http://mgoptCM1.rzdpd.cn
http://www.dtcms.com/a/371708.html

相关文章:

  • CMake简易使用教程
  • daily notes[13]
  • Solana 核心概念:计算单元与交易成本解析
  • 【系统分析师】第11章-关键技术:软件需求工程(核心总结)
  • 如何通过日志先行原则保障数据持久化:Redis AOF 和 MySQL redo log 的对比
  • 做好LoRaWAN的传感器都需要实现哪些功能点?
  • React入门 | React 新手入门与常用库和工具
  • jvm问题排查
  • C/C++数据结构之栈基础
  • 【Qt】项目的创建和各个控件的使用
  • Python高级技巧(七):装饰器
  • C#有人IO模块USR-IO808的完整指南
  • Apache Dubbo学习笔记-使用Dubbo发布、调用服务
  • CTFshow系列——PHP特性Web97-
  • Photoshop - Photoshop 创建图层蒙版
  • DevOps实战(3) - 使用Arbess+GitLab+Hadess实现Java项目自动化部署
  • Python从入门到精通_00_初识python
  • LabVIEW 与 PLC 通讯
  • 项目介绍:图像分类项目的最小可用骨架--代码细节讲解
  • 【.Net技术栈梳理】01-核心框架与运行时(CLR与GC)
  • 简述ajax、node.js、webpack、git
  • Java安全体系深度研究:技术演进与攻防实践
  • Drupal XSS漏洞复现:原理详解+环境搭建+渗透实践(CVE-2019-6341)
  • Mybatis常见问题
  • Python基础语法篇:布尔值是什么?True 和 False 的实际用途
  • FMI(Functional Mock-up Interface,功能模型接口)
  • macOS中设置环境变量的各文件及作用域
  • Python+DRVT 从外部调用 Revit:批量创建楼板
  • 课前准备--解码乳腺癌进展:单细胞基因组与转录组的联合分析
  • 机器学习中的损失函数是什么