WEB发展史

前言

作为一个java小白,学web方向十分痛苦,知识点很多,很杂,比如前端有html、css、JavaScript、JQuery,前端框架bootstrap等,后端的Servlet、jsp、EL、JSTL,数据库方向有JDBC、MySQL,框架有MyBatis、spring、springmvc、springboot…光是这些五花八门的名称就搞得我心态爆炸,如果不写篇文章来梳理梳理就被这东西搞疯了。

我们可以按照web开发的历史进程,来回顾和web大哥一起发展的帮派小弟JavaWeb。

一、静态页面时代

互联网刚刚发展的时候,就像人类文明诞生前夕一样,刀耕火种。
那时的网站都相当简陋,功能简单。网站都是静态的。即事先编辑好,只能浏览页面,没有人机交互,不能动态上传删除,只能程序员手动添加。

二、CGI时代

新的技术CGI诞生,结束了只有静态网页的时代。
问题产生:怎么把静态网页变成动态网页?

我们都知道,动画其实就是25幅页面,连续播放,利用人眼的视觉暂留效应,将一幅幅图片组合成动画。
同理,动态页面也是如此,如果服务器能对浏览器发来的请求在服务器端一一处理,并返回给浏览器,那么网页就动起来了!

什么是CGI?

CGI全称是通用网关接口(Common Gateway Interface),是一个可执行的程序或者可运行的脚本,几乎所有的语言都能写CGI,像Python、C。

CGI工作原理:

浏览器发送一个CGI请求后,服务器会启动一个进程运行CGI程序或脚本,由CGI来处理数据,并将结果返回给服务器,服务器再将结果返回给浏览器

CGI的特点

1.由Http Server唤起。常见的Http Server如Apache,Lighttpd,nginx都支持CGI
2.CGI单独启动进程,并且每次调用都会重新启动进程
3.可以用任何语言编写,只要该语言支持标准输入、输出和环境变量

CGI的缺点

1.消耗资源多:每个请求都会启动一个CGI进行,进程消耗资源15M内存的话,同时到达100个请求的话,就会占用1.5G内存。如果请求更多,资源消耗是不可想象的。
2.慢:启动进程本身就慢。每次启动进程都需要重新初始化数据结构等,会变得更慢。

三、Servlet时代

在CGI繁荣发展的时代,Java还没有发展起来。当Java开始参与历史,引领潮流的时候,也必然会借鉴和改进之前的技术和思想。
鉴于CGI的一些缺点,Java Web在开始设计的时候就想出了一种解决方案 – Servlet

什么是Servlet?

本质上是一段无法独立运行的Java程序,必须运行在服务器中,由服务器调用执行。作用是对服务器接收过来的请求进行处理,并对浏览器返回结果。

Servlet的工作原理:

Servlet的特点:
CGI每个请求启动一个进程,而Servlet是更轻量的线程。
CGI每个进程都需要初始化,Servlet只初始化一次实例就行。
Servlet依托于Java语言,具有很好的跨平台型。CGI根据语言的不同,跨平台型不同。
CGI与数据库连接需要重连,Servlet可以使用数据库连接池。
Java有丰富的、各种各样的库函数。
Servlet的缺点
不难发现,html代码是写在Java代码中,对于前端人员,难以开发和修改,此时,JSP粉墨登场

Servlet的好兄弟JSP

Servlet其实是在java代码中写HTML代码,换个思路,我们也可以在HTML代码中写Java代码,这就是JSP的特性。

什么是JSP?

JSP,全称Java Server Pages,功能就是能在Html中写Java代码,其本质上是一个Servlet程序。

JSP的工作原理

您的浏览器发送一个HTTP请求给服务器。
Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎。通过使用URL或者.jsp文件来完成。
JSP引擎从磁盘中载入JSP文件,然后将它们转化为servlet。这种转化只是简单地将所有模板文本改用println()语句,并且将所有的JSP元素转化成Java代码。
JSP引擎将servlet编译成可执行类,并且将原始请求传递给servlet引擎。
Web服务器的某组件将会调用servlet引擎,然后载入并执行servlet类。在执行过程中,servlet产生HTML格式的输出并将其内嵌于HTTP response中上交给Web服务器。
Web服务器以静态HTML网页的形式将HTTP response返回到您的浏览器中。
最终,Web浏览器接收HTTP response中动态产生的静态HTML网页,由静到动最终实现。
用一句话来讲:每个JSP都最终会变成对应的Servlet执行

JSP的缺点

在HTML代码中写Java代码,方便了前端人员,但是苦了后端人员。因此,单纯使用JSP,开发效率依旧不高。

我们结合Servlet和JS的功能来看,发现无论是JSP还是Servlet,其中都能书写Html和Java代码。这样功能岂不是重复了吗?

从功能的角度看,两者的功能是重复了,但是从两者的特性看,Servlet非常适合逻辑处理(因为它是Java代码),而JSP非常适合页面展示,(因为主要是html代码)
结合两者的优缺点,诞生了Web开发中最重要的架构设计模式:MVC。

四、 Servlet+JSP+JavaBean

JSP+JavaBean(Model1)

这里就要首先弄清楚JavaBean到底是啥?
JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取(百度)。其实可以理解就是Java类,这里我理解为JavaBean的出现作为和数据库交互的类,Jsp页面里边中写部分Java代码用于转发等操作以及HTML页面的生成代码,而获取数据的方式以及部分业务逻辑则通过JavaBean来实现。

整体结构

在这里插入图片描述

这种开发模式有一个简单的分层 JSP:表现层、控制层 JavaBean:模型层 利用我们现在熟悉的MVC模型的思想去看,虽然编写代码十分容易,但Jsp混淆了MVC模型中的视图层和控制层,高度耦合的结果是Jsp代码十分复杂,后期维护依旧困难。由原有的Model1开发模式转变成Model2开发模式,即Servlet+JSP+JavaBean。同时也使得在Web项目中将MVC设计模式实现

Servlet+JSP+JavaBean(Model2)

Model1虽然在一定程度上解耦了,但JSP依旧即要负责页面控制,又要负责逻辑处理,职责不单一!此时Model2应运而生,使得各个部分各司其职,Model2是基于MVC模式的。Model2的开发模式是:Jsp+Servlet+JavaBean的模式,它和Model1不同的是,增加了Servlet。

在这种开发模式下,JSP页面中就可以不用任何的<%%>语句了,包括<%=%>全部用EL表达式来代替,列表的遍历和条件判断等(Java中的for循环和if语句)也可以通过JSTL来代替。 这样的话视图层相比较之前的开发模式来说要薄得多的多,JSP中不涉及任何的业务逻辑,前端人员修改样式也十分方便。这里可以理解为JSP为MVC设计模式中的V,即视图。

控制层通过Servlet来实现,获取前台传的参数、控制页面跳转,封装对象、向前台传输对象或者参数。并且可以由自己设计,设法用一个Servlet类实现该模块的所有功能的页面跳转。这里可以理解为Servlet为MVC设计模式中的C,即控制器。

但这里要说明的是Model2并不是一个完全标准的MVC设计模式,因为JavaBean还过于臃肿,并不能完全作为M层存在,所以将JavaBean再一次进行分割:业务逻辑、数据持久化。

五、MVC模式

jsp出现后,也存在问题,1)前端开发人员需要看大量他看不懂的后端代码;2)同样,servlet开发人员也在复杂的前端代码中找到其能写servlet代码的地方

所以,MVC思想的JSP+JavaBean+Servlet诞生了

JSP(V):JSP完成输入和输出,主要使用HTML标签和JSP标签
Servlet(C):主要完成控制,接收请求,调用业务处理(JavaBean),根据调用的结果找到一个JSP页面对用户进行响应
JavaBean(M):完成所有的处理过程

MVC模式

MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):

Controller——负责转发请求,对请求进行处理
View——负责界面显示
Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现

工作原理:

请求发来后,会首先经过Controller层处理
根据请求进行处理,返回的结果封装成对象Model
将Model传递给JSP,然后JSP负责取出数据展示就够了
因此,后端开发人员只负责编写Servlet,前端人员负责JSP,极大提升了开发效率。

六、框架阶段

倡导了MVC思想的jsp+javabean+servlet出现,也存在问题:1)jsp页面中嵌入了很多java代码,使得结构很乱;2)对于大型项目,servlet过多,转向频繁,流程,配置等不易集中管理,因而出现了struts

Struts的出现

2001年6月,struts1.0出现,struts针对jsp推出了一套struts标签,从而使得jsp中没有了Java代码,结构清晰,功能强大。针对servlet,它提供了Action类来代替了servlet,这个Action类具有servlet的功能,并且能够进行一些请求过滤和自动转码的功能。

Spring的出现

原本已经开起来很完美了,但是又有一个问题,就是我们在Action调用DAO、Java bean等对象的时候都需要在自身代码中构建它们的对象来使用,这样增加了程序的耦合性,这与我们:“高内聚、松耦合”的思想不符合,那么怎么解决这个问题呢?因而出现了Spring框架。

Spring框架有两大功能:IOC(控制反转)和AOP(面向切面的编程),其中IOC就是说:当一个类中想要调用另外一个类的对象时,不需要再通过new 关键字来创建,而是由Spring框架来负责:创建、分配和管理,从而降低了程序中的耦合性。而AOP可以用来做一些日志的打印和输出,用于提示程序执行过程中的一些具体信息等。

SpringMVC的出现

最后struts和Spring的整合,由于每一个bean都要在Spring中注册,每一个URL都要在struts配置文件中配置。当bean很多和URL对应的请求很多的时候,配置文件无疑会是很庞大的,这个就会使得配置起来很麻烦的费力。那么还有没有更好的办法使得能够结合Spring的功能和struts的功能,但是又可以使配置文件不会批量的增加?因而SpringMVC出现了

SpringMVC通过“基于注解”的方式代替了struts,并且通过Controller类来代替和实现了Action的功能。由于是基于注解的,所以很多的配置信息放在了Controller类中配置,从而降低了.xml文件的配置复杂度。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值