嵌入式Tomcat学习-第一天

写在前面

什么是嵌入式 Tomcat?

嵌入式 Tomcat 是将 Apache Tomcat 服务器作为库文件集成到 Java 应用程序中的技术方案。它允许开发者通过编程方式直接启动、配置和管理 Tomcat,无需依赖独立安装的 Tomcat 服务器,适用于构建轻量级、自包含的 Web 应用或微服务。

版本特性(11.0.3)

  • Servlet/JSP 规范支持
    支持 Servlet 6.0 和 JSP 4.0 规范(基于 Jakarta EE 10 平台)。
  • 轻量级嵌入
    通过 tomcat-embed-core 等依赖包实现核心功能集成,无需完整 Tomcat 安装。
  • Java 版本要求
    最低要求 Java 17 及以上版本。
  • 性能优化
    改进的 HTTP/2 支持、连接器性能调优及内存管理优化。

核心优势

  • 简化部署
    应用与服务器一体化,直接打包为可执行 JAR 文件,适合云原生场景。
  • 灵活配置
    通过代码动态配置端口、上下文路径、SSL 等参数,无需 server.xml 文件。
  • 开发便捷
    与 Spring Boot、Micronaut 等框架无缝集成,快速构建独立 Web 服务。
  • 资源占用低
    仅加载必要的组件,启动速度快,适合资源受限环境。

典型应用场景

  • 微服务架构中的独立服务节点
  • 快速原型开发或测试环境
  • 命令行工具集成 Web 接口
  • 需要定制化 Web 容器行为的场景

如何启动一个嵌入式Tomcat

第一步,创建maven项目,引入pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lhstack.tomcat</groupId>
    <artifactId>tomcat-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-core -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>11.0.3</version>
        </dependency>

    </dependencies>

    <repositories>
        <repository>
            <id>aliyun</id>
            <name>阿里云</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </repository>
    </repositories>

</project>

第二步,创建main工程,编写以下代码

package com.lhstack.tomcat;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.startup.Tomcat;

import java.io.IOException;

public class TomcatApplication {
    public static void main(String[] args) throws Throwable {
        Tomcat tomcat = new Tomcat();
        Context context = tomcat.addContext("", null);
        //添加Servlet
        Tomcat.addServlet(context, "main", new HttpServlet() {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                resp.setHeader("Content-Type","text/plain;charset=UTF-8");
                resp.getWriter().println("hello world");
            }
        }).addMapping("/");
        Connector connector = tomcat.getConnector();
        connector.setPort(8080);
        tomcat.start();
        tomcat.getServer().await();
    }
}

启动项目,浏览器运行查看效果如下

image-rxug.png

image-hyus.png

添加过滤器

修改代码,如下内容

package com.lhstack.tomcat;

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.catalina.Context;
import org.apache.catalina.Wrapper;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.startup.Tomcat;
import org.apache.tomcat.util.descriptor.web.FilterDef;
import org.apache.tomcat.util.descriptor.web.FilterMap;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class TomcatApplication {
    public static void main(String[] args) throws Throwable {
        Tomcat tomcat = new Tomcat();
        Context context = tomcat.addContext("", null);
        //添加Servlet
        Wrapper wrapper = Tomcat.addServlet(context, "main", new HttpServlet() {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                resp.setHeader("Content-Type", "text/plain;charset=UTF-8");
                resp.getWriter().println("hello world");
            }
        });
        wrapper.setAsyncSupported(true);
        wrapper.addMapping("/");
        //主要添加如下代码
        FilterDef characterEncodingFilterDef = new FilterDef();
        characterEncodingFilterDef.setAsyncSupported("true");
        characterEncodingFilterDef.setFilterName("CharacterEncodingFilter");
        characterEncodingFilterDef.setFilter(new GenericFilter() {
            @Override
            public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
                req.setCharacterEncoding(StandardCharsets.UTF_8);
                res.setCharacterEncoding(StandardCharsets.UTF_8);
                chain.doFilter(req,res);
            }
        });
        context.addFilterDef(characterEncodingFilterDef);
        FilterMap characterEncodingFilterMap = new FilterMap();
        characterEncodingFilterMap.addURLPattern("/*");
        characterEncodingFilterMap.setFilterName("CharacterEncodingFilter");
        context.addFilterMap(characterEncodingFilterMap);
        Connector connector = tomcat.getConnector();
        connector.setPort(8080);
        tomcat.start();
        tomcat.getServer().await();
    }
}

浏览器访问,Debug代码,看是否进入过滤器

image-harp.png

结尾

源码
通过嵌入式 Tomcat 11.0.3,开发者可以高效构建灵活、轻量的 Web 应用,同时保持对最新 Jakarta EE 标准的支持。


嵌入式Tomcat学习-第一天
https://blog.lhstack.xyz/archives/tomcat-firstday
作者
lhstack
发布于
2025年02月14日
许可协议