# 嵌入式 Tomcat

> 原文： [https://zetcode.com/web/embeddedtomcat/](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。

![Project structure](img/10f2db6dd9d6014848878a2724eb74cf.jpg)

图：项目结构

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

`pom.xml`

```java
<?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 服务器和用于构建应用的汇编程序插件的依赖项。 由于我们只有 Servlet，因此 JSP 容器的依赖关系未包含在此应用中。

`EmbeddedTomcatEx.java`

```java
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 服务器。

```java
Tomcat tomcat = new Tomcat();
tomcat.setPort(8082);

```

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

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

```

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

```java
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 文本作为响应。

```java
ctx.addServletMapping("/*", "Embedded");

```

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

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

```

Tomcat 服务器已启动。

```java
$ curl localhost:8082/
Embedded Tomcat servlet.

```

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

## JSP 文件

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

`pom.xml`

```java
<?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`。

`index.jsp`

```java
<%@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>

```

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

`EmbeddedTomcatEx2.java`

```java
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`子目录中。

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

```

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

```java
$ 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 应用](/articles/jerseyembeddedjetty/)， [Jetty 教程](/java/jetty/)， [Java 教程](/lang/java/)或 [SQL 查询标记教程](/java/sqlquerytag/)。