tomcat源码 StandardService
- 在执行StandardServer的initInternal的时候会执行StandardService#init,然后会调到initInternal
- protected void startInternal() throws LifecycleException {
- if(log.isInfoEnabled())
- log.info(sm.getString("standardService.start.name", this.name));
- setState(LifecycleState.STARTING);
- // Start our defined Container first
- if (engine != null) {
- synchronized (engine) {
- //引擎
- engine.start();
- }
- }
- synchronized (executors) {
- for (Executor executor: executors) {
- executor.start();
- }
- }
- //初始化Mapper组件,设置Host,Context,Wrapper的映射关系
- mapperListener.start();
- // Start our defined Connectors second
- synchronized (connectorsLock) {
- for (Connector connector: connectors) {
- try {
- // If it has already failed, don't try and start it
- if (connector.getState() != LifecycleState.FAILED) {
- //初始化 连接相关的组件
- connector.start();
- }
- } catch (Exception e) {
- log.error(sm.getString(
- "standardService.connector.startFailed",
- connector), e);
- }
- }
- }
- }
Mapper组件的核心功能是提供请求路径的路由映射,根据某个请求路径通过计算得到相应的Servlet(Wrapper)
Mapper的映射包括Host容器、Context容器、Wrapper容器等的映射关系以及映射算法
一个service容器包含了N个Host容器的引用,然后每个Host会有N个Context容器的引用,最后每个Context容器包含N个Wrapper容器的引用。Wrapper容器会找到具体的servlet。
当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源码 StandardService的更多相关文章
- Tomcat源码分析之—组件启动实现分析
Tomcat由多个组件组成,那么Tomcat是怎么对他们的生命周期进行管理的么,这里将从Tomcat源码去分析其生命周期的实现: Bootstrape类为Tomcat的入口,所有的组件够通过实现Lif ...
- Tomcat 源码分析(一)——启动与生命周期组件
写在前面的话:读Tomcat源码也有段时间了,大领悟谈不上.一些小心得记录下来,供大家参考相护学习. 一.启动流程 Tomcat启动首先需要熟悉的是它的启动流程.和初学者第一天开始写Hello Wor ...
- Tomcat源码分析——请求原理分析(下)
前言 本文继续讲解TOMCAT的请求原理分析,建议朋友们阅读本文时首先阅读过<TOMCAT源码分析——请求原理分析(上)>和<TOMCAT源码分析——请求原理分析(中)>.在& ...
- Tomcat源码分析——请求原理分析(上)
前言 谈起Tomcat的诞生,最早可以追溯到1995年.近20年来,Tomcat始终是使用最广泛的Web服务器,由于其使用Java语言开发,所以广为Java程序员所熟悉.很多人早期的J2EE项目,由程 ...
- Tomcat 源码分析(转)
本文转自:http://blog.csdn.net/haitao111313/article/category/1179996 Tomcat源码分析(一)--服务启动 1. Tomcat主要有两个组件 ...
- Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析
Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...
- tomcat源码--springboot整合tomcat源码分析
1.测试代码,一个简单的springboot web项目:地址:https://gitee.com/yangxioahui/demo_mybatis.git 一:tomcat的主要架构:1.如果我们下 ...
- svn工具安装下载Tomcat源码以及导入eclipse
安装 1.svn下载地址 https://tortoisesvn.net/downloads.html 2.语言包下载 3.先安装svn,在直接安装语言包 4.桌面右键可以看到相关svn信息 下载To ...
- Tomcat源码导入eclipse的步骤
Tomcat源码导入eclipse 一.下载源码 1. 进入Apache 官网:http://tomcat.apache.org/ 2. 在左边侧选择要下载的源码的版本. 3. 或者直接通过Ar ...
随机推荐
- scrapt中的数据提取,采用js2xml库
这个一个爬去美团的例子,应为数据都是在script中,小心封ip,尽量少运行. 先导入库几个库 import requests from bs4 import BeautifulSoup from l ...
- Unity 3D委托entrust
Unity 3D委托的多种用法 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...
- 你不能阻止DOM
浏览器数据库景观 对于外行来说,浏览器数据库的世界可能是一个令人困惑的世界.Lawnchair,PouchDB,LocalForage,Dexie,Lovefield,LokiJS,AlaSQL,Ma ...
- C语言--第四周作业评分和总结(5班)
作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1129 一.评分要求 要求1 完成PTA第四周所有题(20分). 要求2 4道 ...
- django 有关session内部函数做法
session在set和调用时其实分别做了三步: def fileupload(request): request.session['k1'] = 'ppp' ''' .生成一个随机字符串 .set_ ...
- 02 JDBC相关
====================================================================================JDBC JAVA Databa ...
- acm 2005
////////////////////////////////////////////////////////////////////////////////#include<iostream ...
- Math.floor(-8.5)=多少?
Math.floor() 表示向下取整,返回double类型 (floor---地板) Math.ceil() 表示向上取整,返回double类型 (ceil---天花板) Ma ...
- 【BZOJ1082】【SCOI2005】栅栏
暴力出奇迹…… 原题: 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材.于是农夫约翰到木材店购买木材.可是木材店老板说他这里只剩下少部分大规格的木板了.不过约翰可以购买这些木 ...
- spring获取jdbc链接底层原理
获取连接池的连接二种逻辑 1.一个事务中,一个连接 (底层逻辑:threadlocal存储 里面是map: key是数据源,value:链接) map存储应该是为多数据源使用的2.没有事务的serv ...