练习 - 创建简单的 Tomcat Java Web 应用

已完成

Web 应用程序通常用于处理实际任务,例如库存管理、联机表单和面向客户的门户。 在本模块中,你将了解如何使用常用的开源服务器 Apache Tomcat 创建和部署 Java Web 应用程序。

假设你是一名开发人员,正在处理一个项目来构建动态 Web 应用程序,用户可以在其中输入数据并与平台实时交互。 客户端希望此应用可在本地进行测试,并在云中轻松访问。 通过此设置,可以先在本地计算机上进行测试,然后作为无缝转换部署到实时环境。 从头开始构建此设置可让你灵活地进行将来的更新和配置。

在本模块中,你将了解使用 Tomcat 生成和部署 Java Web 应用的基本步骤。 有两个选项:克隆现有项目存储库以供立即部署,或使用 Maven 从头开始生成新项目。 本模块介绍如何设置 Maven 项目、配置 Tomcat、在本地部署应用,以及使用 Maven 等工具来管理依赖项和包。

在本模块结束时,你将能够在 Tomcat 上创建和部署基于 Java 的 Web 应用程序,并准备在本地和云托管环境中支持 Web 应用程序部署。

创建 Java Tomcat Web 应用

在本练习中,你将创建一个采用输入并在屏幕上显示结果的最小 Java Web 应用程序。 然后使用 Tomcat 在计算机上本地部署 Web 应用。 你有以下两种选择:

  • 选项 1:克隆示例存储库并立即部署 Web 应用。
  • 选项 2:从头开始创建 Maven Tomcat 项目。

选项 1:克隆示例存储库并立即部署 Web 应用

若要克隆存储库,请使用以下步骤:

  1. 使用以下命令克隆示例项目存储库:

    git clone https://github.com/MicrosoftDocs/simple-tomcat-maven-app.git
    
    
  2. 使用以下命令导航到克隆的项目存储库:

    cd simple-tomcat-app
    

使用以下步骤配置本地 Tomcat 服务器,以便在本地部署到 Tomcat:

警告

直接将用户名和密码存储在配置文件(如 tomcat-users.xml 和 Maven 的纯文本 settings.xml )中并不被视为安全,我们通常不建议这样做,尤其是对于生产环境。 但是,其他替代方法不在此训练模块的范围内。 不要使用真正的用户名和密码!

  1. 编辑 Tomcat 配置文件 conf/tomcat-users.xml ,使其如以下示例所示:

    <tomcat-users>
        <user username="your-tomcat-username" password="your-tomcat-password" roles="manager-script"/>
    </tomcat-users>
    
  2. 使用以下示例将您的凭据添加到 Maven ~/.m2/settings.xml 文件中,其中用一个用户名替换 your-tomcat-username,用一个密码替换 your-tomcat-password

    <servers>
        <server>
            <id>TomcatServer</id>
            <username>your-tomcat-username</username>
            <password>your-tomcat-password</password>
        </server>
    </servers>
    
  3. 使用以下命令打包和部署 Web 应用:

    mvn clean package cargo:deploy
    

部署后,可以在以下位置 http://localhost:8080/simple-tomcat-app访问应用。

选项 2:从头开始创建 Maven Tomcat 项目

若要从头开始创建 Maven Tomcat 项目,请完成多个过程,从创建 Maven 项目开始,最后将 Web 应用部署到 Tomcat。

创建 Maven 项目

若要为 Java Web 应用程序创建 Maven 项目,请使用以下命令:

mvn archetype:generate \
    -DgroupId=com.example \
    -DartifactId=simple-tomcat-app \
    -DarchetypeArtifactId=maven-archetype-webapp \
    -DinteractiveMode=false

以下输出是典型的:

[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /home/XXXXXXXX/LearnProjects/simple-tomcat-maven-app
[INFO] Parameter: package, Value: com.microsoft.azure.samples
[INFO] Parameter: groupId, Value: com.microsoft.azure.samples
[INFO] Parameter: artifactId, Value: azure-javaweb-app-simple
[INFO] Parameter: packageName, Value: com.microsoft.azure.samples
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /private/tmp/TMP/azure-javaweb-app
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.657 s
[INFO] Finished at: 2024-10-18T12:39:41-07:00
[INFO] ------------------------------------------------------------------------

现在,你在名为 simple-tomcat-app 的文件夹中有了一个新的 Maven Web 项目。 目前提供下列文件和目录:

└── simple-tomcat-app
    ├── pom.xml
    └── src
        ├── main
        │   ├── java
        │   ├── resources
        │   └── webapp
        │       ├── index.jsp
        │       └── WEB-INF
        │           └── web.xml
        └── test
            ├── java
            └── resources

修改 Maven pom.xml 文件

使用以下步骤修改 pom.xml 文件:

  1. 打开 pom.xml 并使用以下示例将 Java 版本设置为 21:

    <java.version>21</java.version>
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
    
  2. 使用以下示例添加 Tomcat 和 Azure 部署插件:

    <!-- Tomcat 10 Maven Plugin -->
    <plugin>
      <groupId>org.codehaus.cargo</groupId>
      <artifactId>cargo-maven3-plugin</artifactId>
      <version>1.9.9</version>
      <configuration>
        <!-- Container Configuration -->
        <container>
          <containerId>tomcat10x</containerId>
          <type>remote</type>
        </container>
        <!-- Configuration for Remote Deployment -->
        <configuration>
          <type>runtime</type>
          <properties>
            <cargo.remote.uri>http://localhost:8080/manager/text</cargo.remote.uri>
            <cargo.remote.username>cargo</cargo.remote.username>
            <cargo.remote.password>your-cargo-password</cargo.remote.password>
          </properties>
        </configuration>
        <!-- Deployable Artifact Configuration -->
        <deployables>
          <deployable>
            <groupId>${project.groupId}</groupId>
            <artifactId>${project.artifactId}</artifactId>
            <type>war</type>
            <properties>
              <context>${project.artifactId}</context>
            </properties>
          </deployable>
        </deployables>
      </configuration>
    </plugin>
    

下面是 pom.xml 文件的完整内容:

<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.example</groupId>
  <artifactId>simple-tomcat-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>simple-tomcat-app</name>
  <properties>
    <java.version>21</java.version>
    <maven.compiler.source>21</maven.compiler.source>
    <maven.compiler.target>21</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>6.0.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>simple-tomcat-app</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.10.1</version>
        <configuration>
          <source>${java.version}</source>
          <target>${java.version}</target>
        </configuration>
      </plugin>
      <!-- Tomcat 10 Maven Plugin -->
      <plugin>
        <groupId>org.codehaus.cargo</groupId>
        <artifactId>cargo-maven3-plugin</artifactId>
        <version>1.9.9</version>
        <configuration>
          <!-- Container Configuration -->
          <container>
            <containerId>tomcat10x</containerId>
            <type>remote</type>
          </container>
          <!-- Configuration for Remote Deployment -->
          <configuration>
            <type>runtime</type>
            <properties>
              <cargo.remote.uri>http://localhost:8080/manager/text</cargo.remote.uri>
              <cargo.remote.username>cargo</cargo.remote.username>
              <cargo.remote.password>your-cargo-password</cargo.remote.password>
            </properties>
          </configuration>
          <!-- Deployable Artifact Configuration -->
          <deployables>
            <deployable>
              <groupId>${project.groupId}</groupId>
              <artifactId>${project.artifactId}</artifactId>
              <type>war</type>
              <properties>
                <context>${project.artifactId}</context>
              </properties>
            </deployable>
          </deployables>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

创建 Web 界面

若要添加网页,请使用以下示例编辑 src/main/webapp/index.jsp 文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Simple Tomcat App</title>
</head>
<body>
    <h1>Welcome to the Simple Tomcat App</h1>
    <form action="hello" method="get">
        <label for="name">Enter your name:</label>
        <input type="text" id="name" name="name">
        <button type="submit">Submit</button>
    </form>
</body>
</html>

创建 servlet

servlet 是一个 Java 编程类,用于通过处理请求和生成动态内容来扩展服务器的功能。 Servlet 在 Web 容器(如 Apache Tomcat)的服务器端运行,主要用于处理 Web 应用程序中的 HTTP 请求。 当客户端(例如 Web 浏览器)向 Web 服务器发送请求时,servlet 将处理请求。 servlet 执行任何必要的业务逻辑(例如,访问数据库或调用其他服务),然后生成响应(通常采用 HTML 形式)以发送回客户端。 借助 Servlet,开发人员可以使用 Java 创建与平台无关的动态 Web 应用程序。

若要创建 servlet,请使用以下步骤:

  1. 使用以下命令更新文件结构以添加 servlet:

    mkdir -p src/main/java/com/example && touch src/main/java/com/example/HelloServlet.java
    
  2. 使用以下代码示例更新 HelloSeverlet.java 文件的内容:

    package com.example;
    
    import jakarta.servlet.ServletException;
    import jakarta.servlet.annotation.WebServlet;
    import jakarta.servlet.http.HttpServlet;
    import jakarta.servlet.http.HttpServletRequest;
    import jakarta.servlet.http.HttpServletResponse;
    
    import java.io.IOException;
    
    @WebServlet("/hello")
    public class HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String name = request.getParameter("name");
            response.setContentType("text/html");
            response.getWriter().write("<h1>Hello, " + name + "!</h1>");
        }
    }
    

新文件结构如下所示:

└── simple-tomcat-app
    ├── pom.xml
    └── src
        ├── main
        │   ├── java
        │   │   └── com
        │   │       └── example
        │   │           └── HelloServlet.java
        │   ├── resources
        │   └── webapp
        │       ├── index.jsp
        │       └── WEB-INF
        │           └── web.xml
        └── test
            ├── java
            └── resources

在本地将应用部署到 Tomcat

使用以下步骤配置本地 Tomcat 服务器,以便可以部署到该服务器:

警告

直接将用户名和密码存储在配置文件(如 tomcat-users.xml 和 Maven 的纯文本 settings.xml )中是不安全的,通常不建议使用,尤其是在生产环境中。 但是,其他替代方法不在此训练模块的范围内。 不要使用真正的用户名和密码!

  1. 使用以下示例编辑 Tomcat 配置文件 conf/tomcat-users.xml

    <tomcat-users>
        <user username="your-tomcat-username" password="your-tomcat-password" roles="manager-script"/>
    </tomcat-users>
    
  2. 使用以下示例将凭据添加到 Maven 的 ~/.m2/settings.xml 文件,并将其 your-tomcat-username 替换为用户名和密码 your-tomcat-password

    <servers>
        <server>
            <id>TomcatServer</id>
            <username>your-tomcat-username</username>
            <password>your-tomcat-password</password>
        </server>
    </servers>
    

将 Web 应用部署到 Tomcat

使用以下命令打包和部署 Web 应用:

mvn clean package cargo:deploy

部署之后,你的应用将在 http://localhost:8080/simple-tomcat-app 上可用。