Tomcat嵌入式开发 (二) 嵌入式启动Tomcat


简介

本文使用最新的Tomcat9.0.29版本进行开发,也是借鉴了网上一些Tomcat8/7版本的嵌入式开发代码(资料好少,得自己慢慢踩坑)

下载Tomcat嵌入式开发jar包

打开Tomcat9下载网址https://tomcat.apache.org/download-90.cgi

图片中使用红框圈起来的就是Tomcat嵌入式开发所需要的基础jar,当然可以去Maven官网搜索相应jar并引入到Maven项目的pom.xml中

pom.xml

<properties>
        <maven_version>9.0.29</maven_version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>${maven_version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <version>${maven_version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-el</artifactId>
            <version>${maven_version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-websocket</artifactId>
            <version>${maven_version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>
    </dependencies>


Tomcat.class

这个类用于嵌入式开发程序,也就是说它是我们启动Tomcat的入口。

  1. 所有servlet或者Tomcat相关的类都需要在Tomcat.class中注册
  2. 需要配置Tomcat的工作目录
  3. Tomcat9可以不使用配置文件启动(比如web.xml),当然你同样可以选择使用配置文件启动Tomcat,这是可选择的

启动Tomcat

首先我们需要了解Tomcat启动所需的最基础配置,就像刚学java的时候一样,先System.out.println("Hello World"); (滑稽)


Host

Host配置了Tomcat启动相关的主机参数,比如主机名(ip)、端口、热加载等等

Tomcat tomcat = new Tomcat();
tomcat.getHost()

​ 首先实例化一个Tomcat,然后直接获取Host,注意这里是可以直接获取且host !=null ,接下来看看getHost()方法的源码,我们可以看到,方法先获取Engine字段,如果engine.findChildren()返回值为空的话则实例化一个Host,并且设置name=“localhost”。

​ Host是一个interface,而它的实现类为StandardHost,该类中配备了一些默认的启动参数,有兴趣的可以点击该类的源码查看。


protected String hostname = "localhost";

public Host getHost() {
        Engine engine = this.getEngine();
        if (engine.findChildren().length > 0) {
            return (Host)engine.findChildren()[0];
        } else {
            Host host = new StandardHost();
            host.setName(this.hostname);
            this.getEngine().addChild(host);
            return host;
        }
    }

接下来我们需要创建一个StandardContext,这个类实现了Context接口,Context接口主要处理Servlet的各类请求

  1. setPath:设置访问路径的前缀
  2. addLifecycleListener:添加一个监听器

Tomcat.FixContextListener() 该监听器在不使用web.xml时为必须项

Tomcat.DefaultWebXmlListener() 该监听器会获取一些已配置好的设置,适用于程序化配置

Tomcat.ExistingStandardWrapper(Servlet existing) 该监听器使用自定义的Servlet,增强对Servlet的控制

紧接着我们把context添加到host中

StandardContext context = new StandardContext();
context.setPath("/test");
context.addLifecycleListener(new Tomcat.FixContextListener());
tomcat.getHost().addChild(context);


Connector

​ Connector用于Tomcat配置网络连接,比如设置端口号、限制post请求提交最大大小、请求超时时间等等。我们这里暂时只做最小化配置(配置端口号即可),后续配置将在之后的文章提及~敬请关注~

Connector connector = new Connector();
connector.setPort(8888);
tomcat.setConnector(connector);


添加Servlet映射

首先创建一个HelloServlet类继承HttpServlet,在doPost方法的response写入“Hello World~~~”

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().print("Hello World~~~");
    }
}

然后我们将该servlet添加到Tomcat容器中,addServletMappingDecoded添加资源路径映射,也就是我们输入localhost:8888/hello会调用我们写好的HelloServlet类。

注意:“/hello”此处是一个匹配表达式,如果将“/hello”替换为“/hello/*”,则在/hello以及其路径下的所有请求都会跳转到HelloServlet,比如“/hello/132”、“/hello/abc/asd”

tomcat.addServlet(CONTEXT_PATH, "helloServlet", new HelloServlet());
context.addServletMappingDecoded("/hello","helloServlet");


启动Tomcat

tomcat.start()的启动是异步的,并不会阻碍线程

tomcat.start();

启动之后我们可以看一下日志,注意日志最后一行,表明了日志已经正常启动

12月 10, 2019 12:37:13 下午 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["http-nio-8888"]
12月 10, 2019 12:37:13 下午 org.apache.catalina.core.StandardService startInternal
信息: Starting service [Tomcat]
12月 10, 2019 12:37:13 下午 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet engine: [Apache Tomcat/9.0.29]
12月 10, 2019 12:37:14 下午 org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom
警告: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [241] milliseconds.
12月 10, 2019 12:37:14 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-nio-8888"]

接着在postman或者浏览器上输入localhost:8888/hello,我们就可以看到预期的返回结果啦~


声明:海苔Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - Tomcat嵌入式开发 (二) 嵌入式启动Tomcat


海苔胖胖是胖还是不胖呢