Servlet容器

说到容器,大家都不陌生,通俗点说“容器就是用来存放东西的地方”。同理,Servlet 容器也是存放和管理东西的地方,只不过它存放和管理的东西是 Servlet。

您可能会提出疑问,我们自己编写的 Servlet 为什么需要 Servlet 容器来管理呢?本节我们就来针对这个问题进行讲解。

Web 服务器

想要知道什么是 Servlet 容器,首先我们需要了解一下 Web 服务器。

部署动态网站一般需要 Web 服务器的支持,例如:
  • 运行 PHP 网站一般选择 Apache 或者 Nginx;
  • 运行 ASP/ASP.NET 网站一般选择 IIS;
  • 运行 Python 网站一般选择内置的 WSGI 服务器模块——wsgiref。

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

这些常见的 Web 服务器,例如 Apache、Nginx、IIS 等,都是通过 HTTP(S) 协议传输数据的,它们所能提供的功能往往都比较单一,只能让用户访问到静态资源(HTML 文档、图片、CSS 文件、JavaScript 文件等)。

也就是说,用户在浏览器中输入一个 URL 后,Web 服务器只能将静态网页返回给用户浏览器展示,但不能执行任何编程语言,也不能访问数据库,更不能实现用户的注册、登录等复杂功能。

通过上面对 Web 服务器的描述可知,如果只有 Web 服务器,那我们就只能部署一个静态网站,不能部署动态网站。要想部署动态网站,必须要有编程语言运行时(Runtime)环境的支持。

Servlet 容器

我们知道,Servlet 用于生成动态网页的,一个动态网页对应一个 Servlet。编写一个 Servlet,实际上就是按照 Servlet 规范编写一个 Java 类。

但 Servlet 类中是没有 main() 方法的,不能独立运行。它必须被部署到 Servlet 容器中,由容器来实例化和调用 Servlet 的方法。Servlet 容器可以在 Servlet 的生命周期内对 Servlet 进行保存和管理。

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

HTTP请求流程

从上图可知,Web 服务器是整个动态网站的“大门”,用户的 HTTP 请求首先到达 Web 服务器,Web 服务器会判断该请求是静态资源还是动态资源:如果是静态资源就直接返回,此时相当于用户下载了一个服务器上的文件;如果 Web 服务器接收到的是一个指向 Servlet 等动态资源的请求,那么 Web 服务器并不会把这个请求直接交给 Servlet 本身,而是转交给部署该 Servlet 的容器。

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

一般情况下,Servlet 容器具有如下功能:
  • 容器提供了各种方法,使得 Servlet 可以实现与 Web 服务器对话。开发人员只需要专注于如何在 Servlet 中实现业务逻辑即可,至于 Servlet 与 Web 服务器对话的细节则不必理会。
  • 容器能够控制 Servlet 的生命周期。容器负责加载、实例化和初始化 Servlet、调用 Servlet 方法、销毁 Servlet 实例。
  • 容器支持多线程管理。容器接收 Servlet 请求时,容器自动为其创建新线程,运行完成时,容器结束线程。
  • 容器为 Servlet 的可移植性提供了可能。利用容器,可以使用 XML 部署描述文件来配置和修改安全性,不需将其编码写到 Servlet 类代码中。
  • 容器负责将一个 JSP 文件转译成一个 Servlet。

市面上常见的 Servlet 容器有很多,例如 Tomcat、Jboss、Jetty、WebLogic 等。其中 Tomcat 是最常用、最流行的 Servelt 容器之一。本套 Servlet 教程就是使用 Tomcat 作为 Servlet 容器进行讲解的。

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

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

HTTP 请求流程

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

总结

Servlet 容器就是 Servlet 程序的运行环境,它主要包含以下几个功能:
  • 实现 Servlet 规范定义的各种接口和类,为 Servlet 的运行提供底层支持;
  • 管理用户编写的 Servlet 类,实例化 Servlet 对象;
  • 提供 HTTP 服务,相当于一个简化的服务器。

声明:《Servlet系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。