自从计算机软件开发进入网络时代就开始涉及到通讯问题在客户/服务器(也叫C/S应用)时期每个软件都有自己的客户端和服务器端软件并且客户端和服务器端之间的通讯协议差别也很大后来随着互联网的发展基于浏览器/服务器的应用逐渐成为主流通讯协议也统一到HTTP协议但是在HTTP协议之上如何处理来自客户端的请求信息以及如何对请求进行回应则经历了很长时间也没有统一下来目前对于这个问题的解决方案主要有两种一个是CGI另一个是Servlet
CGI(Common Gateway Interface)通用网关接口
通用网关接口简称CGI是一种根据请求信息动态产生回应内容的技术通过CGIWeb 服务器可以将根据请求不同启动不同的外部程序并将请求内容转发给该程序在程序执行结束后将执行结果作为回应返回给客户端也就是说对于每个请求都要产生一个新的进程进行处理因为每个进程都会占有很多服务器的资源和时间这就导致服务器无法同时处理很多的并发请求另外CGI程序都是与操作系统平台相关的虽然在互联网爆发的初期CGI为开发互联网应用做出了很大的贡献但是随着技术的发展开始逐渐衰落
Servlet
Servlet最初是在年由James Gosling 提出的因为使用该技术需要复杂的Web服务器支持所以当时并没有得到重视也就放弃了后来随着Web应用复杂度的提升并要求提供更高的并发处理能力Servlet被重新捡起并在Java平台上得到实现现在提起Servlet指的都是Java ServletJava Servlet要求必须运行在Web服务器当中与Web服务器之间属于分工和互补关系确切的说在实际运行的时候Java Servlet与Web服务器会融为一体如同一个程序一样运行在同一个Java虚拟机(JVM)当中与CGI不同的是Servlet对每个请求都是单独启动一个线程而不是进程这种处理方式大幅度地降低了系统里的进程数量提高了系统的并发处理能力另外因为Java Servlet是运行在虚拟机之上的也就解决了跨平台问题如果没有Servlet的出现也就没有互联网的今天
在Servlet出现之后随着使用范围的扩大人们发现了它的一个很大的一个弊端那就是为了能够输出HTML格式内容需要编写大量重复代码造成不必要的重复劳动为了解决这个问题基于Servlet技术产生了JavaServet Pages技术也就是JSPServlet和JSP两者分工协作Servlet侧重于解决运算和业务逻辑问题JSP则侧重于解决展示问题Servlet与JSP一起为Web应用开发带来了巨大的贡献后来出现的众多Java Web应用开发框架都是基于这两种技术的更确切的说都是基于Servlet技术的
Java Servlet与Web容器之间的关系
Java是一种动态加载和运行的语言也就是说当应用程序持有一个类的地址(CLASSPATH)和名称(包名和类名)的情况下可以在程序运行期间任何时候加载这个类并创建和使用该类的对象Servlet就是基于这个机制与Web容器融合在一起的目前已知的所有支持Java Servlet的Web容器都是采用Java开发的当Web容器接收到来自客户端的请求信息之后会根据URL中的Web元件地址信息到Servlet队列中查找对应的Servlet对象如果找到则直接使用如果没有找到则加载对应的类并创建对象也就是说Servlet对象是在第一次被使用的时候才创建的并且一旦创建就会被反复使用不再创建新的对象所有创建出的Servlet对象会在Web服务器停止运行的时候统一进行垃圾回收
为了解决客户端请求地址与Java Servlet之间对应关系问题Web容器需要一个用来描述这种对应关系的文件一般是webxml文件如果一个Web应用程序中存在很多个Servlet那么webxml会变得非常庞大在Servlet 规范推出之后允许在Servlet代码中使用声明式语法来代替webxml中的描述信息这才让webxml瘦身下来下图是这个过程的一个示意图
在这个图中我们仅仅是概要的采用以比较容易理解的方式描述了Web容器与Servlet之间的关系以及当接受到请求之后的处理流程在实际的Web容器中会比这要复杂很多