原文: https://zetcode.com/web/embeddedtomcat/

在本教程中,我们将展示如何与嵌入式 Tomcat 服务器一起使用。 Tomcat 可以在嵌入式模式下运行; 这意味着无需构建 WAR 文件并将其部署在独立的 Tomcat 服务器中。 本教程中的示例是使用 Maven 构建的。

Tomcat

Apache Tomcat 是 Java Servlet,JavaServer Pages,Java Expression Language 和 Java WebSocket 技术的开源实现。

Apache Maven 是一个软件项目管理和理解工具。 该项目在名为pom.xml的 XML 文件中描述。 它包含对其他外部模块和组件的项目依赖关系,构建顺序,目录和所需的插件。

创建一个 servlet

在下面的示例中,我们创建一个带有嵌入式 Tomcat 服务器的命令行 Java 应用。 该应用附加一个简单的 servlet。

嵌入式 Tomcat - 图1

图:项目结构

该图显示了 NetBeans 中的项目结构。 注意,我们使用的是 Java Maven 控制台应用,而不是 Maven Web 应用。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.zetcode</groupId>
  6. <artifactId>EmbeddedTomcatEx</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <properties>
  10. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  11. <maven.compiler.source>1.8</maven.compiler.source>
  12. <maven.compiler.target>1.8</maven.compiler.target>
  13. <tomcat.version>9.0.0.M6</tomcat.version>
  14. </properties>
  15. <dependencies>
  16. <dependency>
  17. <groupId>javax.servlet</groupId>
  18. <artifactId>javax.servlet-api</artifactId>
  19. <version>3.1.0</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.apache.tomcat.embed</groupId>
  23. <artifactId>tomcat-embed-core</artifactId>
  24. <version>${tomcat.version}</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.apache.tomcat.embed</groupId>
  28. <artifactId>tomcat-embed-logging-juli</artifactId>
  29. <version>${tomcat.version}</version>
  30. </dependency>
  31. </dependencies>
  32. <build>
  33. <plugins>
  34. <plugin>
  35. <groupId>org.codehaus.mojo</groupId>
  36. <artifactId>appassembler-maven-plugin</artifactId>
  37. <version>1.1.1</version>
  38. <configuration>
  39. <assembleDirectory>target</assembleDirectory>
  40. <programs>
  41. <program>
  42. <mainClass>com.zetcode.embedded.EmbeddedTomcatEx</mainClass>
  43. <name>webapp</name>
  44. </program>
  45. </programs>
  46. </configuration>
  47. <executions>
  48. <execution>
  49. <phase>package</phase>
  50. <goals>
  51. <goal>assemble</goal>
  52. </goals>
  53. </execution>
  54. </executions>
  55. </plugin>
  56. </plugins>
  57. </build>
  58. </project>

Maven pom.xml包含嵌入式 Tomcat 服务器和用于构建应用的汇编程序插件的依赖项。 由于我们只有 Servlet,因此 JSP 容器的依赖关系未包含在此应用中。

EmbeddedTomcatEx.java

  1. package com.zetcode.embedded;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.File;
  7. import java.io.IOException;
  8. import java.io.Writer;
  9. import org.apache.catalina.Context;
  10. import org.apache.catalina.LifecycleException;
  11. import org.apache.catalina.startup.Tomcat;
  12. public class EmbeddedTomcatEx {
  13. public static void main(String[] args) throws LifecycleException,
  14. InterruptedException, ServletException {
  15. Tomcat tomcat = new Tomcat();
  16. tomcat.setPort(8082);
  17. Context ctx = tomcat.addContext("/", new File(".").getAbsolutePath());
  18. Tomcat.addServlet(ctx, "Embedded", new HttpServlet() {
  19. @Override
  20. protected void service(HttpServletRequest req, HttpServletResponse resp)
  21. throws ServletException, IOException {
  22. Writer w = resp.getWriter();
  23. w.write("Embedded Tomcat servlet.\n");
  24. w.flush();
  25. w.close();
  26. }
  27. });
  28. ctx.addServletMapping("/*", "Embedded");
  29. tomcat.start();
  30. tomcat.getServer().await();
  31. }
  32. }

EmbeddedTomcatEx是 Java 控制台应用,其中包括嵌入式 Tomcat 服务器。

  1. Tomcat tomcat = new Tomcat();
  2. tomcat.setPort(8082);

Tomcat 在端口 8082 上启动。默认端口为 8080;默认端口为 8080。 NetBeans 将 8084 用于其内置的 Tomcat 服务器。 我们选择了另一个端口,以免发生冲突。

  1. Context ctx = tomcat.addContext("/", new File(".").getAbsolutePath());

每个应用都映射到上下文。 使用addContext()方法,我们创建了一个不支持 JSP 文件并且没有web.xml文件的应用。 我们使用根上下文路径和当前工作目录作为文档库。

  1. Tomcat.addServlet(ctx, "Embedded", new HttpServlet() {
  2. @Override
  3. protected void service(HttpServletRequest req, HttpServletResponse resp)
  4. throws ServletException, IOException {
  5. Writer w = resp.getWriter();
  6. w.write("Embedded Tomcat servlet.\n");
  7. w.flush();
  8. w.close();
  9. }
  10. });

通过addServlet()方法添加了一个新的 servlet。 该 servlet 仅以一些 ASCII 文本作为响应。

  1. ctx.addServletMapping("/*", "Embedded");

servlet 映射控制如何访问名为 Embedded 的 servlet。 对于我们的示例,所有 URL 最终都会调用我们的 servlet。

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

Tomcat 服务器已启动。

  1. $ curl localhost:8082/
  2. Embedded Tomcat servlet.

我们运行该应用并使用curl工具对其进行测试。

JSP 文件

在第二个示例中,我们使用嵌入式 Tomcat 服务器来提供 JSP 文件。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.zetcode</groupId>
  6. <artifactId>EmbeddedTomcatEx2</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <properties>
  10. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  11. <maven.compiler.source>1.8</maven.compiler.source>
  12. <maven.compiler.target>1.8</maven.compiler.target>
  13. <tomcat.version>9.0.0.M6</tomcat.version>
  14. </properties>
  15. <dependencies>
  16. <dependency>
  17. <groupId>javax.servlet</groupId>
  18. <artifactId>javax.servlet-api</artifactId>
  19. <version>3.1.0</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.apache.tomcat.embed</groupId>
  23. <artifactId>tomcat-embed-core</artifactId>
  24. <version>${tomcat.version}</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.apache.tomcat.embed</groupId>
  28. <artifactId>tomcat-embed-logging-juli</artifactId>
  29. <version>${tomcat.version}</version>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.apache.tomcat</groupId>
  33. <artifactId>tomcat-jasper</artifactId>
  34. <version>${tomcat.version}</version>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.apache.tomcat</groupId>
  38. <artifactId>tomcat-jasper-el</artifactId>
  39. <version>${tomcat.version}</version>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.apache.tomcat</groupId>
  43. <artifactId>tomcat-jsp-api</artifactId>
  44. <version>${tomcat.version}</version>
  45. </dependency>
  46. </dependencies>
  47. <build>
  48. <plugins>
  49. <plugin>
  50. <groupId>org.codehaus.mojo</groupId>
  51. <artifactId>appassembler-maven-plugin</artifactId>
  52. <version>1.1.1</version>
  53. <configuration>
  54. <assembleDirectory>target</assembleDirectory>
  55. <programs>
  56. <program>
  57. <mainClass>com.zetcode.embedded.EmbeddedTomcatEx2</mainClass>
  58. <name>webapp</name>
  59. </program>
  60. </programs>
  61. </configuration>
  62. <executions>
  63. <execution>
  64. <phase>package</phase>
  65. <goals>
  66. <goal>assemble</goal>
  67. </goals>
  68. </execution>
  69. </executions>
  70. </plugin>
  71. </plugins>
  72. </build>
  73. <name>EmbeddedTomcatEx2</name>
  74. </project>

在此pom.xml文件中,我们还包括嵌入式 Tomcat JSP 容器的依赖项:tomcat-jaspertomcat-jasper-eltomcat-jsp-api

index.jsp

  1. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>JSP file</title>
  6. <meta charset="UTF-8">
  7. </head>
  8. <body>
  9. <p>
  10. This is a simple JSP file.
  11. </p>
  12. </body>
  13. </html>

这是嵌入式 Tomcat 服务器提供的简单 JSP 文件。

EmbeddedTomcatEx2.java

  1. package com.zetcode.embedded;
  2. import javax.servlet.ServletException;
  3. import java.io.File;
  4. import org.apache.catalina.LifecycleException;
  5. import org.apache.catalina.startup.Tomcat;
  6. public class EmbeddedTomcatEx2 {
  7. public static void main(String[] args) throws LifecycleException,
  8. InterruptedException, ServletException {
  9. String docBase = "src/main/webapp/";
  10. Tomcat tomcat = new Tomcat();
  11. tomcat.setPort(8082);
  12. tomcat.addWebapp("/", new File(docBase).getAbsolutePath());
  13. tomcat.start();
  14. tomcat.getServer().await();
  15. }
  16. }

该应用提供一个 JSP 文件。 该文件位于src/main/webapp子目录中。

  1. tomcat.addWebapp("/", new File(docBase).getAbsolutePath());

这次我们使用addWebapp()将应用添加到 Tomcat 服务器。

  1. $ curl localhost:8082/
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>JSP file</title>
  6. <meta charset="UTF-8">
  7. </head>
  8. <body>
  9. <p>
  10. This is a simple JSP file.
  11. </p>
  12. </body>
  13. </html>

当我们访问应用时,我们得到了这个。

这是嵌入式 Tomcat 教程。 使用嵌入式 Tomcat,我们提供了一个 servlet 和一个 JSP 文件。 我们已经使用了 Apache Tomcat,Maven 和 NetBeans。 您可能还需要查看一些相关的教程:嵌入式 Jetty 的 Jersey 应用Jetty 教程Java 教程SQL 查询标记教程