Tomcat容器

Posted walterlee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat容器相关的知识,希望对你有一定的参考价值。

前言

1. 本系列文章基于 Tomcat9
2. 前置知识:servlet

定义

先来看看容器的定义,Tomcat 源码注释如下:

/**
 * A <b>Container</b> is an object that can execute requests received from
 * a client, and return responses based on those requests.  A Container may
 * optionally support a pipeline of Valves that process the request in an
 * order configured at runtime, by implementing the <b>Pipeline</b> interface
 * as well.
 * .....
 */

简单说就是执行客户端的 request,并返回 response。

Tomcat容器关系

技术图片

这四种容器含义如下:

  • Wrapper:Servlet 的包装,为什么要包装呢?留个坑以后再写
  • Context:表示一个 web 应用,是 Wrapper 的容器
  • Host:表示一个虚拟主机,一个虚拟机下可以有多个 Context
  • Engine:用来管理多个虚拟主机

那这些容器如何组合在一起的呢? 这些接口都继承了 Container 接口,有设置父容器、子容器的方法

public interface Container extends Lifecycle {
    public void setName(String name);
    public Container getParent();
    public void setParent(Container container);
    public void addChild(Container child);
    public void removeChild(Container child);
    public Container findChild(String name);
}

每个容器都维护着自己的父子容器

 protected final HashMap<String, Container> children = new HashMap<>();
 protected Container parent = null;
如何定位请求的 Servlet

Mapper 类负责 Url 和 servlet 之间的映射,具体过程可以看 Mapper.map()

生命周期管理 - LifeCycle

LifeCycle 抽象了组件的生命周期,父容器驱动子容器,达到了一键式启停。做到了统一的管理、方便的调用,同时代码逻辑清晰易懂,值得学习。
下面是 LifeCycle 的接口的方法:

public void init() throws LifecycleException;
public void start() throws LifecycleException;
public void stop() throws LifecycleException;
public void destroy() throws LifecycleException;

public LifecycleState getState();
public String getStateName();

public void addLifecycleListener(LifecycleListener listener);
public void removeLifecycleListener(LifecycleListener listener);
public LifecycleListener[] findLifecycleListeners();

/** 下面是生命周期事件,用于扩展生命周期对应的操作*/
BEFORE_INIT_EVENT
AFTER_INIT_EVENT
START_EVENT
BEFORE_START_EVENT
AFTER_START_EVENT
STOP_EVENT
BEFORE_STOP_EVENT
AFTER_STOP_EVENT
AFTER_DESTROY_EVENT
BEFORE_DESTROY_EVENT
PERIODIC_EVENT
CONFIGURE_START_EVENT
CONFIGURE_STOP_EVENT

Reference

Tomcat系统架构(下):聊聊多层容器的设计



以上是关于Tomcat容器的主要内容,如果未能解决你的问题,请参考以下文章

如何阅读Tomcat源代码?

将Android片段移动到不同的容器无法更改片段的容器ID

mysql jdbc源码分析片段 和 Tomcat's JDBC Pool

tomcat web容器工作原理

JSP学习 —— 开篇:JSP,servlet容器,Tomcat,servlet容器之间的关系

如何在 Android 中的特定片段容器中显示片段