Java Tomcat 完整教程

目录

  1. 第一部分:基础入门

    java tomcat教程
    (图片来源网络,侵删)
    • 1 什么是 Tomcat?
    • 2 Tomcat 的核心组件
    • 3 Tomcat 与 Java EE 的关系
    • 4 环境准备:安装 JDK
  2. 第二部分:安装与启动

    • 1 下载 Tomcat
    • 2 Windows 环境安装与启动
    • 3 Linux/macOS 环境安装与启动
    • 4 验证 Tomcat 是否运行成功
  3. 第三部分:核心配置

    • 1 server.xml 文件详解
    • 2 修改端口号(避免冲突)
    • 3 部署应用(三种方式)
    • 4 配置虚拟主机
    • 5 日志配置
  4. 第四部分:Web 应用部署实战

    • 1 创建一个简单的 Java Web 应用
    • 2 方式一:手动部署(复制 WAR 包)
    • 3 方式二:使用 Tomcat Manager 部署
    • 4 方式三:IDE(如 IntelliJ IDEA/Eclipse)集成部署
  5. 第五部分:进阶主题

    java tomcat教程
    (图片来源网络,侵删)
    • 1 配置数据源
    • 2 配置 SSL/TLS (HTTPS)
    • 3 性能调优(JVM、连接池等)
    • 4 日志管理
  6. 第六部分:常见问题与故障排查

    • 1 端口被占用
    • 2 应用无法访问 (404, 500)
    • 3 内存溢出
    • 4 查看日志

第一部分:基础入门

1 什么是 Tomcat?

Apache Tomcat(简称 Tomcat)是一个开源的、轻量级的 Web 应用服务器和 Servlet 容器,它实现了 Java Servlet、JavaServer Pages (JSP)、Java Expression Language 和 Java WebSocket 规范。

  • Web 服务器:负责处理 HTTP 请求和响应,Nginx、Apache HTTP Server。
  • 应用服务器:除了 HTTP 服务,还提供了更复杂的服务,如事务管理、数据库连接池等,WebLogic、WebSphere。
  • Servlet 容器:这是 Tomcat 的核心身份,它是一个“环境”,专门用来运行 Java Servlet 和 JSP 应用,Tomcat 本身不包含完整的 Java EE 实现,但它是运行 Java Web 应用的理想选择。

2 Tomcat 的核心组件

理解 Tomcat 的目录结构和核心组件至关重要。

  • bin: 存放启动和关闭 Tomcat 的脚本 (.sh / .bat)。
  • conf: 存放核心配置文件,最重要的是 server.xml
  • webapps: Web 应用部署目录,你所有的 Java Web 应用(通常打包成 .war 文件)放在这里,Tomcat 会自动部署。
  • logs: 存放 Tomcat 的日志文件(catalina.out, localhost.xxxx.log 等),排查问题时首先要看这里。
  • temp: Tomcat 运行时产生的临时文件。
  • work: JSP 文件被编译成 Servlet 后生成的 .java.class 文件存放的地方。
  • lib: 存放 Tomcat 自身所需的库文件。

3 Tomcat 与 Java EE 的关系

Java EE 是一个庞大的规范集合,包含 EJB、JMS、JPA 等,而 Tomcat 只实现了其中最核心的 Web 部分(Servlet/JSP),Tomcat 非常轻量、快速、资源占用少,非常适合开发和部署中小型 Web 应用,以及作为大型应用的前端服务器。

java tomcat教程
(图片来源网络,侵删)

4 环境准备:安装 JDK

Tomcat 是用 Java 编写的,所以必须先安装 Java Development Kit (JDK)。

  1. 下载 JDK:从 Oracle 官网OpenJDK 官网 下载。
  2. 安装 JDK:按照安装向导进行安装。
  3. 配置环境变量:
    • JAVA_HOME: 指向 JDK 的安装根目录(C:\Program Files\Java\jdk-17)。
    • PATH: 在 PATH 变量中添加 %JAVA_HOME%\bin (Windows) 或 $JAVA_HOME/bin (Linux/macOS)。
  4. 验证安装:打开命令行,输入 java -versionjavac -version,如果显示版本号,则说明安装成功。

第二部分:安装与启动

1 下载 Tomcat

  1. 访问 Tomcat 官网下载页面
  2. 选择 "Core" 下的 "Binary Distributions"。
  3. 选择适合你操作系统的版本(如 64-bit Windows ZIP 或 64-bit Linux tar.gz)。
  4. 下载后解压到你喜欢的目录,D:\apache-tomcat-9.0.85/opt/apache-tomcat-9.0.85

2 Windows 环境安装与启动

  1. 进入 Tomcat 的 bin 目录。
  2. 双击 startup.bat 文件,会弹出一个命令行窗口,显示启动信息。
  3. 看到 Server startup in xxx ms 表示启动成功。

3 Linux/macOS 环境安装与启动

  1. 进入 Tomcat 的 bin 目录。
  2. startup.shshutdown.sh 赋予执行权限:
    chmod +x startup.sh shutdown.sh
  3. 执行启动脚本:
    ./startup.sh
  4. 你会看到类似 Using CATALINA_BASE: /opt/apache-tomcat-9.0.85 的输出。

4 验证 Tomcat 是否运行成功

打开你的浏览器,访问 http://localhost:8080

如果看到 Tomcat 的欢迎页面,则说明 Tomcat 已经成功运行!


第三部分:核心配置

1 server.xml 文件详解

conf/server.xml 是 Tomcat 的主配置文件,它定义了 Tomcat 的整体结构,最重要的元素包括:

  • <Server>: 代表整个 Tomcat 实例。
  • <Service>: 一组 <Connector> 和一个 <Engine> 的组合。
  • <Engine>: 处理所有来自 <Connector> 的请求,并将其传递给相应的 <Host>
  • <Host>: 一个虚拟主机,对应一个或多个 Web 应用,默认的 Hostlocalhost,对应 webapps 目录。
  • <Connector>: 负责接收客户端的 HTTP 请求,可以配置不同的端口、协议等。
  • <Context>: 代表一个具体的 Web 应用,通常我们推荐在 webapps 目录下创建应用目录,而不是直接在这里配置。

2 修改端口号(避免冲突)

默认的 HTTP 端口是 8080,如果这个端口被其他程序占用,Tomcat 会启动失败。

编辑 conf/server.xml,找到 <Connector> 元素,修改 port 属性:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

你可以将其改为 8081 或其他未被占用的端口。

3 部署应用(三种方式)

部署 Web 应用主要有三种方式:

  1. 复制到 webapps 目录(最常用): 将你的 Web 应用打包成 .war 文件,然后直接复制到 webapps 目录下,Tomcat 会自动解压并部署它。

    • myapp.war 复制到 webapps,访问地址就是 http://localhost:8080/myapp
  2. server.xml 中配置 <Context>: 在 <Host> 元素内部添加 <Context>

    <Host name="localhost"  appBase="webapps"
          unpackWARs="true" autoDeploy="true">
        <Context docBase="D:/my_custom_app" path="/myapp" reloadable="true"/>
    </Host>
    • docBase: 指向你的应用根目录(可以是 .war 文件路径或文件夹路径)。
    • path: 访问该应用的 URL 路径。
    • 注意:官方不推荐直接修改 server.xml,因为重启后配置可能丢失,推荐使用第三种方式。
  3. 使用 context.xml 文件(推荐): 在 conf/Catalina/localhost/ 目录下创建一个与你的应用同名的 XML 文件,要部署一个名为 myapp 的应用,创建 conf/Catalina/localhost/myapp.xml 文件。

    <!-- conf/Catalina/localhost/myapp.xml -->
    <Context docBase="D:/my_custom_app" reloadable="true"/>
    • 这样做的好处是配置与应用分离,且不需要修改主 server.xml
    • path 会自动取文件名,即 myapp

4 配置虚拟主机

虚拟主机允许你在一个 Tomcat 实例上运行多个域名网站。

  1. 修改 conf/server.xml: 在 <Engine> 标签内添加新的 <Host>

    <Engine name="Catalina" defaultHost="localhost">
        <!-- 默认的 localhost 主机 -->
        <Host name="localhost"  appBase="webapps"
              unpackWARs="true" autoDeploy="true">
        </Host>
        <!-- 新增的虚拟主机 www.example.com -->
        <Host name="www.example.com"  appBase="webapps/example_com"
              unpackWARs="true" autoDeploy="true">
        </Host>
    </Engine>
  2. 配置 DNS:确保 www.example.com 的域名解析到你服务器的 IP 地址。

  3. 创建目录:在 webapps 下创建 example_com 目录,并将网站文件放入其中。

5 日志配置

默认情况下,所有日志都输出到 logs/catalina.out(Linux)或 logs/catalina.YYYY-MM-DD.log(Windows)。

你可以通过修改 conf/logging.properties 来配置更精细的日志策略,比如按日期分割日志、不同级别日志输出到不同文件等。


第四部分:Web 应用部署实战

1 创建一个简单的 Java Web 应用

  1. 创建项目目录结构

    myapp/
    ├── src/
    │   └── com/
    │       └── example/
    │           └── HelloServlet.java
    ├── web/
    │   └── WEB-INF/
    │       ├── web.xml
    │       └── lib/
    └── pom.xml  (如果使用 Maven)
  2. 编写 HelloServlet.java

    package com.example;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.IOException;
    public class HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/html");
            resp.getWriter().println("<h1>Hello from Tomcat!</h1>");
        }
    }
  3. 配置 web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <servlet>
            <servlet-name>HelloServlet</servlet-name>
            <servlet-class>com.example.HelloServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>HelloServlet</servlet-name>
            <url-pattern>/hello</url-pattern>
        </servlet-mapping>
    </web-app>
  4. 编译并打包成 WAR: 使用 IDE(如 IntelliJ IDEA)或 Maven 命令 mvn clean package,会生成一个 myapp.war 文件。

2 方式一:手动部署(复制 WAR 包)

  1. myapp.war 复制到 Tomcat 的 webapps 目录。
  2. 启动(或重启)Tomcat。
  3. Tomcat 会自动解压 myapp.war
  4. 访问 http://localhost:8080/myapp/hello,你应该能看到 "Hello from Tomcat!"。

3 方式二:使用 Tomcat Manager 部署

Tomcat Manager 是一个 Web 应用,用于管理部署在 Tomcat 上的应用。

  1. 配置用户权限: 编辑 conf/tomcat-users.xml,添加一个具有 manager-guimanager-script 角色的用户。
    <tomcat-users xmlns="http://tomcat.apache.org/xml.tomcat-users.xml"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://tomcat.apache.org/xml.tomcat-users.xml
                  http://tomcat.apache.org/xml.tomcat-users.xsd">
        <role rolename="manager-gui"/>
        <role rolename="manager-script"/>
        <user username="admin" password="password" roles="manager-gui,manager-script"/>
    </tomcat-users>
  2. 访问 Manager App: 启动 Tomcat 后,访问 http://localhost:8080/manager/html
  3. 部署应用
    • 输入用户名和密码登录。
    • 在 "WAR file to deploy" 部分,点击 "Choose File" 选择你的 myapp.war
    • 点击 "Deploy"。

4 方式三:IDE(如 IntelliJ IDEA/Eclipse)集成部署

现代 Java IDE 都内置了对 Tomcat 的完美支持。

  1. 配置 Tomcat 服务器: 在 IDE 中,添加一个 Tomcat 服务器实例,并指向你的 Tomcat 安装目录。
  2. 部署应用

    在 "Artifacts" 或 "Deployment" 选项卡中,将你的 Web 应用项目添加到 Tomcat 服务器上。

  3. 启动和调试: IDE 会自动编译你的代码、打包成 WAR 并部署到 Tomcat,然后启动服务器,你可以在 IDE 中直接进行断点调试,非常方便。

第五部分:进阶主题

1 配置数据源

在 Web 应用中,通常需要连接数据库,将数据库连接池配置在 Tomcat 中,可以让所有应用共享,提高资源利用率。

  1. 创建数据源配置文件: 在 conf/Catalina/localhost/ 目录下创建一个 your_app.xml 文件(your_app 是你的应用名)。
    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
        <!-- Resource definition for a MySQL DataSource -->
        <Resource name="jdbc/MyDB"
                   auth="Container"
                   type="javax.sql.DataSource"
                   maxTotal="100"
                   maxIdle="30"
                   maxWaitMillis="10000"
                   username="dbuser"
                   password="dbpassword"
                   driverClassName="com.mysql.cj.jdbc.Driver"
                   url="jdbc:mysql://localhost:3306/mydatabase?useSSL=false&amp;serverTimezone=UTC"/>
    </Context>
  2. 在应用中使用数据源: 在你的 Java 代码中,通过 JNDI (Java Naming and Directory Interface) 查找数据源。
    // InitialContext ctx = new InitialContext(); // Java 8
    Context ctx = new InitialContext(); // Java 11+
    DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyDB");
    Connection conn = ds.getConnection();
    // ... 使用 conn 进行数据库操作 ...

2 配置 SSL/TLS (HTTPS)

为 Tomcat 配置 HTTPS 可以保障数据传输安全。

  1. 获取证书: 你可以从证书颁发机构购买,或者使用 keytool 生成一个自签名的证书用于开发环境。
    keytool -genkeypair -alias tomcat -keyalg RSA -keystore keystore.jks -storepass password -keypass password
  2. 配置 server.xml: 在 <Service> 标签内添加一个 <Connector>,并配置 SSL 相关属性。
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="httpss" secure="true"
               clientAuth="false" sslProtocol="TLS"
               keystoreFile="conf/keystore.jks"
               keystorePass="password"/>
  3. 访问:现在可以通过 https://localhost:8443 访问你的应用了。

3 性能调优

  • JVM 内存调优:在 bin/catalina.sh (Linux) 或 bin/catalina.bat (Windows) 中设置 JAVA_OPTS
    export JAVA_OPTS="-Xms512m -Xmx1024m -XX:MaxPermSize=256m"
    • -Xms: JVM 初始堆内存大小。
    • -Xmx: JVM 最大堆内存大小,这是最重要的调优参数。
  • 连接池调优:调整 <Connector> 中的 maxThreads(最大线程数)、acceptCount(等待队列长度)等参数。
  • 使用 AJP 协议:Tomcat 通常作为后端应用服务器,Nginx 或 Apache 作为前端反向代理,它们之间可以通过 AJP 协议通信,性能比 HTTP 更好。

4 日志管理

  • 使用 log4j2Logback:虽然 Tomcat 自带了 JULI (Java Util Logging Implementation),但强烈建议在你的 Web 应用中使用更强大的日志框架如 Log4j2Logback
  • 配置:在你的应用中添加 log4j2.xmllogback.xml 配置文件,可以灵活地控制日志的输出格式、级别和目的地(文件、控制台等)。

第六部分:常见问题与故障排查

1 端口被占用

  • 现象:启动 startup.shstartup.bat 后,窗口一闪而过,或者提示 Port already in use
  • 解决
    1. 查找占用端口的进程:netstat -ano | findstr :8080 (Windows) 或 lsof -i :8080 (Linux/macOS)。
    2. 根据找到的 PID(进程 ID),使用 taskkill /PID <PID> /F (Windows) 或 kill -9 <PID> (Linux/macOS) 结束进程。
    3. 或者,直接修改 server.xml 中的 Connector 端口。

2 应用无法访问 (404, 500)

  • 404 Not Found
    • URL 错误:检查 URL 路径是否正确,包括应用名和 Servlet 路径。
    • 应用未部署:检查 .war 文件是否在 webapps 目录下,是否已解压。
    • web.xml 配置错误:检查 <servlet-mapping> 中的 <url-pattern> 是否与请求的 URL 匹配。
  • 500 Internal Server Error
    • 这是服务器端错误,最直接的方法是查看日志!
    • 检查 logs/catalina.outlogs/localhost.<日期>.log 文件,找到具体的错误堆栈信息(java.lang.NullPointerException 等),根据错误信息定位代码问题。

3 内存溢出

  • 现象:Tomcat 启动后运行一段时间就卡死,日志中出现 OutOfMemoryError: Java heap space
  • 解决
    • 增加 JVM 内存:如 5.3 节所述,调大 -Xmx 的值。
    • 检查内存泄漏:可能是你的应用没有正确释放资源(如数据库连接、文件流等),使用工具如 VisualVM(JDK 自带)或 MAT (Memory Analyzer Tool) 来分析堆内存,找出泄漏的对象。

4 查看日志

  • logs/catalina.out / catalina.YYYY-MM-DD.log:Tomcat 的核心日志,记录了启动、关闭、严重错误等信息。
  • logs/localhost.<日期>.log:与特定主机(默认是 localhost)相关的应用日志。
  • logs/manager.<日期>.log:Tomcat Manager 应用的日志。
  • 使用 tail 命令:在 Linux 下,可以使用 tail -f logs/catalina.out 实时查看日志输出,这对于调试非常有用。