1. 概述

本文将介绍如何通过编程方式创建、配置并运行一个Tomcat服务器。这种嵌入式Tomcat的配置方式特别适合需要快速启动测试环境或集成到现有应用的场景。

2. 项目配置

在开始之前,我们需要在Maven项目的pom.xml中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-catalina</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>${apache.httpclient}</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>

⚠️ 注意:实际使用时需替换${tomcat.version}等变量为具体版本号。最新版本可在Maven中央仓库查询。

3. 初始化和配置Tomcat

3.1 创建Tomcat实例

创建Tomcat实例非常简单粗暴,直接实例化即可:

Tomcat tomcat = new Tomcat();

3.2 基础配置

接下来进行核心配置,包括端口、主机名和应用基础路径:

tomcat.setPort(8080);
tomcat.setHostname("localhost");
String appBase = ".";
tomcat.getHost().setAppBase(appBase);

然后设置Web应用的文档根目录(docBase),这里使用系统临时目录:

File docBase = new File(System.getProperty("java.io.tmpdir"));
Context context = tomcat.addContext("", docBase.getAbsolutePath());

✅ 至此,Tomcat的基础配置已完成,接下来添加Servlet和过滤器。

3.3 添加Servlet

先定义一个简单的Servlet:

public class MyServlet extends HttpServlet {

    @Override
    protected void doGet(
      HttpServletRequest req, 
      HttpServletResponse resp) throws IOException {
 
        resp.setStatus(HttpServletResponse.SC_OK);
        resp.getWriter().write("test");
        resp.getWriter().flush();
        resp.getWriter().close();
    }
}

将Servlet注册到Tomcat上下文:

Class servletClass = MyServlet.class;
Tomcat.addServlet(
  context, servletClass.getSimpleName(), servletClass.getName());
context.addServletMappingDecoded(
  "/my-servlet/*", servletClass.getSimpleName());

3.4 添加过滤器

定义一个过滤器,在响应中添加自定义头:

public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) {
        // 初始化逻辑
    }

    @Override
    public void doFilter(
      ServletRequest request, 
      ServletResponse response, 
      FilterChain chain) 
      throws IOException, ServletException {

        HttpServletResponse httpResponse = (HttpServletResponse) response;
        httpResponse.addHeader("myHeader", "myHeaderValue");
        chain.doFilter(request, httpResponse);
    }

    @Override
    public void destroy() {
        // 清理逻辑
    }
}

注册过滤器需要更多步骤:

Class filterClass = MyFilter.class;
FilterDef myFilterDef = new FilterDef();
myFilterDef.setFilterClass(filterClass.getName());
myFilterDef.setFilterName(filterClass.getSimpleName());
context.addFilterDef(myFilterDef);

FilterMap myFilterMap = new FilterMap();
myFilterMap.setFilterName(filterClass.getSimpleName());
myFilterMap.addURLPattern("/my-servlet/*");
context.addFilterMap(myFilterMap);

4. 启动Tomcat

启动服务器并保持运行状态:

tomcat.start();
tomcat.getServer().await();

启动后访问 http://localhost:8080/my-servlet,将看到如下页面:

my servlet

查看日志会显示类似以下内容:

tomcat logs

日志表明:

  • ✅ Tomcat成功监听8080端口
  • ✅ 过滤器正确添加了自定义响应头

5. 总结

本文演示了通过编程方式配置Tomcat的核心步骤:

  1. 创建Tomcat实例
  2. 配置基础参数(端口、路径等)
  3. 动态添加Servlet和过滤器
  4. 启动服务器

这种嵌入式配置方式特别适合:

  • 快速搭建测试环境
  • 微服务中的轻量级容器
  • 需要精细控制Tomcat行为的场景

完整实现代码可在GitHub仓库获取。


原始标题:Programmatically Create, Configure and Run Tomcat