“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

推荐阅读

金三银四季,阿里工作10多年Java大牛的“心得”,献给迷茫中的你

Tomcat是一个Servlet容器?相关推荐

  1. Spring boot配置嵌入式Servlet容器

    Servlet容器 项目,打成war包,放在Tomcat启动 Tomcat就是一个Servlet容器 Spring boot 默认的嵌入了Servlet容器Tomcat 打开项目pom文件 右键Dia ...

  2. Servlet 容器和 Web 服务器的区别

    目录 1.什么是Web服务器? 2.什么是Servlet容器? 3.Servlet 容器与Web服务器的区别和联系 1.什么是Web服务器? Web 服务器是一种提供 Web 服务的软件,主要用于接收 ...

  3. 探秘Tomcat——一个简易的Servlet容器

    即便再简陋的服务器也是服务器,今天就来循着书本的第二章来看看如何实现一个servlet容器. 背景知识 既然说到servlet容器这个名词,我们首先要了解它到底是什么. servlet 相比你或多或少 ...

  4. tomcat(5)servlet容器

    [0]README 0.0)本文部分文字描述转自:"深入剖析tomcat",旨在学习 tomcat(5)servlet容器 的基础知识: 0.1)intro to servlet容 ...

  5. tomcat(5)servlet容器(lastest version)

    [0]README 0.0)本文部分文字描述转自:"深入剖析tomcat",旨在学习 tomcat(5)servlet容器 的基础知识: 0.1)intro to servlet容 ...

  6. 初学Java Web(3)——第一个Servlet

    这学期 Java Web 课程的第一节课就简短复习了一下 Java 的一些基础知识,所以觉得 Java 的基础知识还是很重要的,但当我想要去写一篇 Java 回顾的文章的时候发现很难,因为坑实在太多了 ...

  7. Spring boot配置Servlet容器

    配置Servlet容器 Spring boot默认使用Tomcat,作为Servlet容器 也支持Jetty.Undertow作为Servlet容器 Jetty 适合开发长连接应用 长连接,表示一直进 ...

  8. springboot(七) 配置嵌入式Servlet容器

    github代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service ...

  9. servlet容器_SpringBoot是否内置了Servlet容器?

    SpringBoot是否内置了Servlet容器? SpringBoot内置了Servlet容器,这样项目的发布.部署就不需要额外的Servlet容器,直接启动jar包即可.SpringBoot官方文 ...

最新文章

  1. [YTU]_2489( C++结构体之统计最高最低分)
  2. linux db2乱码,DB2乱码(开始和结束,字符串中间没有好的办法)
  3. openstack之neutron linuxbridge + vlan组网
  4. MATLAB中squeeze函数的作用
  5. es Root mapping definition has unsupported parameters解决方法
  6. 2019.3.23 python的unittest框架与requests
  7. ssm整合之六 时间日期装换
  8. wordpress实现搜索页关键词高亮
  9. Shell中的while循环
  10. (转)MyBatis框架的学习(二)——MyBatis架构与入门
  11. Internet Explorer无法下载
  12. Fatal error: Call to undefined function ParCv() in E:\AppServ\www\include\dedesql.class.php on line
  13. key组合按键,长短按键,连续按键 识别方案
  14. Trace32使用教程-访问类型(Access Class)
  15. 怎样做一个iOS App的启动分层引导动画
  16. 二阶常系数非齐次线性微分方程的通解
  17. 软件项目管理——人力资源管理
  18. Python实现分钟倒计时
  19. mac的rubywoo怎么读_MAC大热色号 RUBY WOO
  20. python文件对象

热门文章

  1. Linux ARM平台开发系列讲解(GMSL摄像头篇)1.1 GMSL协议介绍
  2. FL Studio音频混音教程
  3. linux 键盘过滤,键盘过滤驱动程序不responsing
  4. java最简单的代码
  5. 斯坦福cs224n-2021 assignment1-探索词向量—词共现矩阵—SVD(奇异值分解)
  6. 嵌入式系统实用电源管理技术应该如何选择?
  7. 深入浅出Yolo系列之Yolov3Yolov4核心基础知识完整讲解
  8. sql——字符串处理
  9. python2.7使用scapy发送syn实例
  10. 前端如何保存图片?并在相册中查看。