嵌入式 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 查询标记教程。