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.pswp.cn/news/252651.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252651.shtml
英文地址,請注明出處:http://en.pswp.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;圖像拼接技術涉及到計算機視覺、計算機圖形學、數字圖像處理以及一些數學工具等技術。圖像拼接其基本步驟主要包括以下幾…