前面的文章中,我们介绍了Tomcat的Engine和Host容器,我们知道一个Tomcat最多只有一个Engine容器,一个Engine容器可以包含多个Host容器,请求中的不同的Host对应不用的Host容器。本章我们会介绍Tomcat的另外两个容器:Context容器和Wrapper容器。一个Host容器可以包含多个Context容器:同一个Host下面可以包含多个应用,每个应用对应一个Context容器。一个Context容器又可以包含多个Wrapper容器:每个Wrapper容器包含一个Servlet容器,意味着Tomcat允许一个应用有多个servlet实现。

Tomcat请求流程

我们现在知道Tomcat最重要的组件是连接器和四种类型的容器,下面的图展示了Tomcat的一次请求是如何在连接器和四种容器之间流转的,假设Http请求头为"GET /appB/servletB/some-url HTTP/1.1 Host: www.krishnan.com",当请求访问到Tomcat容器时,会经过以下流转步骤:

  1. Tomcat的连接器监听SocketServer,发现这个请求,按照指定的协议和IO方式处理请求Socket消息,解析Socket为对应的Request实体,并提供回写报文的Response实体。
  2. 连接器将Request/Response交给Engine容器,Engine容器存储了请求域名和Host容器之间的映射关系。比如"www.krishnan.com"域名对应于krishnan_webapps Host容器。
  3. Engine容器将请求交给对应的Host容器,Host容器开始解析请求中的路径,如果配置了路径和应用之间的关系,比如"/appB"对应于appB Context容器,Host容器会安装配置将请求交给对应应用的Context容器。
  4. Host容器解析路径并将应用交给Context容器之后,如果一个应用有多个Servlet,那么这个应用的Context容器也会包含多个Wrapper容器,我们可以通过路径来将不同的请求映射到不同的Servlet容器。比如图中的"/servletB"对应servletB Wrapper容器,Context容器将请求交给Wrapper容器。
  5. Context容器按照路径将请求交给对应的Wrapper容器,Wrapper容器会加载对应的Servlet实现类,调用servlet实现类中的逻辑处理Request并将处理结果写入Response中。

Context容器

我们在配置Tomcat应用程序的时候,总是需要配置一个web.xml文件,这个文件就是Context容器去解析的。tomcat默认的web.xml的配置如下所示,该配置中配置了两个WrapperContext,分别对应于两个Servlet配置。在web.xml中,我们经常可以看到listener标签,主要是用于监听Context容器的声明周期事件。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<request-character-encoding>UTF-8</request-character-encoding>
<response-character-encoding>UTF-8</response-character-encoding>
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> <servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping> <!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping> <session-config>
<session-timeout>30</session-timeout>
</session-config> <welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> </web-app>

Wrapper容器

Wrapper容器是最小的容器,每个Wrapper都可以对应一个Servlet的实例。当请求转发到Wrapper容器之后,wrapper容器在调用Pipeline方法之后,会使用特定的类加载器去加载servlet类,对servlet进行实例化和初始化,然后将请求交给servelt的service方法进行处理。

我们常见的Spring的DispatchServlet是线程安全的,所以Tomcat不需要保证Servlet的并发安全。对于非线程安全的servlet,则可以通过SingleThreadModel来保证多请求下servlet的正常运行。

Wrapper容器的主要作用就是载入servlet类并进行实例化,并调用service方法。当第一次请求某个servlet类的时候,Wrapper容器会载入servlet类。Tomcat提供了专门的类加载器用于加载servlet,关于这个类加载器我会在我的其它文章中介绍。

Wrapper容器的基本阀门StandardWrapperValve还会在调用servelt容器之前调用用户配置的过滤器链Filter。

我是御狐神,欢迎大家关注我的微信公众号:wzm2zsd

本文最先发布至微信公众号,版权所有,禁止转载!

学习Tomcat(五)之Context和Wrapper容器的更多相关文章

  1. Android Animation学习(五) ApiDemos解析:容器布局动画 LayoutTransition

    Android Animation学习(五) ApiDemos解析:容器布局动画 LayoutTransition Property animation系统还提供了对ViewGroup中的View改变 ...

  2. Docker学习笔记五:Docker生成jenkins容器,支持Java Web项目持续集成、持续部署

    一.创建jenkins容器: 1.拉取jeknin镜像 sudo docker pull jenkins 2.创建一个jenkins目录 sudo mkdir /jenkins 3.在jenkins目 ...

  3. 深入理解Tomcat系列之五:Context容器和Wrapper容器

    前言 Context容器是一个Web项目的代表,主要管理Servlet实例,在Tomcat中Servlet实例是以Wrapper出现的.如今问题是怎样才干通过Context容器找到详细的Servlet ...

  4. Tomcat Context容器和Wrapper容器

    前言 Wrapper容器 前言 Context容器是一个Web项目的代表,主要管理Servlet实例,在Tomcat中Servlet实例是以Wrapper出现的,现在问题是如何才能通过Context容 ...

  5. 学习Tomcat(一)之容器概览

    Tomcat是Apache软件基金会的一个顶级项目,由Apache.Sun和其它一些公司及个人共同开发,是目前比较流行的Web服务器之一.Tomcat是一个开源的.小型的轻量级应用服务器,具有占用系统 ...

  6. 学习Tomcat(六)之类加载器

    通过前面的文章我们知道,Tomcat的请求最终都会交给用户配置的servlet实例来处理.Servlet类是配置在配置文件中的,这就需要类加载器对Servlet类进行加载.Tomcat容器自定义了类加 ...

  7. 烂泥:学习tomcat之通过shell批量管理多个tomcat

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 公司的业务是使用tomcat做web容器,为了更有效的利用服务器的性能,我们一般部署多个 ...

  8. Tomcat学习—Tomcat的简介和目录以及配置文件介绍(Windows环境)

    tomcat学习(8) 版权声明:本文为博主原创文章,未经博主允许不得转载. 今天学习TOMCAT,主要学习的是Tomcat的目录结构,配置文件! 1:Tomcat简介 Tomcat 服务器是一个免费 ...

  9. Docker学习(五): 仓库与数据管理

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

随机推荐

  1. (二)MQTT客户端模拟连接阿里云并上传数据

    本文主要讲述使用MQTT.fx接入物联网平台 一.下载MQTT.fx客户端 官网链接 二.设置相关参数 打开MQTT单片机编程工具,将三元组复制进去,生成所需要的信息 单片机工具下载地址 三元组还记得 ...

  2. Linux命令全训练

    一.实验目的 为后续上机实验做准备,熟悉常用的Linux操作. 二.实验平台 操作系统:Ubuntu14.04 三.实验内容和要求 1.Linux系统中的常用快捷键 Tab 自动补全 上下箭头 显示历 ...

  3. java基础路线与详细知识点

    点击下方打开文件查看 还在持续更新中.....

  4. git rebase和git merge的区别

    前言:    平时工作中发现一般同事在同步远程代码的时候都是用git pull,其实git pull包含有两个操作,一个是fetch远程的代码,一个是将本地当前的代码和远程代码进行merge,即git ...

  5. 有关Java动态数组的一个小问题

    前言 问题描述 今天遇到一个关于集合的问题,觉得比较有趣,记录一下,这个问题是:定义一个用户类,至少包含姓名,年龄,生日,qq邮箱,初始化10个用户,利用String操作,提取qq到List集合中,姓 ...

  6. Learning ROS: rostopic pub yaml demo

    官方Tutorials中例程的等效命令: rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '{linear:[2.0, 0.0, 0.0 ...

  7. 一个double free相关问题的澄清

    引言 前一阵定位 Oracle 的 OCI 接口相关的一个内存释放问题,在网上看到了链接如下的这篇文章: 一个C++bug引入的许多知识 看到后面说 vector 里的两个单元里的内部成员指针地址是一 ...

  8. MySQL双主多从+Keepalived配置

    原文转自:https://www.cnblogs.com/itzgr/p/10233932.html作者:木二 目录 一 基础环境 二 实际部署 2.1 MySQL双主+Keepalived高可用 2 ...

  9. Servlet监听器详解及举例

    监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 监听器原理 监听原理 1.存在事件源 ...

  10. Qt中QOpengl的QMatrix4x4矩阵作用原理以及使用方法

    1.矩阵具有坐标变换的作用,例如:左乘一个旋转矩阵,实现点的坐标旋转,左乘一个平移矩阵实现,点的平移 2.一个点可以同时串联相乘几个变换矩阵,实现坐标连续变换,根据左乘规则,右边矩阵先作用于点,作用顺 ...