黑豹程序员-架构师学习路线图-百科:MVC的演变终点SpringMVC

news2024/11/18 12:39:12

MVC发展史

在这里插入图片描述

在我们开发小型项目时,我们代码是混杂在一起的,术语称为紧耦合。
如最终写ASP、PHP。里面既包括服务器端代码,数据库操作的代码,又包括前端页面代码、HTML展现的代码、CSS美化的代码、JS交互的代码。可以看到早期编程就是一锅粥,造成代码晦涩难懂,小项目很好,开发快捷,这就是小型网站为何大家非常细化用PHP,开发效率高。但大项目就变得难以维护,同时UI和前端工程师是无法工作的,无法团队分工配合。因为他们不懂后端代码,让他们改,会直接把代码搞乱套。

怎么解决呢?开始出现分层体系架构。

第一代:微软的ASP+COM+实现两层架构

微软出品,ASP负责页面代码,COM+负责后端服务器代码。经过分离后开发者责任更加清晰,这就降低了维护难度,降低了耦合度。
但这个架构不够成熟,只体系了分层架构思想,但ASP的责任还是过多,COM+需要手动在window系统中注册,本人刚工作就负责干这个,那段痛苦的经历不堪回首。

第二代:SUN的Model1体系出炉

随着java开始流行,市场逐渐由ASP像JSP过渡。针对ASP+COM+的架构,SUN公司就推出了JSP+JavaBean的架构,称之为Model1。

Model1 模式十分简单,它使用 JSP 页面和 JavaBean 相结合的方式,由 JSP 页面来接收客户端请求,用 JavaBean 或其他服务完成业务逻辑、数据库操作和返回页面。JavaBean 是指能完成特定功能的 Java 类。
在这里插入图片描述
可以看到Model1其实并无什么太多的优点,其实只是抄袭和借鉴了ASP+COM+改为java实现而已。
虽然部分工作交给了JavaBean很轻量级的业务逻辑,但大多数工作还是集中在JSP中,职责不单一,职责过多过重,代码交织,如前端HTML展现代码、CSS的页面美化、JS的页面交互、数据库的处理。

于是进一步演化,推出了Model2体系

第三代:SUN的Model2体系出炉,标准MVC体系建立

Model1 虽然在一定程度上实现了解耦,但 JSP 依旧即要负责页面控制,又要负责逻辑处理,职责不单一。
Model2 应运而生,它又加了一层,形成三层架构,使得各个部分各司其职。
Model2 基于 MVC 模式:
(1)Controller:应用程序中用户交互部分(Servlet)
(2)Model: 应用程序数据逻辑部分(JavaBeans)
(3)View: 数据显示部分(JSP)

可见多了一个Servlet,它形成了前端和后端的交互。前端请求Servlet处理,在交给JavaBean处理业务逻辑访问数据库,将加工的结果返回给JSP,最终JSP进行页面展现。
在这里插入图片描述
虽然简单的只加了一层,但结构更加清晰,职责更加单一,MVC架构趋于成熟。

第四代:Struts1对MVC进行改进

Struts1 出现的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间,使用Struts1可以提高系统的维护和开发效率,我们只需要配置和编码实现Action和ActionForm就可以了。

Struts1的出现,使我们面向Servlet开发变为面向Action.do和ActionForm编程。Action替代Servlet,ActionForm封装数据模型。
同时又衍生出JSP页面的taglib库,来增强页面HTML的表现能力。

在这里插入图片描述

Struts1的成功又引入了Struts2蹭热度,它本质和Struts1无关,其核心是基于WebWork进行设计,但Struts1的名气太大了,它来蹭热度,蹭流量。
当然不是你想蹭就能蹭的,它又改进了Struts1功能。

当时Struts1有个致命弱点,就是Struts1仅有一个Action的实例来处理所有请求,就会产生一个致命问题线程安全问题,当并发量高时就会出现错乱。而Struts2另辟蹊径,它为每一个请求产生一个实例,因此天生就没有线程安全问题。

Struts1整合了JSTL,而Struts2不仅整合了JSTL,还支持OGNL表达式,让开发功能更加强大。

第五代:Struts2对Struts1进行改进

虽然那个时代大家都开始使用OGNL但今天回头来看是否是一个明智的选择呢?
OGNL过于复杂,晦涩难懂,而且造成致命的漏洞,后期压死Struts2的就是致命的漏洞。
Struts2 的安全漏洞,让不少大小公司吃尽了苦头,慢慢磨掉了用户的信心。

第六代:SpringMVC王者

最终Spring已经逐渐发展成熟,它在无法忍受Struts2,而推出了SpringMVC。而又随着注解方式的推出,
SpringMVC利于注解方式和自动封装方式一下打败了Struts2,让很重的Struts2(需要大量编程),瞬间变的极其简单,开发者代码量急剧降低,那个时期称为XML零配置。而且性能优异,远超Struts1、2。最终把它们拍在沙滩上。

从行业的旧三大框架SSH(Struts+Spring+Hibernate),最终形成今天我们依然再用的新三大框架SSM(SpringMVC+Spring+Mybatis)。

总结

再说个题外话,为何PHP最终倒台,就是它没有java的MVC框架,注定做大型项目时就干不过java,虽然后期也抄袭推出了它自己的三大框架,但几乎无人问津。
还有微软的ASP,虽然后期推出了ASP#.net,也抄袭了java形成MVC框架,但为时已晚,而且并无新的建树。
包括前端也出现MVVM等框架,其实都是抄袭和借鉴MVC。
足见MVC的对开发架构的影响有多深,时至今日目前市场几乎被SSM霸屏。

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

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

相关文章

mysql反斜杠多次转义简述

概述 通常在业务中会用正则/like去匹配一些数据.如果数据中有反斜杠,或者是用的正则语句。 那么在写sql的时候就需要转义下反斜杠,转义的时候有几个隐藏问题需要注意。 使用like做where条件 如下使用like要查询这两条数据的时候,需要用8个…

Android音视频开发之基础知识

一、视频文件 1、视频格式 常见格式:mp4、mkv、flv 封装的数据:音频码流、视频码流 常用工具: [FFmpeg下载]:https://ffmpeg.org/download.html 下载、安装并配置环境变量 ffmpeg.exe 视频编解码 ffplay.exe 播放器库 ffprobe.exe 音视频分…

【三:Spring整合Mybatis】

目录 Spring整合Mybatis(基于xml文件)1 、项目的大体框架前期准备1.2 、使用Navicat在数据库中创建一张表account1.3、 在pom.xml文件中加入maven(依赖的配置)1.4、配置相应的数据库连接,以及扫描相应的dao层 编写实体…

Unity中Shader实现UI流光效果

文章目录 前言一、实现思路1:1、采集两张贴图,一张是主纹理,一张是扫光纹理2、在 v2f 定义一个二维变量 “uv2” 来存放 uv 偏移后的值3、在顶点着色器中,仿照之前的 uv 流动效果,与 _Time相乘后存放于 uv2 中4、最后,…

微信小程序中封装请求,使用Async await方法,将异步请求变为同步请求方法

介绍 微信小程序中,很多 API都是异步的,无法同步处理。可以使用高级封装,通过async await方法来同步处理。 方法 在小程序右上角的 详情 里选择 本地设置 , 勾选 ES6转ES5,如下所示: 由于 Async Await 是 ES7语法&a…

Boost.Beast和C++编写程序

以下是一个使用Boost.Beast和C编写的爬虫程序&#xff0c;用于爬取。此程序使用了proxy的代码。 #include <iostream> #include <string> #include <boost/asio.hpp> #include <boost/beast.hpp> ​ std::string get_audio_url(const std::string&…

第十七章 Java连接数据库

1.打卡“命令提示符”&#xff0c;用管理员身份运行 2.登录MySQL 3.创建库和表 4.使用Java命令查询数据库操作 5.右击——点击“Build Path”——选择第四个——找到包的位置——导入成功 一、创建java项目 二、连接数据库 1.注册驱动 2.获取链接 3.获取statment对象 4.…

docker命令实例(举例子学习)

docker命令实例 实例1 docker build -t linksoul/chinese-llama2-chat .实例2 docker run --gpus all --ipchost --ulimit memlock-1 --ulimit stack67108864 --rm -it -v pwd/LinkSoul:/app/LinkSoul -p 7860:7860 linksoul/chinese-llama2-chat实例3 docker run -it -p 78…

QT串口接收数据并进行波形显示(含源码)

**使用QT在串口调试助手基础上实现波形显示&#xff08;含源码&#xff09; 评论比较多留言需要源码的&#xff0c;逐个发邮箱比较麻烦也不能及时回复&#xff0c;现将源码上传至链接&#xff08;无需积分下载&#xff09;https://download.csdn.net/download/m0_51294753/877…

Jupyter Notebook 设置黑色背景主题

Jupyter Notebook 设置黑色背景主题 # 包安装 pip install jupyterthemes -i https://mirrors.aliyun.com/pypi/simple pip install --upgrade jupyterthemes # 查看可用主题 jt -l # monokai暗背景&#xff0c;-f(字体) -fs(字体大小) -cellw(占屏比或宽度) -ofs(输出段的字…

自己DIY一个模拟多按钮电路

普通按键电路原理&#xff1a; 一般使用的按键原理图如下图所示&#xff0c;由按键、上拉电阻和消抖滤波电容组成。按键断开时KeyIin1处电压被上拉到5V&#xff0c;当按键闭合时把KeyIin1电压拉到0V&#xff0c;与按键并联的电容起到滤除按键按下与弹起时的高频信号。 如果在电…

让uniGUI支持https

今天在专家的帮助下&#xff0c;成功的让uniGUI支持https了。 首先&#xff0c;去申请个**的证书。我同事去阿里申请的&#xff0c;申请回是一个zip文件&#xff0c;里面有两个文件&#xff0c;一个扩展是per&#xff0c;一个key 然后&#xff0c;把这两个证书文件放到uniGUI…

【LeetCode】48. 旋转图像

1 问题 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8…

京东数据平台(京东数据分析)2023年9月京东冰箱行业品牌销售排行榜!

鲸参谋监测的京东平台9月份冰箱市场销售数据已出炉&#xff01; 9月份&#xff0c;大家电行业整体下滑&#xff0c;而冰箱作为大家电市场中的重点品类&#xff0c;受行业趋势变动的影响&#xff0c;冰箱销售市场也同样下滑。鲸参谋数据显示&#xff0c;9月在京东平台上&#xf…

浏览器下载打开java文件 出现一般异常错误提示你的安全设置已阻止自签名应用程序

环境&#xff1a; win10专业版 谷歌浏览器 问题描述&#xff1a; 浏览器下载打开java文件 提示你的安全设置已阻止自签名应用程序 解决方案&#xff1a; 1.打开控制&#xff0c;面板找到java 找到安全 &#xff0c; 将安全级别调至“中” 2.把例外站点也添加一下 3.重启…

总结关于计算机msvcp120.dll丢失的解决方法

在计算机的使用过程中&#xff0c;我们可能会遇到各种各样的问题&#xff0c;其中之一就是“msvcp120.dll文件丢失”。这是一个非常常见的问题&#xff0c;可能会影响到许多软件的正常运行。本文将详细介绍6种不同的解决方法&#xff0c;帮助大家解决这个问题。 首先&#xff…

No valid NAT64 prefix

As an AI language model, I do not have access to your network configuration or settings. However, in general, the error message “No valid NAT64 prefix” indicates that there is a problem with the configuration of IPv6 to IPv4 translation. NAT64 is a mech…

深度剖析数据在计算机内存中的存储

本章重点 1.计算机中数据类型详细介绍 2.整形在内存中的存储方式 3.大小端字节序介绍以及判断方法 1. 数据类型详细介绍 C语言中我们学习的内置类型数据有以下几种。 类型数据类型名称占用内存空间字节char 字符数据类型 1short 短整型 2int 整形 4long 长整型 4long long …

09 创建型模式-建造者模式

1.建造者模式介绍&#xff1a; 建造者模式 (builder pattern), 也被称为生成器模式 , 是一种创建型设计模式 定义: 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不 同的表示。 2.建造者模式要解决的问题 建造者模式可以将部件和其组装过程分开&am…

SLAM从入门到精通(构建自己的slam包)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们学习了很多的开源包&#xff0c;比如hector、gmapping。但其实我们也可以自己编写一个slam包。这么做最大的好处&#xff0c;主要还是可以帮助…