由浅入深!Tomcat长生不老之术——嵌入式复习指南

作者:享学课堂King老师

转载请声明出处!

前言

Tomcat是一个非常流行的Web服务器,用于部署和运行Java Web应用程序。一般情况下,我们都是在单独的Tomcat实例上运行自己的Web应用,其实与这种经典方案相比,我们可以将服务器运行时直接集成到应用程序中,从而更加的灵活和方便。

嵌入式Tomcat的Maven依赖

要使用嵌入式Tomcat并将其运行时与Java Web应用程序打包,请在Maven的pom.xml 文件中添加以下依赖项

<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-jasper</artifactId>
    <version>${tomcat.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-logging-juli</artifactId>
    <version>${tomcat.version}</version>
</dependency>

其中 tomcat.version 是指向Tomcat实际版本的属性

<properties>
    <tomcat.version>8.0.48</tomcat.version>
</properties>

Tomcat嵌入式实例

核心类是org.apache.catalina.startup.Tomcat

例如,以下代码创建并启动在端口号8082上运行的嵌入式Tomcat实例

package com.xiangxue.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();
    }
}

下面我们分段解释以上代码的作用:

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

Tomcat在端口8082上启动

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中使用流响应一些文本。

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

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

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

最后Tomcat服务器启动。

服务器正在侦听端口8082,因此在Web浏览器中键入以下URL:

http://localhost:8082/

你就可以看到对应的效果
在这里插入图片描述

总结

基本上,我们用到嵌入式Tomcat主要有以下的目的:

1)对Java组件等Web组件进行快速单元测试

可以使用嵌入式Tomcat自动进行单元测试,而不是启动/停止Tomcat服务器并打开Web浏览器进行手动单元测试。

2)将Java Web应用程序作为独立的Java应用程序提供

最终用户现在可以运行JAR文件,该文件启动托管Web应用程序的嵌入式服务器。无需下载和安装Tomcat并手动部署Web应用程序。

3)对Tomcat更好的控制

集成嵌入式服务器使您能够以更好地控制服务器,从代码上控制服务器,并自动执行自行预订的步骤。

并且现在流行的SpringBoot架构中直接使用Main方法启动一个也是使用以上的方式实现,只是在实现中用到了更多的嵌入式Tomcat的相关的配置和参数。

最后

文章中涉及到的知识点我都已经整理成了资料,录制了视频供大家下载学习,免费分享,诚意满满,希望可以帮助在这个行业发展的朋友,在论坛博客等地方少花些时间找资料,把有限的时间,真正花在学习上,所以我把这些资料,分享出来。相信对于已经工作和遇到技术瓶颈的朋友们,在这份资料中一定都有你需要的内容。

资料免费获取方式:点击这里免费领取Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料

片转存中…(img-4s2P2iim-1623502279986)]

资料免费获取方式:点击这里免费领取Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值