第5章 Tomcat¶
第 5 章¶
Tomcat¶
在正式开发 Web 应用之前,需要搭建 Web 开发环境,即安装 Web 服务器,运行 Web 应用程序。本章介绍的 Web 服务器为 Tomcat 服务器,它是一个免费开源的 Web 服务器,属于轻量级应用服务器,在很多中小型系统中被普遍使用。鉴于 Tomcat 是由 Java 代码编写的,所以还需要准备 JDK 环境,另外,为了提高开发效率,本书将借助 IntelliJ IDEA(简称 IDEA)开发工具编写 Java 程序。本章内容主要包括 Tomcat 如何进行下载、安装和项目部署,以及 Tomcat 与 IDEA 工具的整合使用,最后带领大家手把手编写动态 Web 工程。
5.1 Tomcat 简介¶
Web 服务器由硬件和软件共同构成。服务器硬件指能够提供服务让其他客户端访问的设备。服务器软件本质上是一个应用程序,由代码编写而成,其运行在服务器设备上,能够接收请求并根据请求给客户端响应数据、发布静态或动态资源。服务器只是一台设备,必须安装服务器软件才能提供服务。通常情况下,我们可以把 Web 服务器理解成一台计算机主机,只不过这台计算机需要提供可靠的服务,对其在处理能力、稳定性、安全性方面的要求比普通计算机更高。如图 5-1 所示,为一个存放了很多服务器的机房。

关于 Web 服务器的作用及常见的 JavaWeb 服务器的简介已经在 1.1.2 节进行讲解。
5.1.1 什么是 Tomcat¶
Tomcat 是 Apache 软件基金会 (Apache Software Foundation) 的 Jakarta 项目中的一个核心项目,由 Apache、Sun 公司和其他一些公司及个人共同开发而成。由于 Sun 公司的参与和支持,最新的 Servlet 和 JSP 规范得以在 Tomcat 中体现。由于 Tomcat 技术先进、性能稳定,而且免费,因而深受 Java 爱好者的喜爱,并得到了部分软件开发商的认可,成为目前比较流行的 Web 应用服务器。Tomcat 服务器的结构图如图 5-2 所示。
Tomcat 的主要组件包括 Server 服务器、Service 服务、Connector 连接器和 Container 容器。Connector 连接器和 Container 容器是 Tomcat 的核心。一个 Container 容器和一个或多个 Connector 连接器组合在一起,加上其他一些支持组件共同组成一个 Service 服务,有了 Service 服务便可以对外提供服务能力。不过 Service 服务的正常运行需要一个生存环境,这个环境便是 Server 服务器,Server 服务器为 Service 服务的正常运行提供了生存环境,且 Server 服务器可以同时管理一个或多个 Service 服务。
对于企业来说,Tomcat 7.0 和 Tomcat 8.0 是使用比较广泛的版本。基本上 Tomcat 6.0 以下的版本都不再使用,下面我们将从 Tomcat 6.0 开始,对不同版本的 Tomcat 进行简单的介绍。

本书将基于 Tomcat 8.5.27 进行讲解。
5.1.2 安装 Tomcat¶
Tomcat 官网提供安装版和解压版两种版本的安装包,通常选择解压版即可,下载相应版本的安装包,直接解压就可以使用。
下面以 apache-tomcat-8.5.27-windows-x64.zip 压缩包为例,演示 Tomcat 的安装与部署。
首先进入 Tomcat 官方网站,下载该压缩包并进行解压。需要注意的是,为防止路径解析失败,请确保下载到非中文无空格的目录下。
如图 5-3 所示,将 Tomcat 解压到 “D:\ProgramFiles\apache-tomcat-8.5.27” 目录,这个目录包含 Tomcat 的 bin 目录、conf 目录等,称之为 Tomcat 的安装目录或根目录。
- bin:该目录下存放的是二进制可执行文件。如果是安装版,那么这个目录下会有两个 exe 文件:tomcat8.exe 和 tomcat8w.exe。前者是在控制台下启动 Tomcat,后者是弹出 GUI 窗口启动 Tomcat。如果是解压版,那么会有 startup.bat 和 shutdown.bat 文件,startup.bat 用来启动 Tomcat,但需要先配置 JAVA_HOME 环境变量才能启动,shutdawn.bat 用来停止 Tomcat。
- conf: 这是一个非常重要的目录,这个目录下有四个最为重要的文件,具体如下。

① server.xml:配置整个服务器端信息。例如,修改端口号(默认 HTTP 请求的端口号是 8080)。
② tomcat-users.xml:存储 tomcat 用户的文件,这里保存的是 tomcat 的用户名及密码,以及用户的角色信
息。可以按照该文件中的注释信息添加 tomcat 用户,然后就可以在 Tomcat 主页中进入 Tomcat Manager 页面了。
③ web.xml:部署描述符文件,这个文件中注册了很多 MIME 类型,即文档类型。这些 MIME 类型是客户端与服务器端之间说明文档类型的,如用户请求一个 HTML 网页,那么服务器端还会告诉客户端浏览器响应的文档是 text/html 类型的,这就是一个 MIME 类型。客户端浏览器通过这个 MIME 类型就知道如何处理它了。当然是在浏览器中显示这个 HTML 文件了。但如果服务器端响应的是一个 exe 文件,那么浏览器就不可能显示它,而是应该弹出下载窗口。MIME 用来说明文档内容的类型。
④ context.xml:对所有应用的统一配置,通常我们不会去配置它。
- lib: Tomcat 的类库,里面是一大堆 jar 文件。如果需要添加 Tomcat 依赖的 jar 文件,可以把它存放到该目录中,当然也可以把应用依赖的 jar 文件存放到这个目录中,这个目录中的 jar 所有项目都可以共享,但这样你的应用存放到其他 Tomcat 下时就不能再共享这个目录下的 jar 包了,因此建议只把 Tomcat 需要的 jar 包存放到这个目录下。
- logs: 这个目录中都是日志文件,记录了 Tomcat 启动和关闭的信息,如果启动 Tomcat 时有错误,那么异常也会记录在日志文件中。
- temp: 存放 Tomcat 的临时文件,这个目录下的文件可以在停止 Tomcat 后删除。
- webapps:存放 Web 项目的目录,其中每个文件夹都是一个项目;如果这个目录下已经存在目录,那么都是 tomcat 自带的项目。其中,ROOT 是一个特殊的项目,在地址栏中访问:http://127.0.0.1:8080,没有给出项目目录时,对应的就是 ROOT 项目。可通过链接 http://localhost:8080/examples,进入示例项目。其中 examples 就是项目名,即文件夹的名字。
- work:运行时生成的文件,最终运行的文件都保存在这里。work 中的内容是通过部署 webapps 中的项目生成的!可以把这个目录下的内容删除,再次运行时会重新生成。当客户端用户访问一个 JSP 文件时,Tomcat 会通过 JSP 生成 Java 文件,然后再编译 Java 文件生成 class 文件,生成的 java 和 class 文件都会存放到这个目录下。
- LICENSE: 许可证。
- NOTICE: 说明文件。
5.1.3 配置环境变量¶
正式启动 Tomcat 前,我们还需要为其配置环境变量,包括 JAVA_HOME 和 CATALINA_HOME,步骤如下。
1. 配置 JAVA_HOME 环境变量¶
(1)右击 “计算机 / 我的电脑 / 此电脑” 按钮,选择 “属性” 选项,如图 5-4 所示。
(2)单击 “高级系统设置” 选项,如图 5-5 所示。


(3)单击 “高级” 选项卡中的 “环境变量(N)…” 按钮,如图 5-6 所示。
(4)在系统变量中单击 “新建” 按钮,创建 “JAVA_HOME” 变量,对应的变量值为 JDK 安装目录,如 “D:\Program Files\Java\jdk1.8.0_141”,如图 5-7 所示(注意,这里先检查是否已经配置该环境变量,没有配置再新建)。


(5)找到 “系统变量” 的 Path 变量,将 “% JAVA_HOME%\bin” 加入 Path 环境变量中,并单击 “确定” 按钮,如图 5-8 所示。建议使用系统变量中的 Path 变量,而不是上面用户变量中的 Path 变量,它们的区别在于,系统变量适用于任意用户,用户变量仅适用于当前用户。
(6)验证环境变量是否配置成功。关闭之前的命令行窗口,再次打开一个新的命令行窗口,否则新配置的环境变量在原来的命令行窗口不起作用。Windows+R 键,再次输入 cmd,打开命令行窗口,然后输入 javac,发现在任意目录运行 javac 时不会提示 “javac 不是内部或外部命令”,如图 5-9 所示,说明环境变量配置成功。


2. 配置 CATALINA_HOME 环境变量¶
CATALINA_HOME 环境变量,用来指定 Tomcat 的安装路径,为可选项。配置过程同上,打开 “环境变量” 管理页面,在系统变量中创建 CATALINA_HOME 环境变量,如图 5-10 所示。

最后将 “% CATALINA_HOME%\bin” 加入 Path 变量中,如图 5-11 所示。

5.1.4 启动 Tomcat¶
配置好环境变量,接下来就可以正式启动 Tomcat 了。在 Tomcat 解压目录的 bin 目录下双击 startup.bat 启动 Tomcat 服务器,如图 5-12 所示,在浏览器地址栏访问 “http://localhost:8080” 进行测试。

如果启动失败,可能存在以下两种情况。
情况一:双击 startup.bat 后窗口一闪而过。
如果双击 startup.bat 后窗口一闪而过,请查看 JAVA_HOME 是否配置正确。双击 startup.bat 会调用 catalina.bat,而 catalina.bat 会调用 setclasspath.bat,setclasspath.bat 会使用 JAVA_HOME 环境变量,因此我们必须在启动 Tomcat 之前把 JAVA_HOME 配置正确。
情况二:启动失败,提示端口号被占用。
如果启动失败,提示端口号被占用,则将默认的 8080 端口修改为其他未使用的值,例如 8989 等。具体操作步骤如下,打开 Tomcat 解压目录下 “conf\server.xml” 文件,找到第一个

Web 服务器在启动时,实际上监听了本机上的一个端口,当有客户端向该端口发送请求时,Web 服务器就会处理请求。但是如果不是向其所监听的端口发送请求,Web 服务器不会做任何响应。例如,Tomcat 启动监听了 8989 端口,而访问的地址是 “http://localhost:8080”,将不能正常访问。
5.2 IDEA 整合 Tomcat¶
为了使开发更加方便快捷,我们可以直接在 IDEA 工具中整合 Tomcat。在 IDEA 中配置好 Tomcat 后,可以直接通过 IDEA 工具控制 Tomcat 的启动和停止,而不用再去操作 startup.bat 和 shutdown.bat 命令。具体步骤如下。
(1)单击 “File” 菜单,选择 “Settings...” 选项,如图 5-14 所示。
(2)进入 Settings 新窗口,选择 “Build,Execution,Deployment” 选项下的 “Application Servers” 选项,然后单击右侧的加号 “+”,选择 “Tomcat Server”,如图 5-15 所示。
(3)进入 “Tomcat Server” 新窗口配置 Tomcat 服务器,指定本地 Tomcat 的安装目录,如图 5-16 所示。然后单击 “OK” 按钮即可,接下来就可以在 IDEA 中使用 Tomcat 了。



5.2.1 创建动态 Web 工程¶
下面演示使用 IDEA 创建动态 Web 工程,动态 Web 工程即 Java 项目和 static web 项目的结合,也称为企业级 Java 项目,需要借助 Tomcat 服务器部署运行,步骤如下。
最后单击 “OK” 按钮即可,至此一个动态 Web 项目就创建完成了。




5.2.2 Web 工程的目录结构说明¶
动态 Web 项目创建完成后,查看该项目的目录结构,如图 5-21 所示。
“chapter05_tomcat” 项目目录主要包括两部分,分别为 src 目录和 web 目录。index.jsp 可以被删除,由于 JSP 技术已经过时,因此该文件不必理会。
另外,我们需要在 WEB-INF 目录下新建一个文件夹 lib,用于存放第三方 JAR 包,如图 5-22 所示。


注意,lib 文件夹必须放在 WEB-INF 目录下,且名称只能为 lib,不然无法部署到服务器端上,将导致代码运行失败。
接下来,需要将该项目部署到 Tomcat 服务器。如图 5-23 所示,单击 “Edit Configurations”,进入 “Run/Debug Configurations” 新窗口。

在 “Run/Debug Configurations” 新窗口,单击 “+” 号,添加 Tomcat 服务器,如图 5-24 所示。
添加 Tomcat 服务器后,部署该项目。如图 5-25 所示,单击右下角 “Fix” 提示,选择该项目对应的 “artifact”。


chapter05_tomcat 项目对应的 “artifact” 是 “chapter05_tomcat:war exploded”,它就是编译后的项目,将其部署到 Tomcat 服务器上,然后单击 “OK” 按钮即可,如图 5-26 所示。

然后启动 Tomcat,在 IDEA 中可以看到上方菜单栏显示的 “Tomcat 8.5.27”,单击其右侧绿色三角按钮即可,如图 5-27 所示。

查看控制台,如图 5-28 所示,左侧显示 “√”,且右侧显示 “Connected to server” 表明 Tomcat 服务器启动成功。Tomcat 启动后,自动打开浏览器页面,如图 5-29 所示。


其实页面上显示的是 index.jsp 页面,示例代码如下,该页面后续不会使用,而且初始页面可以手动设置,接下来会详细介绍。
5.2.3 Tomcat 相关配置¶
IDEA 整合 Tomcat 本质上是针对本地的 Tomcat 创建的一个镜像服务器,相当于一个副本,在 IDEA 中运行项目时,并不会直接调用本地的 Tomcat。
所有的镜像服务器都存放在 “C:\Users\ 用户名 \AppData\Local\JetBrains\IntelliJdea2022.3\tomcat” 目录下。例如,前面创建的 Web 工程对应的镜像服务器 “8dedf0e8-6f2b-4e34-b825-9783dd3ade1e”,其目录结构如图 5-30 所示。

对比本地的 Tomcat 服务器,镜像服务器中缺少了 bin 和 lib 目录,可以看出,镜像服务器仍然依赖于本地服务器端,conf、logs 和 work 是每个镜像服务器独用的,但 bin 和 lib 是所有镜像服务器共用的,统一从本地服务器端获取。
值得注意的是,本地服务器不能随意更换位置,且不能删除,以免镜像服务器无法找到,从而导致运行失败。
下面针对 IDEA 中的 Tomcat 镜像服务器进行相关配置。如图 5-31 所示,选择 “Edit Configurations...” 选项对其配置。
进入 “Run/Debug Configurations” 新窗口,可以设置 Tomcat 镜像服务器的名称、启动时自动弹出的浏览器网址、刷新机制、端口号等,如图 5-32 所示。


1. 名称¶
针对 “chapter05_tomcat” 项目,Tomcat 镜像服务器的名称建议修改为 “chapter05_tomcat_server”,见名知意,也避免了多个项目需要部署 Tomcat 时发生冲突。
2. 初始页面¶
在 IDEA 中启动镜像服务器时,会自动弹出浏览器打开初始页面,开发人员可以自行修改,使用哪个浏览器打开页面,以及设置启动 Tomcat 时默认打开的网址,不指定默认打开 index 页面,例如删掉 index.jsp,找不到页面则浏览器会报 404 错误,如图 5-33 所示。

另外,我们还可以手动设置初始页面,例如在 web 目录下创建 admin.html 页面,示例代码如下,并在 “Run/Debug Configurations” 页面设置默认打开网址 URL 为 “http://localhost:8080/chapter05_tomcat_war_exploded/admin.html”。
重新启动 Tmocat,浏览器页面如图 5-34 所示。

3. 刷新机制¶
启动 Tomcat 后,如果项目有变动,直接访问页面是无法看到变化的,这也证实了真正部署到服务器端上的项目是编译后的项目,本地修改并不会影响服务器端中的项目,此时可以刷新服务器端,分别有以下四种刷新情况,如图 5-35 所示。
通常情况下,刷新服务器端推荐选用 “Redeploy”。另外,端口号一般不用改动,如果需要同时启动多个项目,则需要修改端口号,保证不同项目对应端口号不同才能正常运行。
了解了关于镜像服务器的基本配置,如图 5-36 所示,在 “Run/Debug Configurations” 窗口还可以设置该服务器端上部署的项目,“chapter05_tomcat_war_exploded” 项目就是 “chapter05_tomcat” 编译后的项目。
注意,上下文路径非常重要,在今后的项目开发中,我们将会经常见到它,这里暂且对其有一个认识即可。


5.2.4 Web 工程编译后的项目结构说明¶
启动 Tomcat 后,IDEA 会自动对项目进行编译,编译后的项目一般放在 out 目录下。如图 5-37 所示,单击 “File” 菜单,选择 “Project Structure...” 选项。
进入 “Project Structure...” 新窗口,选择 “Project” 选项,查看编译后的 out 目录,如图 5-38 所示。如果此处为空,则需要手动添加 out 目录。


下面为 “chapter05_tomcat” 项目补充一些信息,包括类、第三方 JAR 包和图片等静态资源,如图 5-39 所示。重启服务器端,打开本地 “E:\JavaWeb\out” 目录,如图 5-40 所示。


其中,artifacts 目录用来存放动态 Web 工程编译后的结果;production 目录用来存放 Java 类编译后的结果。打开 artifacts 目录,可以看到 “chapter05_tomcat_war_exploded” 项目。编译后的项目名称,虽然与原先有所不同,但并没有什么影响,只是一个名称而已,不必在意。然后进入 “chapter05_tomcat_war_exploded” 目录,查看该项目的目录结构,如图 5-41 所示。

不难发现,编译后的项目目录中存放的是本地项目中 web 目录下的所有内容。那么,本地项目中 src 目录的内容编译后存放在何处呢?其实在 WEB-INF 目录下多出了一个 classes 文件夹,如图 5-42 所示。而 src 目录中的 Java 代码,编译后生成的 class 文件全部放在该 classes 文件夹中。

5.3 常见问题¶
创建动态 Web 项目过程中,难免会遇到一些小问题,导致代码运行失败,下面总结了一些开发中常见的问题及注意事项,希望初学者多加注意,防患于未然。
(1) 静态页面和动态页面的区别。¶
静态页面是实际存在的,无须经过 Web 服务器的编译,直接加载到客户浏览器上显示出来。动态页面需要通过 Web 服务器处理,动态 Web 项目的所有页面无法通过静态方式(直接复制网址到浏览器)打开。
(2) IDEA 默认打开的网址出现 404 问题。¶
前面介绍了可以在 “Run/Debug Configurations” 页面设置默认打开网址 URL,如 “http://localhost:8080/chapter05_tomcat_war_exploded/index.html”。将该网址拆解开来,“localhost” 为 IP 地址,“8080” 为端口号,“chapter05_tomcat_war_exploded” 为项目名(上下文路径),“index.html” 为(默认)资源。上述四部分只要有一处是错误的,就会报 404 错误,错误原因为路径错误。值得注意的是,如果不小心删掉了项目名,如图 5-43 所示,可以在 “Run/Debug Configurations” 窗口的 “Deployment” 页面,找到 “Application context”,重新复制一份该上下文路径到 URL 中。

需要注意的是,上下文路径是可以修改的,但对于初学者来说,建议使用默认值,不要随意修改。
(3)浏览器无法自动打开初始页。
如果启动 Tomcat 后,浏览器无法自动弹出页面,可以手动复制 “Run/Debug Configurations” 页面下的 URL 网址到浏览器。
5.4 本章小结¶
本章主要介绍了 Tomcat 相关知识,介绍了什么是 Tomcat,如何安装和配置 Tomcat,以及 IDEA 中如何使用和配置 Tomcat。Web 服务器是学习 Web 开发的必备内容,因此 Tomcat 的学习至关重要。本章实操内容较多,全程手把手带领大家操作,重点掌握 Web 工程的创建及 Tomcat 相关配置,能够区分本地项目的目录结构和编译后的目录结构,了解 IDEA 工具的一些默认机制,即自动对项目进行编译、创建镜像服务器。希望初学者能够对 Tomcat 的使用和配置勤加练习,熟练掌握。