0%

Tomcat 之 Connector 连接器深度解析

在 Tomcat 架构中,Connector(连接器) 是负责与客户端通信的核心组件,它封装了底层网络通信细节,为上层容器(Catalina)提供统一的请求入口。本文将详细解析 Connector 的功能、结构及工作原理。

Connector 概述

Connector 是 Tomcat 对外提供服务的接口,基于 Coyote 框架实现,主要功能包括:

  • 网络通信:监听端口,接收客户端连接(如 HTTP 请求)。
  • 协议解析:根据 HTTP、AJP 等协议解析请求数据。
  • 数据转换:将字节流转换为 Tomcat 内部的 Request 对象,再转换为标准的 ServletRequest 供容器处理;处理完成后将响应反向转换为字节流返回客户端。

核心目标:使 Catalina 容器与具体的协议和 I/O 模型解耦,提高灵活性和可扩展性。

支持的协议与 I/O 模型

1. 传输协议

Connector 支持三种主要协议:

协议 用途
HTTP/1.1 最常用协议,用于 Tomcat 独立运行时处理 HTTP 请求。
AJP/1.3 用于与 Web 服务器(如 Apache、Nginx)集成,优化静态资源处理和集群部署。
HTTP/2.0 新一代 HTTP 协议(Tomcat 8.5+ 支持),支持多路复用、服务器推送等特性。

2. I/O 模型

Tomcat 8.5 后移除了对 BIO(阻塞 I/O)的支持,保留以下三种 I/O 模型:

I/O 模型 实现方式 特点
NIO 基于 Java NIO 类库 非阻塞 I/O,通过 Selector 实现多路复用,性能优于 BIO。
NIO2 基于 JDK 7 的 NIO2(AIO) 异步非阻塞 I/O,由操作系统完成 I/O 操作后通知应用程序。
APR 基于 Apache 可移植运行时库(C 实现) 操作系统级别的异步 I/O,性能最优,但需单独安装 APR 库。

Connector 配置示例

Connector 的配置通常在 conf/server.xml 中,以下是一个 HTTP/1.1 协议的 NIO 连接器配置:

阅读全文 »

Tomcat 之 Container 容器深度解析

在 Tomcat 架构中,Container(容器) 是负责处理内部请求、封装 Servlet 并管理其生命周期的核心组件。与连接器(Connector)负责对外通信不同,容器专注于请求的内部处理流程。本文将详细解析 Container 容器的层级结构、核心接口及工作机制。

Container 容器的层级结构

Container 是一个接口,其下分为四个子接口,形成层级化的容器结构,从上到下依次为:

  • Engine:最顶层容器,代表整个 Servlet 引擎
  • Host:表示一个虚拟主机(站点)
  • Context:表示一个 Web 应用程序
  • Wrapper:表示一个具体的 Servlet

它们的装配关系为:
Engine → Host(多个) → Context(多个) → Wrapper(多个)

容器装配关系

核心接口解析

catalina

1. 顶层接口 Container

Container 接口定义了所有容器的通用行为,包括父子容器管理、生命周期控制等。核心方法如下:

阅读全文 »

Catalina:Tomcat 的核心 Servlet 容器解析

Catalina 是 Tomcat 的核心组件,负责管理 Servlet 的生命周期、处理 HTTP 请求并协调各组件工作。自 Tomcat 4.0 起,Catalina 成为 Servlet 容器的正式名称,其设计采用模块化架构,通过解析server.xml配置文件构建服务器实例,协调连接器(Connector)与容器(Container)的协作。本文深入解析 Catalina 的工作原理、组件解析流程及核心配置逻辑。

Catalina 的核心定位与架构

Catalina 是 Tomcat 的 “大脑”,承担以下核心职责:

  • 解析server.xml配置文件,创建并管理 Server、Service、Connector、Container 等组件;
  • 协调连接器(接收请求)与容器(处理请求)的交互;
  • 管理 Servlet 的加载、初始化、请求处理及销毁全生命周期;
  • 集成其他模块(如 Coyote 负责通信、Jasper 处理 JSP、JNDI 提供命名服务)。

其架构可简化为:

1
Catalina → Server → Service → (Connector + Container)  
  • Server:顶层组件,代表整个 Tomcat 实例;
  • Service:关联 Connector 与 Container,实现 “接收请求 - 处理请求” 的链路;
  • Connector:处理网络通信,解析 HTTP 请求;
  • Container:处理请求的核心,包含 Engine、Host、Context、Wrapper 四级容器。

Catalina 的启动流程:从配置到组件初始化

Catalina 的启动始于org.apache.catalina.startup.Catalina类,核心步骤包括:

阅读全文 »

Tomcat 深度解析:架构、组件与目录结构详解

Tomcat 是 Apache 基金会开发的开源 Servlet 容器,用于运行 Java Web 应用(如 Servlet、JSP),是 Java EE 生态中最常用的应用服务器之一。本文从核心功能、目录结构、组件架构三个维度,全面解析 Tomcat 的工作原理,帮助理解其设计思想与使用方式。

Tomcat 的核心功能

Tomcat 作为 Servlet 容器,核心任务是管理 Servlet 的生命周期并处理 HTTP 请求,具体包括:

  1. Servlet 生命周期管理
    • 首次请求某 Servlet 时,加载该 Servlet 类并调用init()方法(仅执行一次,用于初始化资源);
    • 每次请求时,创建ServletRequest(封装请求数据)和ServletResponse(封装响应数据);
    • 调用 Servlet 的service()方法处理请求,最终通过ServletResponse返回结果;
    • 服务器关闭时,调用destroy()方法释放资源。
  2. HTTP 请求处理
    通过连接器(Connector)接收客户端 HTTP 请求,转发给容器(Container)处理,最终将响应返回给客户端。

Tomcat 目录结构详解

Tomcat 的安装目录结构清晰,各目录分工明确,以下是核心目录的功能说明:

阅读全文 »

MyBatis ResultSetHandler:结果集映射的核心机制(从映射流程到延迟加载)

在 MyBatis 执行查询操作时,StatementHandler 负责执行 SQL 语句,而 ResultSetHandler 则承担着将数据库返回的 ResultSet(结果集)转换为 Java 对象 的关键职责,同时还处理存储过程的输出参数。这一过程涉及结果集解析、对象映射、嵌套关联处理以及延迟加载等复杂逻辑。从 “接口定义→核心实现→映射流程→延迟加载” 四个维度,全面解析 ResultSetHandler 的工作原理。

ResultSetHandler 接口:结果处理的规范定义

ResultSetHandler 是 MyBatis 结果集处理的顶层接口,定义了三类核心操作,覆盖查询结果映射和存储过程输出参数处理:

1
2
3
4
5
6
7
8
9
10
public interface ResultSetHandler {
// 1. 处理 SELECT 语句的结果集,映射为 Java 对象列表
<E> List<E> handleResultSets(Statement stmt) throws SQLException;

// 2. 处理结果集,返回游标对象(用于流式查询)
<E> Cursor<E> handleCursorResultSets(Statement stmt) throws SQLException;

// 3. 处理存储过程的输出参数
void handleOutputParameters(CallableStatement cs) throws SQLException;
}
  • handleResultSets:最核心的方法,将 Statement 执行后得到的 ResultSet 映射为 List 集合(可能包含一个或多个结果集);
  • handleCursorResultSets:用于大数据量查询的流式处理,返回 Cursor 对象支持逐条读取结果,避免内存溢出;
  • handleOutputParameters:针对存储过程,处理 OUTINOUT 类型的输出参数。

DefaultResultSetHandler:结果映射的唯一实现

MyBatis 仅提供 DefaultResultSetHandler 作为 ResultSetHandler 的实现类,它完整实现了结果集到 Java 对象的映射逻辑,包括简单对象映射嵌套关联映射延迟加载等核心功能。

1. 核心流程:handleResultSets 方法

handleResultSets 是结果集处理的入口方法,负责协调多个结果集的映射(如存储过程可能返回多个结果集),并将最终结果整理为 List。

源码解析
阅读全文 »