什么是MVC?什么是SpringMVC?什么是三层架构?
文章目录
- 应用分层
- 什么是MVC?
- 什么是 SpringMVC?
- 三层架构
- 三层架构和MVC的关系
应用分层
在讲解什么是MVC之前,先来理解一下什么是应用分层。
应用分层是一种软件开发设计思想,将应用程序划分成N个层次,每个层次都分别负责自己的职责,多个层次之间来协同提供完整的功能,根据项目的复杂度,将项目分成三层或四层等。
举个例子:比如,一个公司创始初期,创始人要身兼数职,既要做财务,又要做人事,又要做行政,但随着公司的越来越大,就会划分成多个不同的部门。
为什么要进行应用分层???
在功能简单,代码量少是,我们通常不考虑分层,但是,随着业务越来越复杂,功能越来越强大,大量的代码都混在了一起,会出现逻辑不清晰,各模块相互依赖,代码扩展性差,改动一处牵动全身等问题,所以,就要对项目进行分层,MVC 和 三层架构 都是应用分层的充分体现,下面先看一下什么是MVC。
什么是MVC?
MVC(Model View Controller),它是一种思想,他把软件系统分为 以下三部分:
Model(模型):用来处理程序中数据逻辑的部分
View(视图):在应用程序中,专门和浏览器进行交互,展示数据的资源
Contreller(控制器):可以理解成是一个分发器,来决定对于视图发来的请求,需要用哪一个模型来处理,以及处理完后需要跳回到哪一个视图,也就是用来连接视图和模型的
举个例子:
1.比如进入京东的购物页面
2.搜索手机
以上的过程,当进入京东购物网站时,这个页面就相当于是一个视图,它向我们展示了各种各样的资源,在我们搜索手机这个资源时,就会发送出一个请求,此时,这个请求会交给 控制器(Controller),控制器针对这个请求就会选择对应处理模型(Model),对这个请求进行处理,而上图的展示的手机资源的页面,就相当于是处理模型处理的结果,由控制器再将这个视图返回给我们。
再举一个简单的例子:
比如我们去餐厅吃饭,服务员就会来接待我们,服务员就会将我们点的菜写在小本本上,然后交给前台,前台再交给厨师,厨师做完之后,就会再交给前台,前台再根据这个菜确定是哪个菜单,然后再让服务员交给客人,此时,服务员帮我们写菜单就相当于是一个视图,前台就相当于是控制器,厨师就相当于是模型
什么是 SpringMVC?
MVC 它是一种思想,而SpringMVC 它是将这种思想进行了实现,除此之外,SpringMVC 还是一种 Web 框架
比如,在创建 SpringBoot 项目时,所勾选的 Spring Web 框架就是SpringMVC框架,所以,可能就会产生这样的疑问:我们创建的不是SpringBoot项目吗,怎么变成了 SpringMVC 项目,它们俩之间到底有什么关系呢???
SpringBoot 和 SpringMVC 的关系
SpringBoot是2014年发布的,Spring是2004年发布的,在2014年发布之前,就不能⽤Spring实现MVC架构吗?当然不是了.
SpringBoot 只是实现 SpringMVC 的一种方式,SpringBoot 可以添加很多的依赖,借助这些依赖实现不同的功能,SpringBoot 就是通过添加 SpringWebMVC框架,来实现Web功能
举个例子:
比如做饭,我们做饭不是只能在厨房做,做饭这个事情在几千年就有了,只要有火有食材就可以做,所以做饭就比是 MVC,SpringBoot 就好比是厨房,通过在厨房里装燃气灶,装一些工具等,也可以实现做饭这个功能。
所以,如果想要实现 Web开发的话,就要引入这个 Web 框架
Spring在实现 MVC的时候,也做了一些改进:
直接把请求发给 控制器Controller,并不经过视图。就像我们去餐厅吃饭时,不需要服务员为我们记录菜单了,直接由前台记录,记录完之后交给厨师。
三层架构
现在MVC这种方式也已经不再使用了,而主流的是前后端分离,不再需要View这个模块了,不需要再关注于前端了,我们只要约定好接口,写好后端即可,所以,对于后端,也有了一种新的分层方式,就是三层架构,分为以下三层:
- 表现层:展示数据结果,和接收用户的请求
- 业务逻辑层:负责处理业务逻辑
- 数据层:负责存储和管理数据
按照这样的层次划分,Spring MVC 站在后端的角度上,就将代码分成了:
- Controller 层:控制层,用来接收前端发来的请求,在Service 层中选择对应的处理逻辑,并且给前端进行响应
- Service 层:业务逻辑层,对发来的请求进行具体的逻辑处理
- Dao 层:数据访问层,负责访问数据库,进行增删查改的操作
三层架构和MVC的关系
从概念上来讲,两者都是软件工程中的架构模式,并且两者也是非常相似的,就如下面这张图:
三层架构的“表现层”也就是对应着MVC的 View层 和 Ctroller层,因为它们都是用来展示数据和接收请求的,所以,站在后端人员的角度上看,其实, 表现层也可以看成是视图层,三层架构中的业务逻辑层和数据层对应的就是MVC中的model层,都是用来处理业务逻辑的。二者只不过是从不同角度上进行了抽象,MVC它强调的是数据和视图的分离,将数据的展示和数据的处理分开。通过控制器对两者进行结合。三层架构强调的是从不同纬度上对数据进行处理,以达到“高内聚,低耦合”
高内聚:一个模块中各个元素之间的联系的紧密程度,如果各个元素之间的联系程度越高,则内聚性越高,即“高内聚”。
低耦合:项目中,各个层或者模块间的依赖关联程度越低越好,不会因为修改一处代码,造成很多的代码都需要改动。
相关文章:

什么是MVC?什么是SpringMVC?什么是三层架构?
文章目录 应用分层什么是MVC?什么是 SpringMVC?三层架构三层架构和MVC的关系 应用分层 在讲解什么是MVC之前,先来理解一下什么是应用分层。 应用分层是一种软件开发设计思想,将应用程序划分成N个层次,每个层次都分别负责自己的…...

基于springboot+vue+Mysql的在线答疑系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...

ssl证书免费申请指南
同学们可以私信我加入学习群! 正文开始 前言一、购买证书二、创建证书三、 验证证书等待出现如下页面,说明申请成功:  总结 前言 今天为大…...

Java构造方法详解
在Java方法内部定义一个局部变量时,必须要初始化,否则就会编译失败,如下: 要让上述代码通过编译,只需在使用a之前给a赋一个初始值即可 如果是对象:下面用一个日期类演示 我们没有给年月日赋值,…...

Spring WebFlux:响应式编程
在软件开发领域,随着互联网应用的规模和复杂性不断增加,传统的编程模型逐渐暴露出一些局限性,尤其是在面对高并发、大规模数据流处理等场景时。为了应对这些挑战,响应式编程(Reactive Programming)应运而生…...

uniapp、web网页跨站数据交互及通讯
来来来,说说你的创作灵感!这就跟吃饭睡觉一样,饿了就找吃的,渴了就倒水张口灌。 最近一个多月实在是忙的没再更新日志,好多粉丝私信说之前的创作于他们而言非常有用!受益菲浅,这里非常感谢粉丝…...

2024-05-10 Ubuntu上面使用libyuv,用于转换、缩放、旋转和其他操作YUV图像数据,测试实例使用I420ToRGB24
一、简介:libyuv 最初是由Google开发的,主要是为了支持WebRTC项目中的视频处理需求。用于处理YUV格式图像数据的开源库。它提供了一系列的函数,用于转换、缩放、旋转和其他操作YUV图像数据。 二、执行下面的命令下载和安装libyuv。 git clo…...
怎么给视频加水印?2招轻松搞定
在数字媒体时代,视频水印作为一种有效的版权保护手段,被广泛应用于各种场景。给视频添加水印不仅可以防止内容被恶意盗用,还能增加视频的辨识度,提升品牌形象。本文将为您介绍2种简单易行的方法,教您怎么给视频加水印&…...

SpringBootWeb 篇-深入了解请求响应(服务端接收不同类型的请求参数的方式)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 请求响应概述 1.1 简单参数 1.2 实体参数 2.3 数组集合参数 2.4 日期参数 2.5 json 参数 2.6 路径参数 3.0 完整代码 1.0 请求响应概述 当客户端发送不同的请求参…...

实验十 智能手机互联网程序设计(微信程序方向)实验报告
实验目的和要求 完成以下页面设计。 二、实验步骤与结果(给出对应的代码或运行结果截图) Wxml <view class"container"> <view class"header"> <view class"logo"…...

Python图形复刻——绘制母亲节花束
各位小伙伴,好久不见,今天学习用Python绘制花束。 有一种爱,不求回报,有一种情,无私奉献,这就是母爱。祝天下妈妈节日快乐,幸福永远! 图形展示: 代码展示: …...

【算法优选】 动态规划之子数组、子串系列——壹
文章目录 🎋前言🎋最大子数组和🚩题目描述🚩算法思路🚩代码实现 🌴环形子数组的最大和🚩题目描述🚩算法思路:🚩代码实现 🌲乘积最大子数组&#x…...

PXE+Kickstart无人值守安装安装Centos7.9
文章目录 一、什么是PXE1、简介2、工作模式3、工作流程 二、什么是Kickstart1、简介2、触发方式 三、无人值守安装系统工作流程四、实验部署1、环境准备2、服务端:关闭防火墙和selinux3、添加一张仅主机的网卡4、配置仅主机的网卡4.1、修改网络连接名4.2、配IP地址4…...
C语言实现通讯录,包括增删改查以及动态开辟内存,写入文件等功能
文章目录 前言一、注意二、源码1. test.c源文件2. contact.h头文件3. contact.c源文件 总结 前言 C语言实现通讯录,包括增删改查以及动态开辟内存,写入文件等功能 一、注意 在通讯录菜单栏使用枚举定义PeoInfo类型时,每个结构体类型的成员…...

flowable多对并发网关跳转的分析
更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: h…...
【嵌入式——QT】QT集成Ymodem协议使用UDP进行传输
【嵌入式——QT】QT集成Ymodem协议使用UDP进行传输 Ymodem协议帧的数据格式帧头包号校验 通讯过程握手信号起始帧数据帧结束帧代码块 Ymodem命令 QT实现YmodemFileTransmit.hYmodemFileTransmit.cppBootLoader.hBootLoader.cppYmodem协议源码 Ymodem协议 帧的数据格式 帧头、…...
python笔记(17)输入输出
一、标准输入与输出简介 Python通过内置的sys模块管理标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。但对大多数简单应用而言,直接使用内置函数就足够了。 二、输入:inpu…...
408数据结构总结复习笔记一:线性表
408数据结构总结复习笔记一:线性表 从现在开始慢慢更新我的考研复习笔记系列吧~ PS:主要是我自己个人复习过程中觉得重点的点,大家仅供参考哈~ 上岸!!!大家一起加油! 顺序表和链表的比较 顺序表链表存取…...
Docker——目录迁移
我们在生产环境中安装Docker时,默认的安装目录是/var/lib/docker,而通常情况下,规划给系统盘的目录一般为50G,该目录是比较小的,一旦容器过多或容器日志过多,就可能出现Docker无法运行的情况,所…...

SpringAMQP-消息转换器
这边发送消息接收消息默认是jdk的序列化方式,发送到服务器是以字节码的形式,我们看不懂也很占内存,所以我们要手动设置一下 我这边设置成json的序列化方式,注意发送方和接收方的序列化方式要保持一致 不然回报错。 引入依赖&#…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...