迷不迷糊?前后端、三层架构和MVC傻傻分不清

现在的项目都讲究前后端分离,那到底什么是前后端,前后端和以前的MVC以及三层架构啥关系呢?今天就这个问题展开一下,方面后面的学习,因为前面讲的jsp、servlet和javabean根据实例,基本上有一个框架的理解了,谁处理什么业务也大概清楚了,而且也提到了MVC这个东西,那就先从MVC说起吧。

一、先说说MVC模式

先上一张图,剩下全靠编O(∩_∩)O哈哈~!

对于MVC的说明图我觉得上面这个比较好,尤其对初学者,如果用户直接面对控制器理解上不好转弯,所以这个图里面是用户面向的view视图。

MVC是一种经典的设计模式。
[1]M代表的是model,即模型层,表示企业数据和业务规则,拥有最多的处理任务,一般用于封装数据,如,java中的pojo对象,亦或是java Bean,其包含成员属性以及getter/setter方法;
[2]V代表的事View,即视图层,Java中一般通过JSP页面或者HTML的方式进行展示;
[3]C代表的是Controller,即控制层,是模型层和视图层的粘合剂,起到核心控制的作用。例如:用户发送一个HTTP请求,此时该请求首先会被控制层捕获,进而控制层去调用Service服务获取数据并将其封装在模型层,最后将模型返回给视图层并进行展示。

M、V、C三者之间的关系可以简化描述为:

二、再说说什么是三层架构

三层架构是一种架构思想, 通常意义上的三层架构就是将整个业务应用划分为:
表现层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层 (Data access layer)。
1、表现层 :通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。 jsp/html
2、业务逻辑层 :针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。 servlet,service
3、数据访问层 :该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。dao

对于以上三层架构各层的代表作品如下:表现层实现的代表作品是 Struts,springmvc 框架, 业务层实现的代表作品是 Spring ,持久层实现的代表作品是Hibernate,mybatis。

三层架构每层之间的逻辑关系:

三、三层架构和MVC的关系是啥子

三层架构定义如下:

界面层/表示层 UIL(User Interface Layer)
业务逻辑层 BLL(Business Logic Layer)
数据访问层 DAL(Data Access Layer)

三层架构是一个分层式的软件体系架构设计,是针对整个软件系统的解耦,各层之间通过接口进行交互;而 MVC 是一个软件设计模式,是针对 Web 系统的解耦。
MVC 是应用在三层架构基础之上的,MVC 中的V/C 相当于三层架构中的 UIL 界面层,而 M 相当于三层架构中的 BLL/DAL 层。

把MVC理解成表示层的一部分(定义为表现层的一种设计模式),或者说是把表现层进行了分化,分成了M模型V视图C控制器三部分,都是不合理的,对照下图看一下就应该能明白了,大家看这里面的。

这张图个人感觉就很清楚了,Model是跨了web表示层,业务层和数据访问层的,这样的图也是合乎逻辑的。

四、三层架构的优缺点

1、三层架构的优点

  • 开发人员可以只关注整个结构中的其中某一层;
  • 可维护性高,可扩展性高;
  • 可以降低层与层之间的依赖;
  • 有利于标准化;
  • 利于各层逻辑的复用。

2、三层架构的缺点:

  • 降低了系统的性能。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成;
  • 有时会导致级联的修改,这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码;
  • 增加了开发成本。

五、MVC的弊端带来的前后端分离需求

MVC模型的弊端:

[1] 每次请求必须经过“控制器->模型->视图”这个流程,用户才能看到最终的展现的界面,这个过程似乎有些复杂;
[2]实际上视图是依赖于模型的,换句话说,如果没有模型,视图也无法呈现出最终的效果;
[3]渲染视图的过程是在服务端来完成的,最终呈现给浏览器的是带有模型的视图页面,性能无法得到很好的优化。

为了使数据展现过程更加直接,并且提供更好的用户体验,Roy Fielding博士在2000年写的一篇关于软件架构风格的论文,提出Representational State Transfer的思想,即现在所说的REST风格。核心思想就是首先从浏览器发送AJAX请求,然后服务端接受该请求并返回JSON数据返回给浏览器,最后在浏览器中进行界面渲染。其结构图如图所示:

我们将浏览器看做前端,服务器看做是后端的话,那传统的MVC模型就得到简化,实现了前后端的分离, 其结构图如图所示:

六、给前后端分离一个定义

前后端分离是指将一个web 系统的动态内容和静态内容进行分离,包括其开发、部署等。
比如传统的 MVC 架构,HTML、JS、CSS… 等前端代码和 Java、spring、mybatis… 等后端代码是在同一个项目中进行开发、部署的。那前后端分离后就可以分多个项目进行开发、部署、多个前端、多个后端,通过 http restful api 接口的形式进行交互。

前后端分类的带来的好处也是显而易见的:
前端和后端互不影响,实现高内聚低耦合,提升工作效率。
静态资源不占用后端资源,可维护性,扩展性更好。
静态资源可以缓存到代理服务器上(Nginx),加速响应。
静态资源可以部署带 CDN ,用户可以就近访问,提升用户的访问速度和体验。

或者更具体化的理解为:

[1]复杂的业务逻辑与数据生成,只有在站点数据层处写了一次,没有代码拷贝;
[2]底层service接口发生变化,只有站点数据层一处需要升级修改;
[3]底层service如果有bug,只有站点数据层一处需要升级修改;
[4]站点展现层可以根据产品的不同形态,传入不同的参数,调用不同的站点数据层接口。
除此之外,产品追求绚丽的效果,并对设备兼容性要求高,不再困扰Java工程师,由更专业的FE对接;一点点展现的改动,不再需要Java工程师们重新编译,打包,上线,重启tomcat;约定好json接口后,Java和FE分开开发,FE可以用mock的接口自测,不再等待一起联调。

参考资料:

https://www.jianshu.com/p/4571a630af86

https://blog.csdn.net/qq_48508278/article/details/122648284

https://blog.csdn.net/weixin_44346687/article/details/120000472

https://blog.csdn.net/BASK2311/article/details/130760490

最后写一句:学而不思则罔,思而不学则殆,与大家共勉。

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

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

相关文章

Ubuntu下使用DAPLink(OpenOCD)

目录 1. 下载OpenOCD源代码 2. 编译代码 2.1 运行bootstrap 2.2 安装关联库 2.3 运行./configure 2.4 运行make 2.5 运行sudo make install 3. 烧录程序 3.1 挂起MCU 3.2 写入镜像 3.3 校验镜像 通过OpenOCD实现,在Ubuntu18 64bit下验证。 1. 下载OpenOC…

人力资源社会保障部教育部关于印发《关于深化中小学教师职称制度改革的指导意见》的通知

人力资源社会保障部、教育部印发 关于《深化中小学教师职称制度改革的指导意见》的通知 人社部发[2015]79号 各省、自治区、直辖市及新疆生产建设兵团人力资源社会保障厅(局)、教育部门(教委、教育局): 为深化教育…

机器学习第29周周报 Beyond Dropout

文章目录 week29 Beyond Dropout摘要Abstract一、泛化理论二、文献阅读1. 题目2. abstract3. 网络架构3.1 特征图失真3.2 失真优化 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 全连接层实验4.3.2 卷积网络上的实验 4.4 结论 小结参考文献 week29 Beyond Dropout …

【C++专栏】C++入门 | 函数重载、引用、内联函数

博客主页:Duck Bro 博客主页系列专栏:C专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ C入门 | 函数重载、引用、内联函数 文章编号:C入门 / 02 文…

sizeof辨析——二维数组(超级详细)

二维数组加sizeof的知识如果基础不扎实,上面的代码恐怕很难区分,这篇文章就深度解析一下有关问题 我们在分析之前,要提及一些基础的前提知识 前提知识: 一: &数组名 和 sizeof(数组名)这…

【算法沉淀】最长回文子串

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《数据结构与算法:初学者入门指南》📘&am…

每日OJ题_路径dp①_力扣62. 不同路径

目录 力扣62. 不同路径 解析代码 力扣62. 不同路径 62. 不同路径 难度 中等 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标…

视频可回溯系统技术方案vue3+ts+tegg+mysql+redis+oss

一、 项目背景 保险、基金、银行等众多行业在做技术平台时都会需要一种能够准确了解用户操作行为的方式方法。诸如通过埋点、平台监控、视频可回溯等,通过技术手段,保存用户操作轨迹,以此规范安全销售、平台健康检查、出现纠纷时可追溯、问题…

chrome插件开发的几种展现页面形式,3分钟看完

想要开发一个chrome浏览器插件,还是很有必要清楚插件都可以在哪些地方显示出来的,比如只想在pop页面弹出,还是添加右键菜单,还是提示桌面通知?还是在哪里展示?有哪些展示方式等 browserAction(浏览器右上角…

免费下载Corel Video Studio 2024-轻松创建令人惊叹的视频!

免费下载Corel Video Studio 2024-轻松创建令人惊叹的视频! Corel Video Studio 2024免费下载Keygen 你厌倦了在视频编辑软件上花大钱吗?别再看了!我们为您提供了完美的解决方案——Corel Video Studio 2024。最棒的部分是什么?…

分享MDN前端结构化技能、实践指南、学习资源

前言 MDN课程为成为一名成功的前端开发人员提供了一个结构化的基本技能和实践指南,以及推荐的学习资源。 先看下让人不得不服的书《宝宝的网页设计》(套装共3册) 宝宝的HTML、宝宝的CSS、宝宝的JavaScript 全球首套中英文宝宝编程启蒙书&a…

计算机网络 八股

计算机网络体系结构 OSI:物理层、数据链路层、网络层、运输层、会话层、表示层、应用层

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Gauge)

数据量规图表组件,用于将数据展示为环形图表。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 可以包含单个子组件。 说明: 建议使用文本组件构建当前数值文本和辅…

【xv6操作系统】xv6 启动过程分析

一、调试用到的汇编代码 为了方便, Makefile 会创建.asm 文件,可以通过它来定位究竟是哪个指令导致了 bug。 可以看到, kernel 从 80000000 地址处开始执行,第二列为相应指令(如 auipc) 的 16 进制表示&a…

缩放算法优化步骤详解

添加链接描述 背景 假设数据存放在在unsigned char* m_pData 里面,宽和高分别是:m_nDataWidth m_nDataHeight 给定缩放比例:fXZoom fYZoom,返回缩放后的unsigned char* dataZoom 这里采用最简单的缩放算法即: 根据比…

猫头虎分享已解决Bug || 系统监控故障:MonitoringServiceDown, MetricsCollectionError

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

如何在一个pycharm项目中创建jupyter notebook文件,并切换到conda环境中

1、第一步可以直接在pycharm项目中创建jupyter notebook文件 2、假若想要切换成pytorch环境做实验例子,会发现报这个错误 Jupyter server process exited with code 1 C:\Users\12430\.conda\envs\pytorch3.11\python.exe: No module named jupyter在这里&#xff…

Python快速入门系列-2(Python的安装与环境设置)

第二章:Python的安装与环境设置 2.1 Python的下载与安装2.1.1 访问Python官网2.1.2 安装Python对于Windows用户对于macOS用户对于Linux用户 2.2 集成开发环境(IDE)的选择与设置2.2.1 PyCharm2.2.2 Visual Studio Code2.2.3 Jupyter Notebook2…

jvm堆概述

《java虚拟机规范》中对java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上。 一个JVM实例只存在一个堆内存(就是new 出来一个对象),java内存管理的核心区域 java堆区在jvm启动的时候就被创建,空间大小确定。是jvm管理的最大一…

力扣--滑动窗口438.找到字符串中所有字母异位词

思路分析: 使用两个数组snum和pnum分别记录字符串s和p中各字符出现的次数。遍历字符串p,统计其中各字符的出现次数,存储在pnum数组中。初始化snum数组,统计s的前m-1个字符的出现次数。从第m个字符开始遍历s,通过滑动窗…