JAVA Servlet与web容器的关系

从计算机软件开发进入网络时代,就开始涉及到通信问题。在客户/服务器(也叫C/S应用)时期,每一个软件都有本身的客户端和服务器端软件。而且客户端和服务器端之间的通信协议差异也很大。后来随着互联网的发展,基于浏览器/服务器的应用逐渐成为主流,通信协议也统一到HTTP协议。可是,在HTTP协议之上,如何处理来自客户端的请求信息,以及如何对请求进行回应,则经历了很长时间也没有统一下来。目前,对于这个问题的解决方案主要有两种,一个是CGI,另外一个是Servlet。web

  CGI(Common Gateway Interface),通用网关接口浏览器

  通用网关接口,简称CGI,是一种根据请求信息动态产生回应内容的技术。经过CGI,Web 服务器能够将根据请求不一样启动不一样的外部程序,并将请求内容转发给该程序,在程序执行结束后,将执行结果做为回应返回给客户端。也就是说,对于每一个请求,都要产生一个新的进程进行处理。由于每一个进程都会占有不少服务器的资源和时间,这就致使服务器没法同时处理不少的并发请求。另外CGI程序都是与操做系统平台相关的,虽然在互联网爆发的初期,CGI为开发互联网应用作出了很大的贡献,可是随着技术的发展,开始逐渐衰落。服务器

  Servlet网络

  Servlet最初是在1995年由James Gosling提出的,由于使用该技术须要复杂的Web服务器支持,因此当时并无获得重视,也就放弃了。后来随着Web应用复杂度的提高,并要求提供更高的并发处理能力,Servlet被从新捡起,并在Java平台上获得实现,如今提起Servlet,指的都是Java Servlet。Java Servlet要求必须运行在Web服务器当中,与Web服务器之间属于分工和互补关系。确切的说,在实际运行的时候Java Servlet与Web服务器会融为一体,如同一个程序同样运行在同一个Java虚拟机(JVM)当中。与CGI不一样的是,Servlet对每一个请求都是单独启动一个线程,而不是进程。这种处理方式大幅度地下降了系统里的进程数量,提升了系统的并发处理能力。另外由于Java Servlet是运行在虚拟机之上的,也就解决了跨平台问题。若是没有Servlet的出现,也就没有互联网的今天。并发

  在Servlet出现以后,随着使用范围的扩大,人们发现了它的一个很大的一个弊端。那就是为了可以输出HTML格式内容,须要编写大量重复代码,形成没必要要的重复劳动。为了解决这个问题,基于Servlet技术产生了JavaServet Pages技术,也就是JSP。Servlet和JSP二者分工协做,Servlet侧重于解决运算和业务逻辑问题,JSP则侧重于解决展现问题。Servlet与JSP一块儿为Web应用开发带来了巨大的贡献,后来出现的众多Java Web应用开发框架都是基于这两种技术的,更确切的说,都是基于Servlet技术的。框架

  Java Servlet与Web容器之间的关系ide

  Java是一种动态加载和运行的语言。也就是说当应用程序持有一个类的地址(CLASSPATH)和名称(包名和类名)的状况下,能够在程序运行期间任什么时候候加载这个类,并建立和使用该类的对象。Servlet就是基于这个机制与Web容器融合在一块儿的。目前已知的全部支持Java Servlet的Web容器都是采用Java开发的。当Web容器接收到来自客户端的请求信息以后,会根据URL中的Web元件地址信息到Servlet队列中查找对应的Servlet对象,若是找到则直接使用,若是没有找到则加载对应的类,并建立对象。也就是说,Servlet对象是在第一次被使用的时候才建立的,而且一旦建立就会被反复使用,再也不建立新的对象。全部建立出的Servlet对象会在Web服务器中止运行的时候统一进行垃圾回收。操作系统

  为了解决客户端请求地址与Java Servlet之间对应关系问题,Web容器须要一个用来描述这种对应关系的文件,通常是web.xml文件。若是一个Web应用程序中存在不少个Servlet,那么web.xml会变得很是庞大。在Servlet 3.0规范推出以后,容许在Servlet代码中使用声明式语法来代替web.xml中的描述信息,这才让web.xml瘦身下来。下图是这个过程的一个示意图。线程

 

  在这个图中,咱们仅仅是概要的,采用以比较容易理解的方式描述了Web容器与Servlet之间的关系,以及当接受到请求以后的处理流程。在实际的Web容器中,会比这要复杂不少。xml

相关文章
相关标签/搜索