“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大牛的“心得”,献给迷茫中的你

servlet容器_Tomcat是一个Servlet容器?相关推荐

  1. Servlet入门总结及第一个Servlet程序

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录 一了解Servlet的概念 二Servlet技术功能 三 Servlet技术特点 四 S ...

  2. maven servlet配置_第一个Servlet配置

    使用IntelliJ IDEA创建一个Simple Maven项目 2. Add Framework Support 3. 配置Tomcat 打开菜单Run -> 选择Edit Configur ...

  3. 利用抽象工厂创建DAO、利用依赖注入去除客户端对工厂的直接依赖、将有关Article的各种Servlet封装到一个Servlet中(通过BaseServlet进行

    利用抽象工厂创建DAO.利用依赖注入去除客户端对工厂的直接依赖.将有关Article的各种Servlet全部封装到一个Servlet中(通过BaseServlet来进行ArticleServlet方法 ...

  4. 一个Servlet同一时刻只有一个实例。 当多个请求发送到同一个Servlet,服务器会为每个请求创建一个新线程来处理。

    Servlet是一种独立于操作系统平台和网络传输协议的服务器端的Java应用程序.  相同点:  1. 不是独立的应用程序,没有main()方法.  2. 不是由用户调用,由另一个应用程序(容器)调用 ...

  5. Servlet→简介、手动编写一个Servlet、使用MyEclipse编写一个Servlet、Servlet生命周期、路径编写规范、初始化参数、MVC设计模式

    手动编写一个Servlet 使用MyEclipse编写一个Servlet Servlet生命周期 路径编写规范 初始化参数 MVC设计模式 企者不立:跨者不行. 自见者不明: 自是者不彰: 自伐者无功 ...

  6. JavaWeb | 七个步骤,完成一个servlet的hello world程序

    Servlet 是一种实现动态页面的技术,是一组 Tomcat 提供给程序猿的 API,帮助程序猿简单高效的开发一 个 web app 动态页面 vs 静态页面: 静态页面也就是内容始终固定的页面,即 ...

  7. 如何编写一个Servlet

    Servlet day2 1.什么是servlet servlet本身就是一种java类,这种java类可以提供web形式的访问(Java EE 规范) 2.怎么按照JavaEE的规范编写一个serv ...

  8. java servlet的生命周期_Java Servlet系列之Servlet生命周期

    Servlet生命周期定义了一个Servlet如何被加载.初始化,以及它怎样接收请求.响应请求,提供服务.在讨论Servlet生命周期之前,先让我们来看一下这几个方法: 1. init()方法 在Se ...

  9. java服务容器_Java容器和Docker这种服务容器差别?

    weipeng2k Java容器技术和docker技术可以看做是一个互补的技术.我们在虚拟机基础上创建了多个docker容器,而一个docker容器在应对一些低流量的系统时,最低还是需要分配4核8G左 ...

  10. servlet容器_Tomcat 容器与servlet的交互原理

    点击蓝字"程序员考拉"欢迎关注! Tomcat 是Web应用服务器,是一个Servlet/JSP容器. Tomcat 作为Servlet容器,负责处理客户请求,把请求传送给Serv ...

最新文章

  1. 中山大学计算机学院运动会,喜讯!我院获2019中大校运会教工组团体第二名
  2. 刷题:递归问题与动态规划
  3. java swing 组件渲染过程_Java Swing无法正确渲染
  4. Opencv 数学基础--范数(17)
  5. AngularUI Router
  6. python爬虫小说代码示例-使用简单Python爬虫获取一个干净整洁的小说文件
  7. C#-WinForm跨线程修改UI界面
  8. CSDN编程挑战——《进制转换》
  9. python猴子偷桃_Python实例100个(基于最新Python3.7版本)
  10. 单片机外部中断实验C语言程序,STC89C52单片机外部中断0实验
  11. Python+flask+flask-email发送带附件的电子邮件
  12. spring 整合struts
  13. 光耦驱动单向可控硅_光耦继电器在信号传输方面的优势!
  14. psql 命令行使用
  15. 华悦网游器软件介绍及功能介绍
  16. 英伟达显卡虚拟化vGPU实践指南
  17. 政府行业数据保护方案
  18. 网络编程--JAVA之多线程下载后续:断点续存
  19. 新型自动站业务用计算机采用,探析新型自动气象站测报业务软件运行故障及解决对策...
  20. 《OpenCV3编程入门》学习笔记之书本资源汇总

热门文章

  1. 阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置
  2. 暑假集训-7.31总结
  3. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_1_字符输入流_Reader类FileRead...
  4. node koa2 玩起来都是中间件啊
  5. 关于beginPath()和closePath()的关系canvas的beginPath和closePath分析总结,包括多段弧的情况...
  6. UVA - 10635 —— Prince and Princess
  7. seajs的使用--主要了解模块化
  8. 简单使用Spring Boot+JpaRepository+hibernate搭建项目
  9. C# 注册Dll文件
  10. eclipse sdk 无法更新