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

什么是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这个模块了,不需要再关注于前端了,我们只要约定好接口,写好后端即可,所以,对于后端,也有了一种新的分层方式,就是三层架构,分为以下三层:

  1. 表现层:展示数据结果,和接收用户的请求
  2. 业务逻辑层:负责处理业务逻辑
  3. 数据层:负责存储和管理数据

按照这样的层次划分,Spring MVC 站在后端的角度上,就将代码分成了:

  1. Controller 层:控制层,用来接收前端发来的请求,在Service 层中选择对应的处理逻辑,并且给前端进行响应
  2. Service 层:业务逻辑层,对发来的请求进行具体的逻辑处理
  3. 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证书免费申请指南

同学们可以私信我加入学习群! 正文开始 前言一、购买证书二、创建证书三、 验证证书等待出现如下页面,说明申请成功: ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6b6c1dd11d4c467687318552da7cdbb2.png) 总结 前言 今天为大…...

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 请求响应概述 当客户端发送不同的请求参…...

实验十 智能手机互联网程序设计(微信程序方向)实验报告

实验目的和要求 完成以下页面设计。 二、实验步骤与结果&#xff08;给出对应的代码或运行结果截图&#xff09; Wxml <view class"container"> <view class"header"> <view class"logo"…...

Python图形复刻——绘制母亲节花束

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

【算法优选】 动态规划之子数组、子串系列——壹

文章目录 &#x1f38b;前言&#x1f38b;最大子数组和&#x1f6a9;题目描述&#x1f6a9;算法思路&#x1f6a9;代码实现 &#x1f334;环形子数组的最大和&#x1f6a9;题目描述&#x1f6a9;算法思路&#xff1a;&#x1f6a9;代码实现 &#x1f332;乘积最大子数组&#x…...

PXE+Kickstart无人值守安装安装Centos7.9

文章目录 一、什么是PXE1、简介2、工作模式3、工作流程 二、什么是Kickstart1、简介2、触发方式 三、无人值守安装系统工作流程四、实验部署1、环境准备2、服务端&#xff1a;关闭防火墙和selinux3、添加一张仅主机的网卡4、配置仅主机的网卡4.1、修改网络连接名4.2、配IP地址4…...

C语言实现通讯录,包括增删改查以及动态开辟内存,写入文件等功能

文章目录 前言一、注意二、源码1. test.c源文件2. contact.h头文件3. contact.c源文件 总结 前言 C语言实现通讯录&#xff0c;包括增删改查以及动态开辟内存&#xff0c;写入文件等功能 一、注意 在通讯录菜单栏使用枚举定义PeoInfo类型时&#xff0c;每个结构体类型的成员…...

flowable多对并发网关跳转的分析

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…...

【嵌入式——QT】QT集成Ymodem协议使用UDP进行传输

【嵌入式——QT】QT集成Ymodem协议使用UDP进行传输 Ymodem协议帧的数据格式帧头包号校验 通讯过程握手信号起始帧数据帧结束帧代码块 Ymodem命令 QT实现YmodemFileTransmit.hYmodemFileTransmit.cppBootLoader.hBootLoader.cppYmodem协议源码 Ymodem协议 帧的数据格式 帧头、…...

python笔记(17)输入输出

一、标准输入与输出简介 Python通过内置的sys模块管理标准输入&#xff08;stdin&#xff09;、标准输出&#xff08;stdout&#xff09;和标准错误&#xff08;stderr&#xff09;。但对大多数简单应用而言&#xff0c;直接使用内置函数就足够了。 二、输入&#xff1a;inpu…...

408数据结构总结复习笔记一:线性表

408数据结构总结复习笔记一&#xff1a;线性表 从现在开始慢慢更新我的考研复习笔记系列吧~ PS&#xff1a;主要是我自己个人复习过程中觉得重点的点&#xff0c;大家仅供参考哈~ 上岸&#xff01;&#xff01;&#xff01;大家一起加油! 顺序表和链表的比较 顺序表链表存取…...

Docker——目录迁移

我们在生产环境中安装Docker时&#xff0c;默认的安装目录是/var/lib/docker&#xff0c;而通常情况下&#xff0c;规划给系统盘的目录一般为50G&#xff0c;该目录是比较小的&#xff0c;一旦容器过多或容器日志过多&#xff0c;就可能出现Docker无法运行的情况&#xff0c;所…...

SpringAMQP-消息转换器

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

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 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

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

汽车生产虚拟实训中的技能提升与生产优化​

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

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...