Servlet容器(Web容器)是什么

您可能已经知道,部署动态网站一般需要Web服务器的支持,例如:

运行PHP网站一般选择Apache或者Nginx;

运行ASP/ASP.NET网站一般选择IIS;

运行Python网站一般选择内置的WSGI服务器模块——wsgiref。

Web服务器是一种对外提供Web服务的软件,它可以接收浏览器的HTTP请求,并将处理结果返回给浏览器。

在部署Servlet网站时,同样需要一种类似的软件,例如Tomcat、Jboss、Jetty、WebLogic等,但是它们通常被称为“容器”,而不是“服务器”,这究竟是为什么呢?Servlet容器和传统意义上的服务器有什么不同呢?

本节我们先讲解传统Web服务器的架构模式,再讲解Servlet容器的架构模式,然后将它们进行对比,加深读者的理解。

Web服务器

初学者可能认为,只要有Web服务器,我们编写的网站代码就可以运行了,就可以访问数据库了,就可以注册登录并发布文章了,这其实是一种误解。

我们通常所说的Web服务器,比如Apache、Nginx、IIS等,它们的功能往往都比较单一,只能提供http(s)服务,让用户访问静态资源(HTML文档、图片、CSS文件、JavaScript文件等),它们不能执行任何编程语言,也不能访问数据库,更不能让用户注册和登录。

也就是说,如果只有Web服务器,那您只能部署静态网站,不能部署动态网站。要想部署动态网站,必须要有编程语言运行环境(运行时,Runtime)的和数据库管理系统的支持。

运行环境(运行时)

开发网站使用的编程语言一般都是脚本语言(比如PHP、ASP、Python),部署网站时都是将源代码直接扔到服务器上,然而源代码自己并不能运行,必须要有解释器的支持;当用户访问动态页面时,解释器负责分析、编译和执行源代码,然后得到处理结果。

解释器是执行脚本语言的核心部件,除此以外还有一些辅助性的部件,例如:

垃圾回收器:负责及时释放不需要的内存,腾出资源供其它页面使用;

标准库:任何编程语言都会附带标准库,它们提供了很多通用性的功能,极大地提高了开发效率,避免重复造轮子。

我们习惯将以上各种支持脚本语言运行的部件统称为运行环境,或者运行时(Runtime)。

数据库

Web服务器不带数据库,编程语言也不带数据库,数据库是一款独立的软件;要想实现用户注册、发布文章、提交评论等功能,就必须安装一款数据库,比如MySQL、Oracle、SQLServer等。

总结

部署动态网站一般至少需要三个组件,分别是Web服务器、脚本语言运行时和数据库,例如,部署PHP网站一般选择「Apache+PHP运行时+MySQL」的组合。

Web容器

我们知道,Servlet是基于Java语言的,运行Servlet必然少不了JRE的支持,它负责解析和执行字节码文件(.class文件)。然而JRE只包含了Java虚拟机(JVM)、Java核心类库和一些辅助性性文件,它并不支持Servlet规范。要想运行Servlet代码,还需要一种额外的部件,该部件必须支持Servlet规范,实现了Servlet接口和一些基础类,这种部件就是Servlet容器。

Servlet容器就是Servlet代码的运行环境(运行时),它除了实现Servlet规范定义的各种接口和类,为Servlet的运行提供底层支持,还需要管理由用户编写的Servlet类,比如实例化类(创建对象)、调用方法、销毁类等。

Servlet中的容器和生活中的容器是类似的概念:生活中容器用来装水、装粮食,Servlet中的容器用来装类,装对象。

读者可能会提出疑问,我们自己编写的Servlet类为什么需要Servlet容器来管理呢?这是因为我们编写的Servlet类没有main()函数,不能独立运行,只能作为一个模块被载入到Servlet容器,然后由Servlet容器来实例化,并调用其中的方法。

一个动态页面对应一个Servlet类,开发一个动态页面就是编写一个Servlet类,当用户请求到达时,Servlet容器会根据配置文件(web.xml)来决定调用哪个类。

下图演示了Servlet容器在整个HTTP请求流程中的位置:

您看,Web服务器是整个动态网站的“大门”,用户的HTTP请求首先到达Web服务器,Web服务器判断该请求是静态资源还是动态资源:如果是静态资源就直接返回,此时相当于用户下载了一个服务器上的文件;如果是动态资源将无法处理,必须将该请求转发给Servlet容器。

Servlet容器接收到请求以后,会根据配置文件(web.xml)找到对应的Servlet类,将它加载并实例化,然后调用其中的方法来处理用户请求;处理结束后,Servlet容器将处理结果再转交给Web服务器,由Web服务器将处理结果进行封装,以HTTP响应的形式发送给最终的用户。

常用的Web容器有Tomcat、Jboss、Jetty、WebLogic等,其中Tomcat由Java官方提供,是初学者最常使用的。

为了简化部署流程,Web容器往往也会自带Web服务器模块,提供基本的HTTP服务,所以您可以不用再安装Apache、IIS、Nginx等传统意义上的服务器,只需要安装一款Web容器,就能部署Servlet网站了。正是由于这个原因,有的教材将Tomcat称为Web容器,有的教材又将Tomcat称为Web服务器,两者的概念已经非常模糊了。

将Web容器当做服务器使用后,上面的流程图就变成了下面的样子:

注意,Servlet容器自带的Web服务器模块虽然没有传统的Web服务器强大,但是也足以应付大部分开发场景,对初学者来说是足够的。当然,您也可以将传统的Web服务器和Servlet容器组合起来,两者分工协作,各司其职,共同完成HTTP请求。

总结

Servlet容器就是Servlet程序的运行环境,它主要包含以下几个功能:

实现Servlet规范定义的各种接口和类,为Servlet的运行提供底层支持;

管理用户编写的Servlet类,以及实例化以后的对象;

提供HTTP服务,相当于一个简化的服务器。

(0)

相关推荐