tomcat源码阅读之StandardHost和StandardEngine

StandardHost及UML类图:

 

1、StandardHost类是Host接口的默认实现;其继承自ContainerBase类,说明他也是一个容器类,既然是容器类,那肯定也有管道对象PipeLine和阀门,其基础阀门(Basic Valve)的实现类是org.apache.catalina.core.StandardHostValve,ErrorReportValve和ErrorDispatcherValve类作为管道对象中的错误处理阀门;

2、当客户端的请求Request要在Host中查找到相应的Context处理请求时,就需要使用mapper对象处理,StandardHost中的mapper实现类是org.apache.catalina.core.StandardHostMapper;当ContainerBase.start启动时会调用addDefaultmapper添加默认的映射器,也就会调用到StandardHost.addDefaultmapper方法:

 

此处的mapperClass的内容就是org.apache.catalina.core.StandardHostMapper;

3、StandardHost继承自ContainerBase类,也就实现了LifeCycle接口,在其start方法中将ErrorReportValve和ErrorDispatcherValve阀门添加到管道对象中,在其invoke方法调用中总是先调用Basic Valve后再调用PipeLine中的阀门:

 

4、在ApplicationContext的getResource方法中会去获取资源路径,其中就使用到了Host的getName方法,因此Context至少要配置一个Host(除非自己重新实现一个ContextConfig对象);

 

Standardhost处理请求流程:

1、客户端的请求Request在Connector中封装好后传递给StandardHost.invoke方法,由于StandardHost没有实现invoke方法,因此invoke会调用到其父类ContainerBase.invoke方法,然后调用管道对象里面的基础阀门StandardHostValve.invoke方法;

2、StandardHostValve.invoke调用StandardHost.map(request, update)方法,由于StandardHost没有实现这个原型的map方法,因此调用了ContainerBase.map方法,在ContainerBase.map中根据协议类型(http)查找到对应的mapper对象(findMapper查找时,由于Standardhost中已经将StandardHostMapper作为默认mapper对象添加到Host中,因此findMapper会返回该mapper对象);

3、StandardHostMapper.map方法基本没做什么处理,获取到Request的URI信息后就到StandardHost中去查找对应的Context对象(findChild),StandardHost.children变量中存储了ContextName和Context对象的映射关系,而Context.name属性就是取的该Context.path属性,因此在StandardHost.map方法中直接拿路径到children中取查找对应的Context对象:

 

4、在StandardHost中查找到对应的Context后,直接调用Context.invoke方法交由Context对象去处理;

StandardEngine及UML类图:

 

1、Engine容器也就是tomcat的servlet引擎,StandardEngine类是Engine接口的默认实现;当部署tomcat时需要支持多个虚拟机的话,就需要使用engine容器,事实上,一般情况下,部署的tomcat都会使用一个Engine容器;

2、StandardEngineValve类作为StandardEngine类的基础阀门(Basic Valve),其invoke方法负责查找出对应的Host出来并交由host处理;

StandardEngine处理请求流程:

 

1、与上面的StandardHost的请求处理相同,客户端请求Request到达StandardEngine.invoke,再到达ContainerBase.invoke,最后到达StandardEngineValve阀门的invoke方法,在这里调用Engine.map方法,由于StandardEngine没有实现map方法,因此传递到了ContainerBase的map方法中,首先调用findMapper查找映射器,由于StandardEngine实现了addDefaultMapper方法添加默认的映射器StandardEngineMapper,因此findMapper会返回StandardEngineMapper映射器实例;

2、在StandardEngineMapper.map方法里面,首先根据请求Request获取到HostName,然后在根据HostName查找得到对应的Host对象;

 

可以看到在查找Host时,首先根据HostName在Children的哈希表中查找名称为HostName的Host对象,如果没有查找到,则判断遍历所有Host对象,如果有Host对象的别名与HostName相同,则返回该Host实例,如果这样还没找到,则直接返回默认Host对象处理;

3、得到Host对象后将请求直接转给Host.invoke处理;

转载于:https://www.cnblogs.com/laoxia/p/8058510.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安防监控产业链全景梳理

安防行业是随着现代社会安全需求应运而生的产业,围绕着视频监控技术的改革创新,行业从“看得见、看得远、看得清到看得懂”,一共经历模拟监控、数字监控、网络高清监控和智能监控4个阶段,每一阶段的突破,都由上游技术的…

Vue项目搭建步骤

一. vue-cli初始化1. 全局安装 vue-cli  npm install --global vue-cli2. 创建一个基于 webpack 模板的新项目  vue init webpack my-project3. 安装依赖  cd my-project  npm install (换源安装: npm install --registry https://registry.npm.taobao.org …

Python tutor 简介

Python tutor 能够直观显示object 引用关系。 网址是 http://www.pythontutor.com/visualize.html 先分享一下我的一个Python tutor: 点我出现神奇: 1) 编辑code。 2) 运行, 能够看到以下界面。 这个工具是很酷的&…

提高CSS性能

1、选择器 了解CSS的查找匹配原理,让CSS更简洁、高效使用高效率的CSS选择器如何使CSS渲染更高效 总结 不要在ID选择器前使用标签名 一般写法:div#divBox 更好写法:#divBox 解释: 因为ID选择器是唯一的,加上div反而增加…

光学镜头行业发展现状及趋势,智能手机应用领域占比最高

一、光学镜头分类 光学镜头也叫摄像镜头或摄影镜头,简称镜头,其功能就是光学成像。光学镜头是光学成像系统中的必备组件,直接影响到成像质量的好坏,影响算法的实现和效果。从结构来看,光学镜头一般由精密五金、塑胶零…

关于_vmvare workstation装32ubuntu的问题

刚开始启动的时候是黑屏,没有任何反应 1.bios也设置BIOS intel virtual technology 设置了enabled(开启硬件虚拟化:要运行一些操作系统,虚拟化软件和虚拟机,硬件虚拟化就需要启用。大多数情况下,不需要虚拟化技术的操作系统可以正…

window screen (获取屏幕信息)

document.write("屏幕宽度"screen.width);document.write("屏幕高度"screen.height);//(整个电脑的屏幕的高)上面和下面不是有效区的也被包括了 document.write("可用高度"screen.availHeight)//除了上面的任务栏 其他的全…

360°环视(全景影像)系统发展趋势

360环视系统,系统同时采集车辆四周的影像,经过图像处理单元一系列的智能算法处理,最终形成一幅车辆四周的全景俯视图显示在屏幕上,直观地呈现出车辆所处的位置和周边情况。系统大大地拓展了驾驶员对周围和环境的感知能力&#xff…

python简记

Python新手懵懂区: 1.不可变对象是传值,可变对象是传引用 2.不可变对象被真正复制,而可变对象只是复制了一个对它们的引用 3.*args --> 元组型参数传递 **args --> 字典型参数传递 4.浅拷贝:只复制了对对象的引用&#…

需求分析挑战之旅(疯狂的订餐系统)(8)——最后的疯狂

摘要: 说教性质的需求分析理论,各位看了也白看,所以咱们就来一个真实个案——“订餐系统”体验一下。“订餐系统”貌似简单,但陷阱重重,各种需求分析的经典场景将会一一重现,各位做好准备接受这个挑战没有&…

CPU架构:CPU架构详细介绍

1 概述 CPU架构是CPU商给CPU产品定的一个规范,主要目的是为了区分不同类型的CPU。目前市场上的CPU分类主要分有两大阵营,一个是intel、AMD为首的复杂指令集CPU,另一个是以IBM、ARM为首的精简指令集CPU。不同品牌的CPU,其…

【NOIP】关押罪犯

带权并查集&#xff0c;其实这种并查集的核心就是“向量” 1 #include<cstdio>2 #include<iostream>3 #include<algorithm>4 using namespace std;5 int n,m,p[20001],r[20001]; //0表示在同一监狱&#xff0c;1表示在不同监狱 6 struct node{7 int…

数学之路(3)-机器学习(3)-机器学习算法-SVM[7]

SVM是新近出现的强大的数据挖掘工具&#xff0c;它在文本分类、手写文字识别、图像分类、生物序列分析等实际应用中表现出非常好的性能。SVM属于监督学习算法&#xff0c;样本以属性向量的形式提供&#xff0c;所以输入空间是Rn的子集。 图1 如图1所示&#xff0c;SVM的目标是找…

Dalvik指令备忘

跳转指令 if-eq vx, vy, 目标 如果vx vy注2&#xff0c;跳转到目标。if-ne vx,vy, 目标 如果vx ! vy注2&#xff0c;跳转到目标。 if-lt vx,vy, 目标 如果vx < vy注2&#xff0c;跳转到目标。 if-ge vx, vy, 目标 如果vx > vy注2&#xff0c;跳转到目标。 if-gt vx,vy, …

CPU、GPU、FPGA、ASIC等AI芯片特性及对比

1、前言 目前&#xff0c;智能驾驶领域在处理深度学习AI算法方面&#xff0c;主要采用GPU、FPGA 等适合并行计算的通用芯片来实现加速。同时有部分芯片企业开始设计专门用于AI算法的ASIC专用芯片&#xff0c;比如谷歌TPU、地平线BPU等。在智能驾驶产业应用没有大规模兴起和批量…

个人博客03

昨天编写登录界面、注册界面的代码。 今天依旧做这些。 遇到的问题为数据库连接不上。转载于:https://www.cnblogs.com/qilin20/p/8068555.html

人工智能Ai芯片层出不穷,GPU、FPGA、ASIC用于人工智能的优势和劣势对比

人工智能&#xff08;AI&#xff09;主要包括三大要素&#xff0c;分别是数据、算法和算力。其中数据是基础&#xff0c;正是因为在实际应用当中的数据量越来越大&#xff0c;使得传统计算方式和硬件难以满足要求&#xff0c;才催生了AI应用的落地。而算法是连接软件、数据、应…

dom和bom

先看几个两个例题&#xff1a; 星座对应日期&#xff1a; <select id"s1">   <option>a</option>   <option>b</option>   <option>c</option>   <option>d</option>   </select>   <se…

分享自己针对Automation做的两个成熟的框架(QTP 和Selenium)

自己在google code中开源了自己一直以来做的两个自动化的框架&#xff0c;一个是针对QTP的一个是针对Selenium的&#xff0c;显而易见&#xff0c;一个是商业的UI automation工具&#xff0c;一个是开源的自动化工具。 只是代码&#xff0c;可能你直接看的话&#xff0c;有点不…

全景视频拼接关键技术

一、原理介绍 图像拼接(Image Stitching)是一种利用实景图像组成全景空间的技术&#xff0c;它将多幅图像拼接成一幅大尺度图像或360度全景图&#xff0c;图像拼接技术涉及到计算机视觉、计算机图形学、数字图像处理以及一些数学工具等技术。图像拼接其基本步骤主要包括以下几…