Tomcat 是一个 Web 服务器,它内置了一个 JSP 引擎来处理 JSP 文件。

为了更好地理解,我们先分别看看它们是什么,然后再将它们结合起来。
JSP (JavaServer Pages) 是什么?
JSP 本质上是一种技术规范,而不是一个具体的软件,它由 Sun Microsystems(现在的 Oracle)公司制定,用于简化动态网页的开发。
- 目标:让网页设计师(前端)和 Java 开发者(后端)能够更好地协作,前端可以专注于 HTML/CSS/JavaScript 的展示,后端则可以嵌入 Java 代码来处理业务逻辑、数据库操作等。
- 文件形式:一个 JSP 文件(
.jsp后缀)看起来像是一个普通的 HTML 文件,但它里面可以嵌入特殊的 JSP 标签、Java 代码片段、表达式等。 - 工作原理:JSP 文件不能直接被浏览器运行,当用户第一次请求一个 JSP 页面时,服务器需要将其转换成一个 Java Servlet 文件,然后再由 Java 虚拟机编译成可执行的
.class文件,这个编译后的 Servlet 才会真正被服务器执行,并生成 HTML 响应,最后发送给浏览器。
核心角色:JSP 引擎
负责完成“JSP 文件 -> Java Servlet -> .class 文件”这个转换和编译过程的程序,就叫做 JSP 引擎。
常见的 JSP 引擎有:

- Apache Jasper:这是 Apache Tomcat 内置的、最常用的 JSP 引擎。
- 其他应用服务器(如 IBM WebSphere, Oracle WebLogic)也都有自己的 JSP 引擎。
Tomcat 是什么?
Apache Tomcat 是一个开源的、轻量级的 Web 服务器,它实现了多个 Java EE(现在叫 Jakarta EE)规范中的核心部分,其中最重要的就是 Servlet 和 JSP 规范。
- 身份:Tomcat 不仅仅是一个 Web 服务器,它更准确的身份是一个 “Web 容器” 或 “Servlet 容器”。
- 核心功能:
- 处理 HTTP 请求:接收来自浏览器的 HTTP 请求。
- 管理 Servlet:负责加载、初始化、调用和销毁 Servlet,Servlet 是 Java 编写的服务器端程序,是 Java Web 应用的基石。
- 提供运行环境:为 Java Web 应用提供一个独立的运行环境(包括 JVM、类加载器等)。
两者的关系与协作流程
现在我们把它们联系起来,Tomcat 作为 Web 容器,它内置了 JSP 引擎(主要是 Jasper),当你的 Web 应用中包含 JSP 文件时,Tomcat 就会调用其内置的 JSP 引擎来处理它们。
下面是一个完整的请求处理流程,假设我们有一个 index.jsp 文件:
第一次请求 index.jsp 时的流程:

-
浏览器发起请求: 用户在浏览器中输入
http://localhost:8080/myapp/index.jsp,向 Tomcat 服务器发送请求。 -
Tomcat 接收请求: Tomcat 的连接器(Connector)接收到这个 HTTP 请求。
-
请求分发到 JSP 引擎: Tomcat 的 Servlet 容器检查
web.xml(或注解),发现index.jsp是一个 JSP 页面,它不会直接查找一个名为index_jsp的 Servlet,而是将这个请求转发给内置的 JSP 引擎(Jasper)。 -
JSP 引擎进行转换和编译:
- 转换:JSP 引擎读取
index.jsp文件,将其中的 HTML、JSP 标签、Java 代码等转换成一个完整的 Java Servlet 源代码文件(index_jsp.java),这个转换后的 Servlet 类通常会继承一个名为HttpJspBase的基类。 - 编译:JSP 引擎调用 Java 编译器(
javac)将index_jsp.java文件编译成一个可执行的字节码文件index_jsp.class。
- 转换:JSP 引擎读取
-
加载和执行 Servlet:
- Tomcat 的类加载器加载这个新生成的
index_jsp.class文件。 - Tomcat 创建这个 Servlet 类的一个实例,并调用其
service()方法来执行,在执行过程中,JSP 页面中嵌入的 Java 代码会被执行,可能访问数据库、调用业务逻辑等。 - Servlet 执行完毕后,生成最终的纯 HTML 内容。
- Tomcat 的类加载器加载这个新生成的
-
返回响应: Tomcat 将这个 HTML 响应通过 HTTP 协议发送回浏览器,浏览器解析并显示这个页面。
后续请求 index.jsp 时的流程:
- Tomcat 会检查
index.jsp文件是否被修改过。 index.jsp没有被修改,Tomcat 会直接加载并执行之前已经编译好的index_jsp.class文件,跳过转换和编译的步骤,大大提高了响应速度。index.jsp文件被修改了,Tomcat 会认为这是一个“新”的 JSP 文件,会重复执行第 4 步的转换和编译过程,然后再执行。
一个生动的比喻
为了让你更形象地理解,我们可以做一个比喻:
- Tomcat:像一个餐厅,它负责接待顾客(浏览器请求),提供用餐环境(运行环境),并且最终把做好的菜(HTTP响应)端给顾客。
- JSP 文件:像一份带有特殊标记的菜谱,菜谱本身不能直接吃,上面写着“加入 50g 盐(Java代码)”、“用中火炒 5 分钟(JSP动作)”。
- JSP 引擎:像餐厅里的主厨或厨房,他拿到这份特殊的菜谱后,会把它翻译成一份标准的、厨师能看懂的详细步骤单(Java Servlet 源代码),然后厨房的厨师(JVM编译器)根据这份步骤单做出最终的菜肴(
.class文件)。 - Servlet:像厨房里最终做菜的厨师,他拿到标准步骤单后,直接开始烹饪,做出美味的菜肴(HTML响应)。
整个流程是:顾客(浏览器)向餐厅(Tomcat)点了一份特殊菜谱(JSP)做的菜 -> 餐厅把菜谱交给厨房(JSP引擎) -> 厨房翻译菜谱、准备食材 -> 厨师(Servlet)烹饪 -> 最后把菜(HTML)端给顾客。
| 特性 | JSP 引擎 | Tomcat 服务器 |
|---|---|---|
| 本质 | 一个软件组件或程序,遵循 JSP 规范。 | 一个完整的 Web 应用服务器(Web 容器)。 |
| 功能 | 负责将 JSP 文件转换成 Java Servlet 源码,并编译成 .class 文件。 |
接收 HTTP 请求,管理 Servlet 的生命周期,为 Web 应用提供运行环境。 |
| 关系 | Tomcat 内置并使用了 JSP 引擎(如 Jasper),JSP 引擎是 Tomcat 处理 JSP 功能的核心部分。 | Tomcat 是 JSP 引擎的“宿主”和“管理者”,没有 Tomcat 这样的容器,JSP 引擎无法独立工作。 |
| 独立性 | JSP 引擎不能单独存在,它必须嵌入到一个 Servlet 容器(如 Tomcat)中。 | Tomcat 是一个独立的产品,它包含了 Servlet 容器和 JSP 引擎,可以单独部署和运行。 |
简而言之,JSP 引擎是 Tomcat 实现其 JSP 处理能力的“心脏”,而 Tomcat 则是为这个“心脏”提供全身机能的“身体”,两者紧密协作,共同构成了一个强大而灵活的 Java Web 开发和运行平台。
