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

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,它们作用的范围不同,因为称为全局路由映射和局部路由映射。

时间: 2024-11-04 11:52:54

tomcat请求路由映射核心组件Mapper的相关文章

TOMCAT 请求HTTP原理

一.Tomcat是什么?Tomcat是一个Web应用服务器,同时也是一个Servlet/JSP容器.Tomcat作为Servlet容器,负责处理客户端请求,把请求传送给Servlet,并将Servlet的响应返回给客户端.二.Tomcat的体系结构Tomcat是一个基于组件的服务器,它的构成组件都是可配置的.其各个组件都在Tomcat安装目录下的../conf/server.xml文件中配置.server.xml文件源代码如下: <?xml version="1.0" encod

[Buffalo]ASP.NET MVC路由映射

Asp.Net的路由系统旨在通过注册URl模版与物理文件之间的映射进而实现请求地址与文件路径之间的分离,但对于Asp.Net Mvc应用来说,请求的目标却是定义在某个Controller类型中的Action方法. 为了实现针对目标Controller和Action的路由,Asp.Net Mvc在System.Web.Mvc.RouteCollectionExtensions中针对RouteConllection类型定义了一系列的扩展方法以实现文件路径无关的路由映射.其中的两组方法,Ignore用

ASP.NET的路由系统:路由映射

总的来说,我们可以通过RouteTable的静态属性Routes得到一个基于应用的全局路由表,通过上面的介绍我们知道这是一个类型的RouteCollection的集合对象,我们可以通过调用它的MapPageRoute进行路由映射,即注册URL模板与某个物理文件的匹配关系.路由注册的核心就是在全局路由表中添加一个Route对象,该对象的绝大部分属性都可以通过MapPageRoute方法的相关参数来指定.接下来我们通过实现演示的方式来说明路由注册的一些细节问题. 目录 一.变量默认值 二.约束 三.

Django-url路由映射与views逻辑处理

一.URL路由映射 路由映射模块,主要完成url与views视图函数的映射.当一个url请求到来时,会按照这个模块中的url地址从上到下进行匹配,如果匹配成功,将执行映射试图中的函数:反之将返回404错误. 1.基本介绍 urlpatterns = [] #里面存放一条条的路由映射关系. url(正则表达式, 映射函数,参数[可选],别名[可选]) 正则匹配中,如果带了括号,那么该括号中的内容会当作参数传递到对应的视图函数中去. 别名,在文件路径发生变化时用处非常大. 2.配置路由 常规正则匹配

第二百六十三也,Tornado框架-基于正则的动态路由映射分页

Tornado框架-基于正则的动态路由映射分页 分页基本显示数据 第一步.设置正则路由映射配置,(r"/index/(?P<page>\d*)", index.indexHandler),正则匹配访问路径,访问录index/后面可以是可以是0个或多个数字第二步.配置逻辑处理方法,get()方法里显示对应的页面,并传值一个SHUJU全局变量列表到html模板,这个全局变量列表里是字典显示的数据第三步.在html模板里用模板语言,循环这个列表里的字典,显示到表格里第四步.设置用

[PHP] 实现路由映射到指定控制器

自定义路由的功能,指定到pathinfo的url上,再次升级之前的脚本 SimpleLoader.php <?php class SimpleLoader{ public static function run($rules=array()){ header("content-type:text/html;charset=utf-8"); self::register(); self::commandLine(); self::router($rules); self::path

Spring注解@RequestMapping请求路径映射问题

@RequestMapping请求路径映射,假设标注在某个controller的类级别上,则表明訪问此类路径下的方法都要加上其配置的路径.最经常使用是标注在方法上.表明哪个详细的方法来接受处理某次请求. 下面两种方式都能够从url中传參数,可是另外一种方式的适用性更高一些,当參数中包括中文的时候,假设用第一种方式传參数,常常会出现參数还没到controller就已经经过编码了(比如:经过utf-8编码后,原本要传的參数就会以%+ab...cd这种方式出现),然后controller接受到这种请求

WCF自定义地址路由映射(不用svc文件)

一般在创建WCF服务时会用Serivce.svc文件访问,地址如:http://localhost/applicationname/Serivce.svc/Name 现在用路由映射成:http://localhost/applicationname/MyService/Name  方法如下: 首先在Global.asax中的Application_Start事件中添加以下代码: void Application_Start(object sender, EventArgs e)     {   

第三百八十三节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置

第三百八十四节,Django+Xadmin打造上线标准的在线教育平台-路由映射与静态文件配置以及会员注册 基于类的路由映射 from django.conf.urls import url, include # 导入django自在的include逻辑 from django.contrib import admin from django.views.generic import TemplateView # 导入django自带的TemplateView逻辑 import xadmin #