tomcat请求路由映射核心组件Mapper

简介: Mapper组件的核心功能是提供请求路径的路由映射,根据某个请求路径通过计算得到相应的Servlet(Wrapper)。

Mapper组件的核心功能是提供请求路径的路由映射,根据某个请求路径通过计算得到相应的Servlet(Wrapper)。这节看下Mapper的实现细节,包括Host容器、Context容器、Wrapper容器等的映射关系以及映射算法。

这里写图片描述

如果要将整个tomcat容器中所有的web项目以能够以Servlet级别组织起来,需要一个多层级的类似Map结构的存储空间。如上图,以Mapper作为映射的入口,按照容器等级首先会包含了N个Host容器的引用,然后每个Host会有N个Context容器的引用,最后每个Context容器包含N个Wrapper容器的引用。例如使用Mapper组件查找“tomcat.apache.org/tomcat-7.0-doc/search”,它首先会匹配name为“tomcat.apache.org”的Host,然后从中继续匹配name为“tomcat-7.0-doc”的Context,最后匹配name为“search”的Wrapper(Servlet)。

为了方便问题阐述,下面是一个简化后的Mapper映射关系的存储模型,暂时不考虑多版本Context。

①提供一个基础的键值对模型,name为容器的名称,object为具体的容器。

public class MapElement {
        public String name = null;
        public Object object = null;
 }

②Host映射模型,继承MapElement,且包含若干Context映射。

public class Host extends MapElement {
        public Context[] contexts = null;
}

③Context映射模型,继承MapElement,包含不同类型的Wrapper(servlet):默认Servlet、精确匹配Servlet、通配符Servlet和扩展Servlet。除此还有欢迎页资源和path。

public class Context extends MapElement {
        public String path = null;
        public String[] welcomeResources = new String[0];
        public Wrapper defaultWrapper = null;
        public Wrapper[] exactWrappers = new Wrapper[0];
        public Wrapper[] wildcardWrappers = new Wrapper[0];
        public Wrapper[] extensionWrappers = new Wrapper[0];
}

④Wrapper映射模型,继承MapElement。

public class Wrapper extends MapElement {
}

⑤Mapper类

public class Mapper{
    public Host[] hosts;
}

Mapper只要包含一个Host数组即可完成所有组件关系的映射。在tomcat启动时将所有Host容器和它的名字组成Host映射模型添加到Mapper对象中,每个Host下的Context容器和它的名字组成Context映射模型添加到对应的Host下,每个Context下的Wrapper容器和它的名字组成的Wrapper映射模型添加到对应的Context下。Mapper组件提供了对Host映射、Context映射、Wrapper映射的添加和移除的方法,在tomcat容器中添加或移除相应的容器时都要调用相应的方法维护这些映射关系。Mapper组件为了提高查找速度和效率,使用了二分搜索法查找,所以在添加时应按照字典序把Host、Context、Wrapper等映射排好序。

当tomcat启动稳定后,意味着这些映射都已经组织好,那么具体是如何查找对应容器的?

(一)Host的匹配,直接对Mapper中的Host映射数组进行忽略大小写的二分搜索查找。

(二)Context的匹配,对上面查找到的Host映射中的Context映射数组进行忽略大小写的二分搜索查找,这里有个比较特殊的情况是请求地址可以直接以Context名结束,例如http://tomcat.apache.org/tomcat-7.0-doc,另外一些则类似http://tomcat.apache.org/tomcat-7.0-do/index.html。另外,Context映射中的name对应的是Context容器的path属性。

(三)Wrapper的匹配,首先,尝试使用精确匹配法匹配精确类型Servlet的路径;然后,尝试使用前缀匹配通配符类型Servlet;接着尝试使用扩展名匹配通配符类型Servlet;最后,匹配成默认Servlet。
Tomcat在处理请求时对请求的路由分发全由Mapper组件负责,请求通过Mapper找到最终的处理Servlet或资源。而在tomcat中会有两种类型的Mapper,它们作用的范围不同,因为称为全局路由映射和局部路由映射。

点击订购作者《Tomcat内核设计剖析》

博主的书

目录
相关文章
|
4月前
|
应用服务中间件
从零手写实现 tomcat-03-请求和响应的抽象
该文档介绍了 MiniCat 项目,它是一个简单的 HTTP 服务器实现。v1 版本中, MiniCatRequest 对象解析 HTTP 请求,包括方法、URL 和输入流,而 MiniCatResponse 使用输出流处理响应。start 方法使用这些封装后的对象处理网络通信。在 v2 版本,服务器添加了返回静态资源文件的功能,如 HTML,通过解析 URL 并读取对应本地文件内容来响应请求。测试示例展示了如何访问和显示 index.html。
|
9月前
|
JSON 前端开发 Java
图解HTTP请求Tomcat服务器实现前后端交互-2
图解HTTP请求Tomcat服务器实现前后端交互
85 0
|
9月前
|
前端开发 JavaScript Java
图解HTTP请求Tomcat服务器实现前后端交互-1
图解HTTP请求Tomcat服务器实现前后端交互
168 0
|
4月前
|
设计模式 安全 Java
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
86 0
|
22天前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
1天前
|
监控 网络协议 应用服务中间件
【Tomcat源码分析】从零开始理解 HTTP 请求处理 (第一篇)
本文详细解析了Tomcat架构中复杂的`Connector`组件。作为客户端与服务器间沟通的桥梁,`Connector`负责接收请求、封装为`Request`和`Response`对象,并传递给`Container`处理。文章通过四个关键问题逐步剖析了`Connector`的工作原理,并深入探讨了其构造方法、`init()`与`start()`方法。通过分析`ProtocolHandler`、`Endpoint`等核心组件,揭示了`Connector`初始化及启动的全过程。本文适合希望深入了解Tomcat内部机制的读者。欢迎关注并点赞,持续更新中。如有问题,可搜索【码上遇见你】交流。
【Tomcat源码分析】从零开始理解 HTTP 请求处理 (第一篇)
|
3月前
|
缓存 负载均衡 NoSQL
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
64 1
|
3月前
|
应用服务中间件
tomcat服务器get、post请求及响应中文乱码问题
tomcat服务器get、post请求及响应中文乱码问题
|
3月前
|
Java 应用服务中间件 API
Tomcat处理一个HTTP请求的执行流程的详细解析
Tomcat处理一个HTTP请求的执行流程的详细解析
97 4
|
3月前
|
负载均衡 安全 Java
Tomcat的核心组件
Tomcat的核心组件
46 1