嵌入式 Tomcat
最后修改于 2023 年 1 月 10 日
在本教程中,我们将展示如何使用嵌入式 Tomcat 服务器。Tomcat 可以在嵌入式模式下运行;这意味着不需要构建 WAR 文件并将其部署在独立的 Tomcat 服务器中。本教程中的示例使用 Maven 构建。
Tomcat
Apache Tomcat 是 Java Servlet、JavaServer Pages、Java 表达式语言和 Java WebSocket 技术的开源实现。
Apache Maven 是一种软件项目管理和理解工具。该项目在名为 pom.xml
的 XML 文件中描述。它包含项目对其他外部模块和组件的依赖关系、构建顺序、目录和所需的插件。
创建 Servlet
在以下示例中,我们将创建一个带有嵌入式 Tomcat 服务器的命令行 Java 应用程序。该应用程序附加一个简单的 servlet。

该图显示了 NetBeans 中的项目结构。请注意,我们使用 Java Maven 控制台应用程序,而不是 Maven Web 应用程序。
<?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.zetcode</groupId> <artifactId>EmbeddedTomcatEx</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <tomcat.version>9.0.0.M6</tomcat.version> </properties> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-logging-juli</artifactId> <version>${tomcat.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>appassembler-maven-plugin</artifactId> <version>1.1.1</version> <configuration> <assembleDirectory>target</assembleDirectory> <programs> <program> <mainClass>com.zetcode.embedded.EmbeddedTomcatEx</mainClass> <name>webapp</name> </program> </programs> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>assemble</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
Maven pom.xml
包含嵌入式 Tomcat 服务器和构建应用程序的汇编器插件的依赖项。JSP 容器的依赖项不包含在此应用程序中,因为我们只有一个 servlet。
package com.zetcode.embedded; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.io.Writer; import org.apache.catalina.Context; import org.apache.catalina.LifecycleException; import org.apache.catalina.startup.Tomcat; public class EmbeddedTomcatEx { public static void main(String[] args) throws LifecycleException, InterruptedException, ServletException { Tomcat tomcat = new Tomcat(); tomcat.setPort(8082); Context ctx = tomcat.addContext("/", new File(".").getAbsolutePath()); Tomcat.addServlet(ctx, "Embedded", new HttpServlet() { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Writer w = resp.getWriter(); w.write("Embedded Tomcat servlet.\n"); w.flush(); w.close(); } }); ctx.addServletMapping("/*", "Embedded"); tomcat.start(); tomcat.getServer().await(); } }
EmbeddedTomcatEx
是一个 Java 控制台应用程序,其中包含一个嵌入式 Tomcat 服务器。
Tomcat tomcat = new Tomcat(); tomcat.setPort(8082);
Tomcat 在端口 8082 上启动。默认端口是 8080;NetBeans 使用 8084 作为其内置 Tomcat 服务器。我们选择另一个端口,这样就不会发生冲突。
Context ctx = tomcat.addContext("/", new File(".").getAbsolutePath());
每个应用程序都映射到一个上下文。使用 addContext
方法,我们创建一个不支持 JSP 文件且没有 web.xml
文件的应用程序。我们使用根上下文路径和当前工作目录作为文档根目录。
Tomcat.addServlet(ctx, "Embedded", new HttpServlet() { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Writer w = resp.getWriter(); w.write("Embedded Tomcat servlet.\n"); w.flush(); w.close(); } });
使用 addServlet
方法添加一个新的 servlet。servlet 简单地响应一些 ASCII 文本。
ctx.addServletMapping("/*", "Embedded");
servlet 映射控制如何访问名为 Embedded 的 servlet。 对于我们的示例,任何 URL 最终都会调用我们的 servlet。
tomcat.start(); tomcat.getServer().await();
Tomcat 服务器已启动。
$ curl localhost:8082/ Embedded Tomcat servlet.
我们运行该应用程序并使用 curl
工具对其进行测试。
JSP 文件
在第二个示例中,我们使用嵌入式 Tomcat 服务器来提供 JSP 文件。
<?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.zetcode</groupId> <artifactId>EmbeddedTomcatEx2</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <tomcat.version>9.0.0.M6</tomcat.version> </properties> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-logging-juli</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper-el</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jsp-api</artifactId> <version>${tomcat.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>appassembler-maven-plugin</artifactId> <version>1.1.1</version> <configuration> <assembleDirectory>target</assembleDirectory> <programs> <program> <mainClass>com.zetcode.embedded.EmbeddedTomcatEx2</mainClass> <name>webapp</name> </program> </programs> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>assemble</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <name>EmbeddedTomcatEx2</name> </project>
在此 pom.xml
文件中,我们还包括嵌入式 Tomcat JSP 容器的依赖项:tomcat-jasper
、tomcat-jasper-el
和 tomcat-jsp-api
。
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>JSP file</title> <meta charset="UTF-8"> </head> <body> <p> This is a simple JSP file. </p> </body> </html>
这是一个简单的 JSP 文件,将由嵌入式 Tomcat 服务器提供服务。
package com.zetcode.embedded; import javax.servlet.ServletException; import java.io.File; import org.apache.catalina.LifecycleException; import org.apache.catalina.startup.Tomcat; public class EmbeddedTomcatEx2 { public static void main(String[] args) throws LifecycleException, InterruptedException, ServletException { String docBase = "src/main/webapp/"; Tomcat tomcat = new Tomcat(); tomcat.setPort(8082); tomcat.addWebapp("/", new File(docBase).getAbsolutePath()); tomcat.start(); tomcat.getServer().await(); } }
该应用程序提供一个 JSP 文件。该文件位于 src/main/webapp
子目录中。
tomcat.addWebapp("/", new File(docBase).getAbsolutePath());
这次我们使用 addWebapp
将我们的应用程序添加到 Tomcat 服务器。
$ curl localhost:8082/ <!DOCTYPE html> <html> <head> <title>JSP file</title> <meta charset="UTF-8"> </head> <body> <p> This is a simple JSP file. </p> </body> </html>
当我们访问该应用程序时,我们会得到这个结果。
这就是嵌入式 Tomcat 教程。通过嵌入式 Tomcat,我们提供了一个 servlet 和一个 JSP 文件。我们使用了 Apache Tomcat、Maven 和 NetBeans。您可能还想查看一些相关教程:使用嵌入式 Jetty 的 Jersey 应用程序、Jetty 教程、Java 教程 或 SQL 查询标记教程。