Spring 基础核心 - SpringMVC 入门与请求流程

news/2025/10/2 18:33:49/文章来源:https://www.cnblogs.com/xiaoke520/p/19123857

Spring 基础核心 - SpringMVC 入门与请求流程

本文是介绍 Spring 技术的第四篇入门级文章,前面已经介绍了 Spring 入门案例、IOC 容器、AOP 切面编程。

阅读本文了解:

  • 无 MVC 时如何开发 web 项目
  • 前后端分离来源
  • MVC 架构模式
  • Spring MVC 请求流程

引言

早期的 web 应用开发开发存在一个极其普遍且致命的问题:代码的混乱与耦合。在 MVC 普及之前,开发者使用 JSP 、PHP 等技术开发 web 应用,那会的技术会把代码都混在一起,比如一个登录功能的代码是这样:

<%@ page import="java.sql.*" %><html><body><h1>Login</h1><%// w问题1:业务逻辑、数据访问、UI展示代码全部纠缠在一起String username = request.getParameter("username");String password = request.getParameter("password");// 问题2:直接在页面里写数据库连接和查询(数据访问逻辑)Connection conn = null;try {conn = DriverManager.getConnection("jdbc:mysql://localhost/mydb", "user", "pass");Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'");// 问题3:在页面里判断业务逻辑if (rs.next()) {// 痛点4:直接在页面里输出HTML(视图逻辑)out.println("<h2>Welcome, " + username + "!</h2>");} else {out.println("<h2>Login Failed! Please try again.</h2>");}} catch (SQLException e) {out.println("<h2>System Error!</h2>");} finally {// ... 关闭连接}%></body></html>

这种职责混乱、高度耦合的代码非常难以维护,所谓“牵一发而动全身”。

MVC 架构的出现拯救了这种混乱的局面,像一把利剑一样强制分离关注点,拆分为 Model(数据/业务)、View(视图)、Controller(控制器)三部分,各司其职,前端和后端的岗位源自于 MVC 的架构模式。可以说,没有MVC奠定的“分离”思想,就不会有现代的前后端分离。前端专注于 View(视图)职责,后端专注于 Model 和 Controller 职责,并行开发,互不干扰。

看一张 Spring 的架构图:

作为 Spring 使用者,Core Container 模块应该都不陌生,@Bean 注解,Context 上下文类等都见过,而 AOP 或多或少也熟悉,问题来了,这两个模块是 Spring 的底层模块,如何利用它们构建上层应用?如 web 引用?

针对上层的 Web 应用,SpringMVC 诞生了,它也是 Spring 技术栈中最为重要的一个框架。

所以为了更好的帮助你串联整个知识体系,我列出了几个问题,通过如下几个问题帮你深入浅出的构建对SpringMVC的认知

  • Java技术栈的 Web 应用是如何发展的?
  • 什么是 MVC,什么是 SpringMVC ?
  • SpringMVC 主要的请求流程是什么样的?
  • SpringMVC 中还有哪些组件?
  • 如何编写一个简单的 SpringMVC 程序呢?

什么是 MVC?

MVC英文是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计规范。本质上也是一种解耦。

软件设计规范:为了解决某一类反复出现的问题,总结出一套被广泛认可的、行之有效的结构和模式。具有结构性的特点:通常定义了组件的角色、职责以及它们之间的交互方式,很像在某类问题、某个场景下的方法论。相似的概念是设计思想,这两个概念经常互用,不过设计思想更抽象一点。

设计思想:软件设计的核心原则和理念,回答的是“为什么要这么设计?”的问题。具有普适性,不局限于某个具体的问题或场景,可以应用在各种场景。比如高内聚、低耦合就是一种设计思想,任何编程语言都可以用。

回归到 MVC 学习,MVC 三个重点概念:模型、视图、控制器。看的出来这是一种数据、界面显示、业务逻辑分离的方法。

  • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
  • View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
  • Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据

什么是 Spring MVC ?

上述介绍了 MVC 是一种设计思想,本质上是个抽象的东西,类似于“蓝图”,开发者无法直接使用。Spring MVC 便是基于 MVC 思想设计出来的开发框架,一个具体、可运行的产品,或者理解成一套“web应用开发工具包”,Spring MVC 目的是简化 Java 栈的 Web 开发。

Spring MVC 概念并不难理解,那 Spring MVC 是如何工作的呢?

Spring MVC 请求流程

看Spring MVC 的流程要将前后端串起来看,不能仅思考后端流程。

它的核心工作流程可以概括为:

  1. 首先用户发送请求——>DispatcherServlet前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行 处理,作为统一访问点,进行全局的流程控制;
  2. DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求(如 user/list)映射为 HandlerExecutionChain 对象(包含一 个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
  3. DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器(适配器设计模型,便于调用),从而支持多种类型的处理器, 即适配器设计模式的应用,从而很容易支持很多类型的处理器;
  4. HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法(Controller 方法),完成功能处理;并返回一个ModelAndView 对象, 前后端分离项目返回的是一个 业务对象(如:List );
  5. ModelAndView 的逻辑视图名——> ViewResolver,ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术,如果是前后端分离项目,此步骤跳过,没有 ModelAndView 对象,那就没东西解析;
  6. View——>渲染,View 会根据传进来的Model 模型数据进行渲染,此处的Model 实际是一个Map 数据结构,因此很容易支持其他视图技术;
  7. 返回控制权给DispatcherServlet,由DispatcherServlet 返回响应给用户,到此一个流程结束。

一个基本的请求流程就是如此实现,如果涉及到

参考文章

https://pdai.tech/md/spring/spring-x-framework-springmvc.html#spring-mvc案例

本文由mdnice多平台发布

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

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

相关文章

网络平台怎么建立网站吗汕头百度搜索排名优化

张宇、汤家凤、武忠祥、李永乐、杨超、王式安、方浩这些老师都有自己擅长的细分 比如张宇老师&#xff0c;杨超&#xff0c;汤家凤&#xff0c;武忠祥老师的高数讲的很好&#xff0c;李永乐老师是线代的神&#xff0c;王式安、方浩概率论讲的很好&#xff0c;所以对于不同的学…

(数据结构)链表OJ——刷题练习 - 实践

(数据结构)链表OJ——刷题练习 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

重测序数据fastp数据质控及fastQC质量评估

001、fastp -i sample_name_1.fq.gz -o sample_name_qc_1P.fastq.gz -I sample_name_2.fq.gz -O sample_name_qc_2P.fastq.gz --thread 4 -g -q 20 -u 30 -l 150 --overlap_diff_limit 1 --overlap_diff_percent_limit…

网站建设公司南京wordpress 数据库说明

一.递归 &#xff08;1&#xff09;汉诺塔问题 当n2时&#xff0c;要将A中最下面盘子上方的盘子放到B上&#xff0c;最下面盘子放到C上&#xff0c;再将B上的盘子通过A放到C即可&#xff1b; 当n3时&#xff0c;要将A中最下面盘子上方的盘子放到B上&#xff0c;最下面盘子放到…

请问怎么做网站惠州网站开发

类的加载顺序 有父子关系的类在加载时先调用父类静态初始化块&#xff0c;静态属性&#xff0c;但不包括静态方法&#xff0c;然后再是&#xff0c;子类静态初始化块&#xff0c;静态属性&#xff0c;但同样不包括静态方法 。 类什么时候被加载/类加载时机&#xff1a; 第一&…

深圳网站建设机构深圳工程建设交易服务中心网站

Java基础教程之多线程 下 &#x1f539;本节学习目标1️⃣ 线程的同步与死锁1.1 同步问题的引出2.2 synchronized 同步操作2.3 死锁 2️⃣ 多线程经典案例——生产者与消费者&#x1f50d;分析sleep()和wait()的区别&#xff1f; &#x1f33e; 总结 &#x1f539;本节学习目标…

东莞做网站的公司乐山高端网站建设

现在&#xff0c; 电视机 对于每个家庭来说已然不是什么奢侈品&#xff0c;并且已经成为必备的家庭电器之一。其实&#xff0c;国产电视机中也有不少的知名品牌&#xff0c;但是许多消费者对国外的电子技术持有更高的认可度&#xff0c;因此下面小编就来跟大家讲讲sony电视&…

企业网站建设大概费用网站打开速度突然变慢的原因

... 转载于:https://www.cnblogs.com/2008nmj/p/7264769.html

8. Spring AI tools/function-call - 教程

8. Spring AI tools/function-call - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

企业网站优化方案范本收费网站必须备案吗

RHEL6的网络管理与RHEL5的有比较大的改变。虽然在RHEL5、6中均安装有NetworkManager&#xff0c;在RHEL5中2、3、4、5级别中默认是不启用的。但在RHEL6中&#xff0c;默认是启用的&#xff0c;NetworkManager会一直监控网卡状态&#xff0c;修改网卡参数立即生效不用重启服务。…

门户网站开发技术 知乎下载ppt模板免费

def shape_print(n): #实心等腰三角形 for y in range(n): for x in range(n-y-1):#先循环打印空格 形成一个倒直角三角形 range()中的值是形成的规律 print( ,end) for z in range(y*21):#再循环打印X 形成一个等腰三角形 range()中的值是形成的规律 print(X,end) print() pri…

electron 安装失败

清理缓存重装# 删除依赖和锁文件 rm -rf node_modules pnpm-lock.yaml# 清理pnpm缓存 pnpm store prune# 重新安装 pnpm install#一行命令rm -rf node_modules pnpm-lock.yaml && npm cache clean --force 使用…

LeetCode刷题记录----62.不同路径(Medium) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

python基础——正则表达式 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

机器学习15:自监督式学习(Self-Supervised Learning)① - 实践

机器学习15:自监督式学习(Self-Supervised Learning)① - 实践2025-10-02 18:11 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impo…

长沙旅游网站开发旅游网站的建设背景

ChatGPT4和Gemini Ultra被Claude 3 AI模型超越了&#xff1f; 3月4日周一&#xff0c;人工智能公司Anthropic推出了Claude 3系列AI模型和新型聊天机器人&#xff0c;其中包括Opus、Sonnet和Haiku三种模型&#xff0c;该公司声称&#xff0c;这是迄今为止它们开发的最快速、最强…

2025担保合同律师事务所推荐,专业团队高效解决法律难题!

2025担保合同律师事务所推荐,专业团队高效解决法律难题!在当今复杂的经济环境中,担保合同作为金融交易和商业合作中的重要法律工具,其纠纷和风险也日益增多。根据行业数据显示,近年来担保合同相关案件的年增长率保…

「补充篇」在Cloudflare上设置并更新SRV记录

「补充篇」在Cloudflare上设置并更新SRV记录索引 │ ├─关于本教程 ├─创建SRV记录 ├─获取DNS更新令牌 ├─获取区域ID ├─获取DNS记录ID ├─更新SRV记录 └─结尾关于本教程 在之前的教程中我们已经介绍了使用…

10.1 CSP模拟26 改题记录

HZOJ 写在前面 hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh T1几分钟出思路然后在写假的道路上越改越远,T2来不及了乱写,T3猜不到结论,只有T4是合理得分、、、 A. median 题意是给定5个长为…

Spring 核心 - AOP 面向切面编程入门, 通俗易懂

Spring 核心 - AOP 面向切面编程入门, 通俗易懂撰写本文目的只有一个,让你畅快阅读 AOP 知识,并搞定以下几个问题。 AOP 面向切面编程到底是什撰写本文目的只有一个,让你畅快阅读 AOP 知识,并搞定以下几个问题。AO…