专栏首页Java程序员的技能宝典Tomcat是一个Servlet容器?
原创

Tomcat是一个Servlet容器?

“Tomcat是一个Servlet容器”,这句话对于2019年的程序员应该是耳熟能详的。

单纯的思考一下这句话,我们可以抽象出来这么一段代码:

class Tomcat {
    List<Servlet> sers;
}

如果Tomcat就长这样,那么它肯定是不能工作的,所以,Tomcat其实是这样:

class Tomcat {
    Connector connector; // 连接处理器
    List<Servlet> sers;
}

我们这里先不考虑Connector的底层实现,我们只需知道Connector是负责处理请求的。

我们还是来想想容器

Context

顾名思义,Servlet容器就是用来装载存储Servlet的。

一个Servlet表示一个运行在服务端的程序(servlet = server + applet)。用户想要使用这种程序,需要向该程序发送请求以及获取该程序的响应,也就是Servlet规范中的ServletRequest、ServletResponse。

所以Servlet其实就是Java中用来处理请求的一种规范,所以我们的项目中通常都会有一个或多个Servlet,由它来负责接收请求,或者将请求转交给其他业务逻辑。

所以我们的Spring MVC、Spring Boot都存在一个DispatcherServlet(类似功能的一个Servlet,负责接收请求)。

所以,通常Servlet是属于一个应用程序(项目)的,换句话说,我们的一个应用包含多个Servlet,所以这是第二层Servlet容器--应用,也就是Tomcat中的Context(应用上下文)。那么第一层Servlet容器呢?

Wrapper

Wrapper就是第一层Servlet容器,Wrapper表示Servlet的包装者,所以它是最接近Servlet的,那么为什么需要Wrapper呢?

我们通常认为Wrapper是这样的:

class Wrapper {
    Servlet servlet;
}

一个Wrapper对应一个Servlet,这么来想的话,确实不需要Wrapper,但是我们还要考虑一些其他的情况:

  • 比如Filter,一个Filter是可以对应一个Servlet的。
  • 比如ServletPool,通常的Servlet是所有请求线程公用的,但是在Servlet中支持每一个请求线程单独使用独立的Servlet实例。

所以在Wrapper中,不仅仅只包括一个Servlet,还包括过滤器和Servlet池,所以Wrapper是第一层Servlet容器

Host

在我们现实生活中,一个应用都是部署在一个主机上的,所以,一个主机可以包含多个应用,一个应用包含多个Servlet,所以,Host是第三层容器。

在Tomcat中,Host表示虚拟主机,Tomcat在处理请求时,可以根据请求的域名进入到相应的Host中进行处理。

Engine

Host管理Context,Context管理Wrapper,Wrapper管理Servlet,而Engine就是用来管理Host的。所以Engine是第四层容器。

最后

肯定有人有疑问,那么Engine之上不需要容器了吗?不需要了?举个例子:

我们的钱(Servlet)要放在钱包(Wrapper)里,钱包要放在书包(Context)里,书包要放在行李箱(Host)里,行李箱要放在飞机(Engine)上。

所以,如果你问我“Engine放哪?”就相当于问我“飞机放哪?”

答案是不再需要更高层次的容器了,因为没有必要了

总结

在Tomcat中,容器分为:

  1. Wrapper
  2. Context
  3. Host
  4. Engine

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 程序员一定要明白的架构:三地五中心(1)

    科技圈最火的新闻应该是“AWS中国区光缆被挖,导致三星、小米等众多企业服务不可用”。 又是光缆被挖,咦!?为什么是又,让我们来一起回到过去:

    秃顶的Java程序员
  • Java程序员11面阿里,错失offer,期间还面了EMC+网易+美团......

    一直在面阿里,从提前批投蚂蚁中间件与阿里中间件,最后阿里中间件面完了hr,但是很遗憾最后没能进,被调到了盒马。不过最终还是拿到了盒马的offer。期间还面了EM...

    秃顶的Java程序员
  • Zookeeper如何解决脑裂问题?

    脑裂(split-brain)就是“大脑分裂”,也就是本来一个“大脑”被拆分了两个或多个“大脑”,我们都知道,如果一个人有多个大脑,并且相互独立的话,那么会导致...

    秃顶的Java程序员
  • 自己动手写Web服务器(二)简单的Servlet服务器

    在前一篇文章中,通过学习《How Tomcat Works》这本书,我们实现了简单的静态WEB服务器,今天继续复习下一篇,实现一个简单的Servlet服务器。

    the5fire
  • Servlet学习补充

    黑泽君
  • 走进JavaWeb技术世界4:Servlet 工作原理详解

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    Java技术江湖
  • 走进JavaWeb技术世界4:Servlet 工作原理详解

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    Java技术江湖
  • servlet 小知识

    浏览器发送一个HTTP请求,HTTP请求由Web容器分配给特定的Servlet进行处理,Servlet的本质是一个Java对象,这个对象拥有一系列的方法来处理H...

    千往
  • JavaWeb(四)Servlet-1

    leeqico
  • 创建Servlet实例1 创建 Servlet 对象2 初始化 Servlet

    JavaEdge

扫码关注云+社区

领取腾讯云代金券