在上一节中,我们讨论了一个完整的Web应用程序的开发流程,包括编写Servlet、打包为WAR文件、部署到Tomcat的webapps目录下以及启动Tomcat。但这个过程相对繁琐,特别是在开发过程中,我们需要频繁地启动Tomcat,进行调试和测试。如何简化这一过程,直接在IDE中调试Servlet代码呢?本篇教程将介绍如何使用嵌入式Tomcat来启动和调试Web应用程序,避免繁琐的手动部署过程。

1. 为什么选择嵌入式Tomcat?

通常情况下,我们需要手动设置Tomcat环境,将WAR包部署到Tomcat的webapps目录,然后启动Tomcat。这个过程不仅繁琐,而且如果我们想要在IDE中进行断点调试,还需要打开Tomcat的远程调试端口并连接。为了简化这个过程,我们可以使用嵌入式Tomcat。嵌入式Tomcat将Tomcat作为Java程序的一部分,可以直接在IDE中启动,进行调试,并且不依赖外部的Tomcat服务器。

2. 嵌入式Tomcat的原理

Tomcat本质上是一个Java程序,启动流程如下:

  1. 启动JVM并执行Tomcat的main()方法;

  2. 加载WAR文件并初始化Servlet;

  3. 启动Tomcat服务。

 

我们可以通过创建一个Java项目,使用嵌入式Tomcat来直接在IDE中启动并调试Web应用程序。

3. 配置项目

3.1 创建Maven项目

首先,创建一个Maven项目,编写pom.xml文件如下:

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.itranswarp.learnjava</groupId>    <artifactId>web-servlet-embedded</artifactId>    <version>1.0-SNAPSHOT</version>    <packaging>war</packaging>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>        <maven.compiler.source>17</maven.compiler.source>        <maven.compiler.target>17</maven.compiler.target>        <java.version>17</java.version>        <tomcat.version>10.1.1</tomcat.version>    </properties>    <dependencies>        <dependency>            <groupId>org.apache.tomcat.embed</groupId>            <artifactId>tomcat-embed-core</artifactId>            <version>${tomcat.version}</version>            <scope>provided</scope>        </dependency>        <dependency>            <groupId>org.apache.tomcat.embed</groupId>            <artifactId>tomcat-embed-jasper</artifactId>            <version>${tomcat.version}</version>            <scope>provided</scope>        </dependency>    </dependencies></project>

 

在这个配置中,我们引入了嵌入式Tomcat的核心依赖tomcat-embed-coretomcat-embed-jasper,并将packaging类型设置为war,以便后续打包为WAR文件。

3.2 编写Servlet代码

在项目中创建一个简单的Servlet,代码如下:

java@WebServlet(urlPatterns = "/")public class HelloServlet extends HttpServlet {    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        resp.setContentType("text/html");        String name = req.getParameter("name");        if (name == null) {            name = "world";        }        PrintWriter pw = resp.getWriter();        pw.write("<h1>Hello, " + name + "!</h1>");        pw.flush();    }}

 

这是一个简单的HelloServlet,它根据请求中的name参数返回不同的问候语。

3.3 启动Tomcat

接下来,我们创建一个main()方法来启动Tomcat服务器,代码如下:

javapublic class Main {    public static void main(String[] args) throws Exception {        // 启动Tomcat:        Tomcat tomcat = new Tomcat();        tomcat.setPort(Integer.getInteger("port", 8080));        tomcat.getConnector();        // 创建webapp:        Context ctx = tomcat.addWebapp("", new File("src/main/webapp").getAbsolutePath());        WebResourceRoot resources = new StandardRoot(ctx);        resources.addPreResources(                new DirResourceSet(resources, "/WEB-INF/classes", new File("target/classes").getAbsolutePath(), "/"));        ctx.setResources(resources);        tomcat.start();        tomcat.getServer().await();    }}

 

main()方法中,我们通过Tomcat对象启动了嵌入式Tomcat服务器,并指定了webapp的路径。通过这种方式,我们可以直接在IDE中启动Tomcat,而不需要外部的Tomcat服务器。

4. 调试和测试

通过上述配置,我们可以直接在IDE中运行Main类,启动Tomcat服务器,并且在浏览器中访问http://localhost:8080/,即可看到我们编写的Servlet返回的内容。

5. 生成可执行WAR包

如果你希望将应用打包为可执行的WAR包,使用命令java -jar hello.war启动Tomcat,可以按照以下步骤进行配置:

5.1 配置maven-war-plugin

pom.xml文件中,配置maven-war-plugin,以便生成可执行的WAR包:

xml<build>    <finalName>hello</finalName>    <plugins>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-war-plugin</artifactId>            <version>3.3.2</version>            <configuration>                <!-- 复制classes到war包根目录 -->                <webResources>                    <resource>                        <directory>${project.build.directory}/classes</directory>                    </resource>                </webResources>                <archiveClasses>true</archiveClasses>                <archive>                    <manifest>                        <!-- 添加Class-Path -->                        <addClasspath>true</addClasspath>                        <!-- Classpath前缀 -->                        <classpathPrefix>tmp-webapp/WEB-INF/lib/</classpathPrefix>                        <!-- main启动类 -->                        <mainClass>com.itranswarp.learnjava.Main</mainClass>                    </manifest>                </archive>            </configuration>        </plugin>    </plugins></build>

 

5.2 调整WAR包结构

生成的WAR包结构如下:

vbnethello.war├── META-INF│   ├── MANIFEST.MF│   └── maven├── WEB-INF│   ├── classes│   ├── lib│   └── web.xml└── com    └── itranswarp        └── learnjava            ├── Main.class            └── servlet                └── HelloServlet.class

 

5.3 通过命令行启动WAR包

通过java -jar hello.war启动应用时,JVM会首先运行Main类,自动解压WAR包并启动Tomcat服务器。

6. 小结

使用嵌入式Tomcat来启动和调试Web应用程序,能够极大地简化开发和调试过程。通过配置Maven项目并创建main()方法,我们可以在IDE中轻松启动嵌入式Tomcat服务器,而无需依赖外部的Tomcat环境。此外,通过Maven打包WAR文件后,我们也可以生成可执行的WAR包,并在命令行中启动。

这种方式适用于日常开发调试,特别是在需要快速测试和迭代的过程中,能够提升开发效率。


 

练习:使用嵌入式Tomcat运行一个简单的Servlet,测试并调试应用。

 

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐