JavaWeb程序架构模式的演进
老一辈的程序员一般都经历了Web程序架构模式的演进,从最开始的在jsp或者jsp+Servlet上做开发,到后来的mvc、三层等。而现在有挺多人学完web,可能都没怎么使用过jsp或jsp+Servlet开发过项目,就直接学习使用Spring、Spring Boot或者SpringMVC等框架进行开发。如果没有经历这样一个逐步演进的过程,就很难理解框架带给了我们什么样的好处,而且开发过程中遇到问题也难以解决,更别说去学习这些框架中的源码了。学习是一个循序渐进的过程,不能急于求成,所以本文旨在简单的聊一聊Web的发展史。
一、web发展简史
以目前Spring Boot作为时间轴的话,web发展的过程大致可以分为以下几个阶段:
1.纯jsp / jsp+Servlet / jsp+JavaBean+Servlet
2.MVC / MVP / 三层架构
3.使用EJB进行分布式应用的开发,EJB是重量级框架,在使用上比较复杂和麻烦
4.由于EJB太重了,于是Spring应运而生,但是Spring在发展上越来越臃肿,所以还是有许多繁琐的配置
5.同样的由于String配置太繁琐,于是Spring boot诞生了,这时就可以体验到 “约定大于配置” 的乐趣
二、web发展初始阶段
1.jsp / jsp+Servlet / jsp+JavaBean+Servlet开发模式:
在最开始的时候,jsp刚刚出来,那时候的web开发基本都是在jsp+JavaBean上完成的。更有甚着直接把页面、逻辑、数据处理全都写在jsp上,想也知道这种方式开发的项目代码不仅乱、而且耦合性相当高,造成项目难以维护。
纯JSP流程图如下:
JSP+JavaBean流程图如下:
相信很多人在刚开始学习JavaWeb的时候,或多或少都使用过以上两种模式的开发,第一种模式就不用说了,所有的代码都写在JSP上耦合度相当地高。第二种模式虽然相较于第一种模式上,在一定程度上解耦了,但JSP依旧要负责页面控制以及请求与响应的处理,职责不单一。耦合度依旧比较高,高度耦合的结果是JSP代码十分复杂混乱,后期维护很困难。
以上这种模式虽然开发起来比较简单,当时这种模式也能够适合一些小型项目的开发,但是由于代码混乱维护困难也就逐渐被淘汰了。
领教到这种模式的蛋疼之后就开始加上了Servlet,这时JSP只负责页面控制,Servlet上负责数据的验证,JavaBean负责具体的业务逻辑与数据处理、封装以及和数据库交互等。
JSP+JavaBean+Servlet流程图如下:
在这种模式上已经开始有点MVC的影子了,但是这种模式还不能称之为一个比较完善的MVC设计模式。这种模式相对于之前的两种模式来说分工更明确,抽取出了Servlet层,体现了一个简单的分层思想。
思维导图:
三、web发展初中级阶段
1.MVC架构模式
这时候web开发上也开始应用了MVC架构模式,尽管MVC早已不是什么新鲜的架构模式了,早在桌面开发的时代MVC模式就已经存在。MVC是Model、View、Controller的缩写,MVC将系统分解为模型、视图、控制器三部分,每一部分都相对独立,职责单一,在实现过程中可以专注于自身的核心逻辑。MVC是对系统复杂性的一种合理的梳理与切分,它的思想实质就是“关注点分离”。至于MVC三元素的职责划分与相互关系,这里不再赘述,下图给出了非常细致的说明:
上图说明了MVC组件的功能和关系。
MVC模式各部分之间的通信方式如下:
View 传送指令到 Controller
Controller 完成业务逻辑后,要求 Model 改变状态
Model 将新的数据发送到 View,用户得到反馈
所有通信都是单向的
接受用户指令时,MVC 可以分成两种方式。一种是通过 View 接受指令,传递给 Controller,流程图如下:
另一种是直接通过controller接受指令,流程图如下:
一般在实际项目中往往采用更灵活的方式,通常会把这两种方式结合在一起,大致流程图如下:
1.用户可以向 View 发送指令(页面请求)。
2.用户也可以直接向 Controller 发送指令(Servlet请求)。
现在的SpringMVC就是MVC架构模式的框架。
MVP架构模式:
MVP与MVC很像,MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。所以很多人都不是很分的清这两种模式的区别,简单来说两者主要的区别在于,MVC是单向通信的,而MVP是双向通信的。MVP模式将 Controller 改名为 Presenter,所以同时改变了通信方向,流程图如下:
MVP特点:
- 各部分之间的通信,都是双向的。
- View 与 Model 不发生联系,都通过 Presenter 传递。
- View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,大部分主要逻辑都部署在那里。
三层架构模式:
三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。
很多人容易把三层模式与MVC模式混淆,三层与MVC的最不同的地方在于三层是没有Controller控制器的概念。虽然同样是架构级别的,三层与MVC相同的地方在于他们都有一个表现层,但是他们不同的地方在于其他的两个层。MVC没有把业务的逻辑访问看成两个层,这是采用三层架构或MVC搭建程序最主要的区别。当然了,在三层中也提到了Model概念,但是三层架构中Model的概念与MVC中Model的概念是不一样的,“三层”中典型的Model层是以实体类构成的,而MVC里,则是由业务逻辑与访问数据组成的。
在三层中JSP与Servlet代码都属于表示层,业务逻辑层则是完成业务规则的实体类,数据访问层则是JDBC等代码,示意图:
以上已经介绍了几种架构模式,可以看到架构模式的演进目的都是为了解耦,低耦合的架构才能方便于项目后期的维护和扩展,好的架构模式才能让项目有较好的健壮性。
四、web发展中高级阶段
这个阶段开始使用EJB进行分布式应用的开发:
EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序。简单来说就是把已经编写好的程序(即:类)打包放在服务器上执行。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。EJB (Enterprise JavaBean)是J2EE(javaEE)的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。 在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。在EJB3.0推出以后,实体Bean被单独分了出来,形成了新的规范JPA。
EJB 从技术上而言不是一种"产品",EJB 是一种描述了构建应用组件要解决的标准:
- 可扩展 (Scalable)
- 分布式 (Distributed)
- 事务处理(Transactional)
- 数据存储(Persistent)
- 安全性 (Secure)
以上转自百度百科。
由于我个人没有使用过EJB进行开发,不敢随便发表意见,以免误导大家,对EJB有兴趣的可以参考以下文章:
Spring的诞生:
Rod Johnson在2002年编写的《Expert One-to-One J2EE Design and Development》一书,Rod 在本书中对J2EE正统框架(EJB)臃肿、低效、脱离现实的种种学院派做法提出了质疑,并以此书为指导思想,编写了interface21框架,也就是后来的Spring。
基于最优方法并适用于各种应用类型的Spring框架的建立要归功于Rod Johnson。这些想法也在他的书中得以阐述。书发表后,基于读者的要求,源代码在开源使用协议下得以提供。
一批自愿拓展Spring框架的程序开发员组成了团队,2003年2月在Sourceforge上构建了一个项目。在Spring框架上工作了一年之后,这个团队在2004年3月发布了第一个版本(1.0)。这个版本之后,Spring框架在Java社区里变得异常流行,部分的要归结于它好于一般水准的文档功能和参考文献,特别是对于一个开源项目而言尤其如此。
Spring解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。
Spring框架的特征:
- 轻量
- 控制反转
- 面向切面
- 容器
- 框架
- MVC
Spring架构图:
Spring虽然相较于EJB要轻量很多,但是发展到现在,Spring也有些臃肿了,在配置上也稍微有些繁琐,但是Spring依旧是现在的主流框架之一。框架的存在就是为了方便于我们使用一些架构模式,不必再从底层去开始开发,提高了开发的效率。
五、web发展目前阶段
到目前为止,已经出现了很多优秀的java开源框架,常见的有Spring、SpringMVC、Spring Boot、Struts 、Hibernate、MyBatis等,其中Spring Boot是Spring框架的简化。通过这些框架,我们可以很高效的应用架构模式去开发大型的项目。
化繁为简,Spring Boot框架:
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
Spring Boot特点:
- 可以创建独立的Spring应用程序
- 嵌入的Tomcat,无需部署WAR文件
- 简化Maven配置
- 自动配置Spring
- 提供生产就绪型功能,如指标,健康检查和外部配置
- 绝对没有代码生成以及不要求配置XML
Spring Boot虽然目的是为了简化Spring,似乎看起来无需去学习Spring的繁琐配置,直接学Spring Boot多好啊,配置简单美滋滋,但是如果没有忍受过Spring的繁琐配置,没有经历过架构模式的演进以及JavaWeb基础不扎实的话,在使用Spring Boot的过程中就容易出现没有遇到过的错误,也不知道如何去解决。而且设计模式不熟悉的话,也不知道人家框架是怎么进行实现的,设计思想完全不知道,那么即便有好的框架在手也没法玩得6,更别说去设计架构模式了。
六、小结
从以上的演进简史可以看到目前这些主流框架是怎么来的,为什么要有这些框架。可以说我们目前学习技术的时代赶上了最好的时代,现在有那么多优秀的开源框架可以使用,又有那么多的设计思想可以借鉴,我们跳过了很多前人经常踩的坑,正是前人踩过了这些坑之后,才能发展那么多优秀的开源框架与设计思想。但是我们也应该要去经历一下这种架构模式的演进,才能深刻体会到不同的架构模式与框架带给我们的好处。现在的新东西越来越多,你我只有不停的进步,不停地学习才能跟上这个时代。
来源:51CTO
作者:ZeroOne01
链接:https://blog.51cto.com/zero01/2062619