第一章:Tomcat 概述 第一章:Tomcat 概述 Tomcat,正式名称为 Apache Tomcat,是一款由 Apache 软件基金会开发的开源 Servlet 容器。它实现了 Java Servlet、JavaServer Pages (JSP)、Java Expression Language (Java EL) 和 WebSocket 等 Java EE 规范,为开发和部署基于 Java 的 Web 应用程序提供了一个健壮而可靠的环境。Tomcat 不仅是一个流行的 Web 服务器,更是一个强大的应用服务器,尤其擅长处理 Web 应用层面的任务。 1.1 Tomcat 的定义与历史 1.1.1 Tomcat 的定义 Tomcat 最核心的定位是 Servlet 容器。
Tomcat,正式名称为 Apache Tomcat,是一款由 Apache 软件基金会开发的开源 Servlet 容器。它实现了 Java Servlet、JavaServer Pages (JSP)、Java Expression Language (Java EL) 和 WebSocket 等 Java EE 规范,为开发和部署基于 Java 的 Web 应用程序提供了一个健壮而可靠的环境。Tomcat 不仅是一个流行的 Web 服务器,更是一个强大的应用服务器,尤其擅长处理 Web 应用层面的任务。
1.1.1 Tomcat 的定义
Tomcat 最核心的定位是 Servlet 容器。这意味着 Tomcat 的主要职责是运行和管理 Java Servlet 和 JSP 页面。Servlet 是一种用于处理客户端请求并生成动态 Web 内容的 Java 程序,而 JSP 是一种允许在 HTML 页面中嵌入 Java 代码的技术,最终会被 Tomcat 编译成 Servlet 执行。
除了 Servlet 容器的功能,Tomcat 也具备 Web 服务器 的能力。它可以像 Apache HTTP Server 或 Nginx 一样,接收客户端的 HTTP 请求,并将静态资源(如 HTML 文件、CSS 文件、JavaScript 文件、图片等)直接返回给客户端。对于动态请求,Tomcat 则会将请求交给 Servlet 容器进行处理,并将 Servlet 生成的动态内容返回给客户端。
因此,我们可以将 Tomcat 理解为一个 集 Web 服务器和 Servlet 容器于一体的应用服务器。它专注于 Web 应用的部署和运行,并提供了丰富的功能和配置选项,以满足不同规模和复杂度的 Web 应用需求。
1.1.2 Tomcat 的历史
Tomcat 的历史可以追溯到 1998 年,当时 Sun Microsystems(后被 Oracle 收购)开发了一个名为 "Java Web Server" 的 Web 服务器,并将其作为参考实现发布。随后,Sun 将其 Web 服务器技术捐赠给了 Apache 软件基金会,并更名为 "Tomcat"。
Tomcat 的命名灵感来源于汤姆猫(Tomcat),一个卡通形象。选择这个名字的原因可能是因为 Tomcat 在 Web 服务器领域扮演着类似于猫的角色,既灵活又强大。
自开源以来,Tomcat 经历了多个版本的迭代和发展,不断地完善和增强其功能和性能。从最初的 Tomcat 3.x 版本到如今的 Tomcat 9.x 和 10.x 版本,Tomcat 已经成为了最流行的开源 Servlet 容器之一,被广泛应用于各种企业级 Web 应用的开发和部署中。
Tomcat 发展历程中的重要里程碑:
Tomcat 3.x: 最初的开源版本,实现了 Servlet 2.2 和 JSP 1.1 规范。
Tomcat 4.x: 引入了 Catalina Servlet 容器,提高了性能和稳定性。
Tomcat 5.x: 支持 Servlet 2.4 和 JSP 2.0 规范,增强了 JMX 管理功能。
Tomcat 6.x: 支持 Servlet 2.5 和 JSP 2.1 规范,改进了性能和内存管理。
Tomcat 7.x: 支持 Servlet 3.0 和 JSP 2.2 规范,引入了 WebSocket 和注解支持。
Tomcat 8.x: 支持 Servlet 3.1 和 JSP 2.3 规范,引入了 HTTP/2 协议支持。
Tomcat 9.x: 支持 Servlet 4.0 和 JSP 2.4 规范,继续优化性能和安全性,并支持 Java EE 8 规范。
Tomcat 10.x: 支持 Servlet 5.0 和 JSP 3.0 规范,以及 Jakarta EE 9 规范,命名空间从 javax.* 迁移到 jakarta.*。
Tomcat 的架构设计清晰而模块化,主要由以下几个核心组件构成,这些组件协同工作,共同完成了处理 Web 请求的任务。
1.2.1 Server (服务器)
Server 是 Tomcat 架构的最顶层组件,代表着一个 Tomcat 实例。一个 Tomcat 进程中只有一个 Server 实例。Server 的主要职责是管理 Tomcat 的生命周期,包括启动、停止和销毁 Tomcat 实例。
Server 组件通过一个 shutdown 端口 监听关闭命令。当 Tomcat 接收到通过 shutdown 端口发送的关闭命令时,Server 会负责停止其包含的所有 Service 组件,并最终关闭 Tomcat 进程。
Server 的配置信息通常存储在 conf/server.xml 文件中,可以使用 <Server> 元素进行配置,例如定义 shutdown 端口。
1.2.2 Service (服务)
Service 组件是 Server 组件的子组件,一个 Server 可以包含多个 Service 组件,但通常情况下,我们使用一个 Service 组件即可满足需求。Service 组件将一个或多个 Connector 组件和一个 Engine 组件绑定在一起,对外提供服务。
Service 的主要职责是管理其包含的 Connector 和 Engine 组件的生命周期,并负责接收来自 Connector 的请求,并将请求传递给 Engine 进行处理。
Service 组件的配置信息也存储在 conf/server.xml 文件中,可以使用 <Service> 元素进行配置,例如定义 Service 的名称。
1.2.3 Connector (连接器)
Connector 组件负责接收客户端的请求,并将请求传递给 Tomcat 引擎进行处理。Tomcat 支持多种类型的 Connector,常见的有:
HTTP Connector: 用于处理 HTTP 请求,是最常用的 Connector 类型。可以配置监听的端口号、协议类型(HTTP/1.1、HTTP/2)、最大线程数等参数。
AJP Connector: 用于与 Apache HTTP Server 等 Web 服务器进行集成,通常用于反向代理场景。AJP (Apache JServ Protocol) 是一种优化的二进制协议,用于在 Web 服务器和应用服务器之间进行通信。
一个 Service 组件可以包含多个 Connector 组件,例如可以同时配置一个 HTTP Connector 监听 8080 端口,和一个 HTTPS Connector 监听 8443 端口,分别处理 HTTP 和 HTTPS 请求。
Connector 组件的配置信息存储在 conf/server.xml 文件中,可以使用 <Connector> 元素进行配置,例如定义端口号、协议、连接超时时间等。
代码实践 - 配置 HTTP Connector (server.xml):
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
代码详解:
port="8080": 指定 Connector 监听的端口号为 8080。
protocol="HTTP/1.1": 指定 Connector 使用的协议为 HTTP/1.1。
connectionTimeout="20000": 指定连接超时时间为 20000 毫秒 (20 秒)。
redirectPort="8443": 指定当接收到需要安全连接的请求时,重定向到的 HTTPS 端口号为 8443。
1.2.4 Engine (引擎)
Engine 组件是 Tomcat 的核心组件,负责接收来自 Connector 的请求,并根据请求的 URL 将请求路由到相应的 Host 组件进行处理。一个 Service 组件只能包含一个 Engine 组件。
Engine 组件可以配置默认的 Host,当请求的 URL 中没有指定 Host 信息时,请求会被路由到默认的 Host 进行处理。
Engine 组件的配置信息存储在 conf/server.xml 文件中,可以使用 <Engine> 元素进行配置,例如定义默认的 Host、引擎名称等。
1.2.5 Host (虚拟主机)
Host 组件代表一个虚拟主机,负责管理多个 Web 应用 (Context)。一个 Engine 组件可以包含多个 Host 组件,每个 Host 组件可以配置一个或多个域名或 IP 地址,用于区分不同的虚拟主机。
当 Engine 接收到请求时,会根据请求的 Host 头信息将请求路由到相应的 Host 组件进行处理。如果请求的 Host 头信息与任何一个 Host 组件的配置都不匹配,则会路由到默认的 Host 组件进行处理。
Host 组件的配置信息存储在 conf/server.xml 文件中,可以使用 <Host> 元素进行配置,例如定义主机名、应用部署目录等。
代码实践 - 配置 Host (server.xml):
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> </Host>
代码详解:
name="localhost": 指定 Host 的主机名为 localhost。当请求的 Host 头为 localhost 时,请求会被路由到该 Host。
appBase="webapps": 指定 Web 应用的部署目录为 webapps。Tomcat 会自动扫描该目录下的 Web 应用并进行部署。
unpackWARs="true": 指定是否自动解压 WAR 文件。设置为 true 时,Tomcat 会自动解压 WAR 文件到 appBase 目录下。
autoDeploy="true": 指定是否自动部署 Web 应用。设置为 true 时,Tomcat 会自动监控 appBase 目录下的 Web 应用,并在 Web 应用发生变化时自动重新部署。
1.2.6 Context (上下文)
Context 组件代表一个 Web 应用,负责管理该 Web 应用的所有组件,例如 Servlet、JSP 页面、Filter、Listener 等。一个 Host 组件可以包含多个 Context 组件,每个 Context 组件对应一个 Web 应用。
Context 组件的配置信息可以存储在以下几个地方:
conf/server.xml 文件中 <Host> 元素下的 <Context> 子元素: 可以在 server.xml 文件中配置全局的 Context,适用于所有 Host。
conf/[Engine Name]/[Host Name]/[Context Path].xml 文件: 可以在特定的 Host 下配置 Context,文件名通常为 Context 的路径名,例如 conf/Catalina/localhost/myapp.xml。
Web 应用自身的 META-INF/context.xml 文件: 可以在 Web 应用自身的 META-INF 目录下放置 context.xml 文件,用于配置该 Web 应用的 Context。
Context 组件的主要职责包括:
加载和初始化 Web 应用的 Servlet、Filter、Listener 等组件。
管理 Web 应用的生命周期,包括启动、停止和销毁。
为 Web 应用提供资源访问和安全控制。
代码实践 - 配置 Context (server.xml - Host 元素下):
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="/myapp" docBase="myapp" reloadable="true" /> </Host>
代码详解:
path="/myapp": 指定 Context 的上下文路径为 /myapp。当访问 http://localhost:8080/myapp 时,请求会被路由到该 Context。
docBase="myapp": 指定 Web 应用的文档根目录为 myapp。Tomcat 会从该目录下加载 Web 应用的文件。
reloadable="true": 指定是否允许 Tomcat 在 Web 应用发生变化时自动重新加载。在开发阶段,设置为 true 可以方便地进行热部署。
1.2.7 Wrapper (包装器)
Wrapper 组件是 Context 组件的子组件,负责管理单个 Servlet 的生命周期和请求处理。一个 Context 组件可以包含多个 Wrapper 组件,每个 Wrapper 组件对应一个 Servlet。
Wrapper 组件的主要职责包括:
加载和实例化 Servlet 类。
调用 Servlet 的 init() 方法进行初始化。
接收来自 Tomcat 引擎的请求,并调用 Servlet 的 service() 方法进行处理。
调用 Servlet 的 destroy() 方法进行销毁。
Wrapper 组件的配置信息通常在 Web 应用的 web.xml 文件中进行配置,使用 <servlet> 元素定义 Servlet 的类名、初始化参数、加载时机等。
代码实践 - 配置 Servlet (web.xml):
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping>
代码详解:
<servlet> 元素定义了一个名为 MyServlet 的 Servlet。
<servlet-name>: 指定 Servlet 的名称,用于在 web.xml 文件中引用该 Servlet。
<servlet-class>: 指定 Servlet 类的完整路径名。
<servlet-mapping> 元素将 URL 模式 /myservlet 映射到名为 MyServlet 的 Servlet。当访问 http://localhost:8080/myapp/myservlet 时,请求会被路由到 com.example.MyServlet 这个 Servlet 进行处理。
Tomcat 的工作原理可以概括为以下几个步骤:
客户端发送请求: 客户端(例如浏览器)向 Tomcat 服务器发送 HTTP 请求。
Connector 接收请求: Tomcat 的 Connector 组件接收到客户端的请求,并将其封装成 Tomcat 内部的 Request 和 Response 对象。
Engine 处理请求: Connector 将 Request 对象传递给 Engine 组件。Engine 根据请求的 URL 中的 Host 信息,将请求路由到相应的 Host 组件进行处理。
Host 查找 Context: Host 组件根据请求的 URL 中的 Context Path 信息,查找匹配的 Context 组件(Web 应用)。
Context 查找 Wrapper: Context 组件根据请求的 URL 中的 Servlet Path 信息,查找匹配的 Wrapper 组件(Servlet)。
Wrapper 调用 Servlet: Wrapper 组件负责创建 Servlet 实例(如果 Servlet 尚未加载),并调用 Servlet 的 service() 方法处理请求。Servlet 在 service() 方法中处理业务逻辑,并生成动态 Web 内容。
Servlet 返回响应: Servlet 将生成的响应数据设置到 Response 对象中。
Wrapper 返回响应: Wrapper 组件将 Response 对象返回给 Context 组件。
Context 返回响应: Context 组件将 Response 对象返回给 Host 组件。
Host 返回响应: Host 组件将 Response 对象返回给 Engine 组件。
Engine 返回响应: Engine 组件将 Response 对象返回给 Connector 组件。
Connector 发送响应: Connector 组件将 Response 对象中的响应数据发送回客户端。
客户端接收响应: 客户端接收到 Tomcat 服务器返回的响应数据,并进行解析和渲染。
Tomcat 作为一款成熟且稳定的 Servlet 容器,被广泛应用于各种 Web 应用开发场景中:
Web 应用服务器: Tomcat 最主要的用途是作为 Web 应用服务器,用于部署和运行 Java Web 应用,例如企业级管理系统、电商平台、社交应用等。
Servlet 和 JSP 开发: Tomcat 是学习和实践 Servlet 和 JSP 技术的重要平台,开发者可以使用 Tomcat 来开发和测试基于 Servlet 和 JSP 的 Web 应用。
微服务架构: 在微服务架构中,Tomcat 可以作为轻量级的 Web 服务容器,用于部署和运行独立的 Web 服务模块。
RESTful API 开发: Tomcat 可以用于开发和部署 RESTful API 服务,为移动应用、前端应用或其他后端服务提供数据接口。
嵌入式 Tomcat: Tomcat 也可以作为嵌入式 Servlet 容器,嵌入到其他 Java 应用中,例如 Spring Boot 应用,用于快速构建独立的 Web 应用。
本章对 Tomcat 进行了全面的概述,从 Tomcat 的定义和历史发展入手,深入探讨了 Tomcat 的架构组成、核心组件和工作原理。我们了解了 Tomcat 作为 Servlet 容器和 Web 服务器的角色,以及各个组件在处理 Web 请求过程中的职责。同时,我们也通过代码实践和图例的方式,加深了对 Tomcat 配置和工作流程的理解。
掌握 Tomcat 的概述是深入学习 Tomcat 的基础,后续章节将继续深入探讨 Tomcat 的高级特性、配置管理、性能优化等方面的内容,帮助读者更全面、更深入地掌握 Tomcat 技术,并能够将其应用于实际的 Web 应用开发中。
通过本章的学习,读者应该能够:
理解 Tomcat 的定义和核心功能。
了解 Tomcat 的历史发展和版本演进。
掌握 Tomcat 的架构组成和核心组件。
理解 Tomcat 的工作原理和请求处理流程。
了解 Tomcat 的主要应用场景。
希望本章内容能够为读者打开 Tomcat 世界的大门,并为后续的学习奠定坚实的基础。