1. web运行模式
所谓的出现背景,其实就是“为什么会想到创造servlet”。在解释这个问题需要了解的前提的是Web的运行模式,Web是以客户端/服务器端的模式,通过HTTP协议来交互的。奠定了这个基础之后,再来看无论我们通过本地机即客户端上网做什么,比如搜索一个查询,打开一个邮件,请求所得到的页面还有各种各样的数据都是从服务器端得到的。服务器是一个设备,它可以根据网络上的不同的客户所提交的请求而提供不同的信息。所以总结一句话就是:客户端请求,服务器端提供信息。
2.CGI和servlet实现数据交互
下面就很自然的想到一个问题,如何实现客户端和服务端在Web上的数据交互。这个问题的引出了servlet出现的背景。
最开始的时候是通过编写CGI(CommonGateway Interface)通用网关接口程序来实现的。那么CGI这个东西到底是怎么实现,其实我也不是很懂,但是这个不是我现在需要最需要了解的,我需要了解的是CGI能够完成什么。很明显,前面提到了CGI实现的是在Web上客户端和服务端的数据交互。但是一开始我也提到了这个是最开始的时候使用的东西,后面servlet就将CGI代替了。写到这里就了解到了一个很重要的信息,servlet能够完成的东西就是CGI完成的东西,即在客户端和服务器端进行数据交互。
3.CGI和servlet的区别
那么下一个问题是为什么servlet会将CGI代替。现在就需要了解一下这两个东西一些实现原理的东西。
CGI是根据浏览器的HTTP请求激活响应进程,每一个请求对应一个进程,当同时有很多请求时,程序挤占系统资源,造成效率低下。
servlet是引入了采用多线程来代替进程的技术。
所以可以看到两个技术其实就是进程和线程的区别,那么进程和线程到底有什么区别呢?
1、程序:程序是为完成特定任务、用某种语言编写的一组指令的集合。指一段静态的代码。
下图就是一段c++代码:
2、进程:从程序代码的加载、执行到执行完毕的动态过程。
每个进程所占用的系统资源相对独立,并有它自己的专用的内存区域(PCB进程控制块)。同一个应用程序可以被多次加载到系统的不同内存区域,分别执行,形成不同的进程。是系统进行调度和资源分配的一个独立单位。
进程和程序的联系:进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。
3、线程:线程是比进程更小一级的执行单元,是对CPU单元的独立占有的最小单位。
线程和进程的联系:线程不能独立存在,必须存在于进程中,各线程间共享进程空间的数据。一个进程在其执行过程中,可以产生多个线程,从而实现程序的并发执行。每个线程也有它自身的产生、存在和消亡的过程,也是一个动态的概念。
线程创建、销毁和线程间切换的代价远小于进程,又称为轻量级进程(lightweight process)。
使用线程的好处:
系统负担小,主要是CPU的分配。
使同一个程序能有几个并行执行的路径,提高了执行速度,线程需要的系统开销比进程要小。
有效的利用系统资源、提高程序的数据吞吐量、更好的发挥硬件的性能
4.总结
总结下来,那么就能够很清楚的知道当我们用CGI通用网关接口来实现数据在WEB上的传递时,对于客户端的每一个请求必须开启一个新实例的进程,可想而知它的速度和效率。为了避免这种损耗,解决这个问题,我们就引入了采用多线程来代替进程的技术—JAVA方向的Servlet技术,能够很清楚的看到Servlet的生命周期,只需要初始化一次Servlet,以后就可以反复的使用。
如果有10个人在线,那么CGI就得开10个进程。而类似于JSP,ASP 都是一个进程处理多个请求的,无论多少人在线,都只有一个进程。并且Servlet使用标准的API,可以被许多WEB服务支持,与平台无关。