国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - Tomcat - 淺談Tomcat多層容器的設計

淺談Tomcat多層容器的設計

2021-09-26 16:18JavaEdge. Tomcat

Tomcat的容器用來裝載Servlet。那Tomcat的Servlet容器是如何設計的呢,本文就詳細的來介紹一下,具有一定的參考價值,感興趣的可以了解一下

tomcat的容器用來裝載servlet。那tomcat的servlet容器是如何設計的呢?

容器的層次結構

tomcat設計了4種容器:engine、host、context和wrapper

淺談Tomcat多層容器的設計

tomcat通過這種分層,使得servlet容器具有很好的靈活性。

  • context表示一個web應用程序
  • wrapper表示一個servlet,一個web應用程序中可能會有多個servlet
  • host代表一個虛擬主機,或一個站點,可以給tomcat配置多個虛擬主機地址,而一個虛擬主機下可以部署多個web應用程序
  • engine表示引擎,用來管理多個虛擬站點,一個service最多只能有一個engine

觀察tomcat的server.xml配置文件。tomcat采用了組件化設計,最外層即是server

淺談Tomcat多層容器的設計

這些容器具有父子關系,形成一個樹形結構,tomcat用組合模式來管理這些容器。

所有容器組件都實現container接口,因此組合模式可以使得用戶對

單容器對象
最底層的wrapper

組合容器對象
上面的context、host或者engine
的使用具有一致性。

container接口定義:

?
1
2
3
4
5
6
7
8
public interface container extends lifecycle {
    public void setname(string name);
    public container getparent();
    public void setparent(container container);
    public void addchild(container child);
    public void removechild(container child);
    public container findchild(string name);
}

請求定位servlet的過程

搞這么多層次的容器,tomcat是怎么確定請求是由哪個wrapper容器里的servlet來處理的呢?
tomcat用mapper組件完成這個任務。

mapper就是將用戶請求的url定位到一個servlet

工作原理

mapper組件保存了web應用的配置信息:容器組件與訪問路徑的映射關系,比如

  • host容器里配置的域名
  • context容器里的web應用路徑
  • wrapper容器里servlet映射的路徑

這些配置信息就是一個多層次的map。

當一個請求到來時,mapper組件通過解析請求url里的域名和路徑,再到自己保存的map里去查找,就能定位到一個servlet。
一個請求url最后只會定位到一個wrapper容器,即一個servlet。

假如有一網購系統,有

  • 面向b端管理人員的后臺管理系統
  • 面向c端用戶的在線購物系統

這倆系統跑在同一tomcat,為隔離它們的訪問域名,配置兩個虛擬域名:

manage.shopping.com
管理人員通過該域名訪問tomcat去管理用戶和商品,而用戶管理和商品管理是兩個單獨的web應用

user.shopping.com
c端用戶通過該域名去搜索商品和下訂單,搜索功能和訂單管理也是兩個獨立web應用

這樣部署,tomcat會創建一個service組件和一個engine容器組件,在engine容器下創建兩個host子容器,在每個host容器下創建兩個context子容器。由于一個web應用通常有多個servlet,tomcat還會在每個context容器里創建多個wrapper子容器。每個容器都有對應訪問路徑

淺談Tomcat多層容器的設計

tomcat如何將url定位到一個servlet呢?

首先,根據協議和端口號選定service和engine
tomcat的每個連接器都監聽不同的端口,比如tomcat默認的http連接器監聽8080端口、默認的ajp連接器監聽8009端口。該url訪問8080端口,因此會被http連接器接收,而一個連接器是屬于一個service組件的,這樣service組件就確定了。一個service組件里除了有多個連接器,還有一個engine容器,因此service確定了,engine也確定了。

根據域名選定host。
mapper組件通過url中的域名去查找相應的host容器,比如user.shopping.com,因此mapper找到host2容器。

根據url路徑找到context組件
host確定以后,mapper根據url的路徑來匹配相應的web應用的路徑,比如例子中訪問的是/order,因此找到了context4這個context容器。

最后,根據url路徑找到wrapper(servlet)
context確定后,mapper再根據web.xml中配置的servlet映射路徑來找到具體wrapper和servlet。

并非只有servlet才會去處理請求,查找路徑上的父子容器都會對請求做一些處理:

  • 連接器中的adapter會調用容器的service方法執行servlet
  • 最先拿到請求的是engine容器,engine容器對請求做一些處理后,會把請求傳給自己子容器host繼續處理,依次類推
  • 最后這個請求會傳給wrapper容器,wrapper會調用最終的servlet來處理

這個調用過程使用的pipeline-valve管道,責任鏈模式,在一個請求處理的過程中有很多處理者依次對請求進行處理,每個處理者負責做自己相應的處理,處理完之后將再調用下一個處理者繼續處理。

valve表示一個處理點,比如權限認證和記錄日志。

?
1
2
3
4
5
public interface valve {
  public valve getnext();
  public void setnext(valve valve);
  public void invoke(request request, response response)
}

由于valve是一個處理點,因此invoke方法就是來處理請求的。
pipeline接口:

?
1
2
3
4
5
6
public interface pipeline extends contained {
  public void addvalve(valve valve);
  public valve getbasic();
  public void setbasic(valve valve);
  public valve getfirst();
}

所以pipeline中維護了valve鏈表,valve可插入到pipeline。
pipeline中沒有invoke方法,因為整個調用鏈的觸發是valve完成自己的處理后,調用getnext.invoke調用下一個valve。

每個容器都有一個pipeline對象,只要觸發這個pipeline的第一個valve,這個容器里pipeline中的valve就都會被調用到。但不同容器的pipeline如何鏈式觸發?
比如engine中pipeline需要調用下層容器host中的pipeline。
pipeline有個getbasic方法。這個basicvalve處于valve鏈尾,負責調用下層容器的pipeline里的第一個valve。

淺談Tomcat多層容器的設計

整個調用過程由連接器中的adapter觸發的,它會調用engine的第一個valve:

淺談Tomcat多層容器的設計wrapper

容器的最后一個valve會創建一個filter鏈,并調用dofilter方法,最終會調到servlet的service方法。

valve和filter有什么區別呢?

  • valve是tomcat的私有機制,與tomcat緊耦合。servlet api是公有標準,所有web容器包括jetty都支持filter
  • valve工作在web容器級別,攔截所有應用的請求。servlet filter工作在應用級別,只攔截某個web應用的所有請求。若想做整個web容器的攔截器,必須使用valve。

到此這篇關于淺談tomcat多層容器的設計的文章就介紹到這了,更多相關tomcat 多層容器內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_33589510/article/details/118917426

延伸 · 閱讀

精彩推薦
  • Tomcat如何查看tomcat的控制臺輸出的方法

    如何查看tomcat的控制臺輸出的方法

    這篇文章主要介紹了如何查看tomcat的控制臺輸出的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    CaiCaiNeo11972021-08-29
  • Tomcat如何將Tomcat設置為自動啟動的服務最快捷方法

    如何將Tomcat設置為自動啟動的服務最快捷方法

    這篇文章主要介紹了如何將Tomcat設置為自動啟動的服務最快捷方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    鋒齊葉落5352021-09-03
  • TomcatTomcat服務器搭建教程

    Tomcat服務器搭建教程

    這篇文章主要為大家詳細介紹了Tomcat服務器搭建教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Watom_66310452021-08-20
  • TomcatTomcat目錄結構詳解

    Tomcat目錄結構詳解

    Tomcat 服務器是一個免費的開放源代碼的 Web 應用服務器,學習tomcat目錄結構十分有必要,今天小編給大家帶來了詳細教程,感興趣的朋友一起看看吧...

    ThinkWon6712021-09-09
  • TomcatTomcat正常訪問localhost報404問題解決

    Tomcat正常訪問localhost報404問題解決

    這篇文章主要介紹了Tomcat正常訪問localhost報404問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    小明Style5592021-09-23
  • Tomcattomcat 6.0.20在一個機器上安裝多個服務的方法

    tomcat 6.0.20在一個機器上安裝多個服務的方法

    本文主要為大家介紹tomcat 6.0.20在一個機器上安裝多個服務的方法,當前前提是你已經可以同時運行他們了,他們的端口不能相同,這里只是解釋如何把它們...

    Tomcat教程網10052021-08-03
  • Tomcat學習javaweb如何配置Tomcat的熱啟動

    學習javaweb如何配置Tomcat的熱啟動

    學習javaweb的時候每次更改項目都需要重新部署項目,如此一來比較麻煩,使用tomcat的熱啟動就可以解決這個問題...

    whsnow12072021-08-04
  • Tomcat淺談Tomcat多層容器的設計

    淺談Tomcat多層容器的設計

    Tomcat的容器用來裝載Servlet。那Tomcat的Servlet容器是如何設計的呢,本文就詳細的來介紹一下,具有一定的參考價值,感興趣的可以了解一下...

    JavaEdge.9612021-09-26
主站蜘蛛池模板: 91网页版| 美女久久 | 在线视频a| 欧美在线电影 | 免费亚洲婷婷 | 六月婷操 | 高清精品一区二区 | 欧美第8页 | 久久精品国产清自在天天线 | 四虎影视永久免费观看 | 欧美午夜精品久久久久免费视 | 91视频一88av | 狠狠干天天爱 | 精品成人av一区二区在线播放 | 欧美区亚洲区 | 亚洲成av人片一区二区梦乃 | 天天干天天操 | 999久久久国产999久久久 | 国产精品爱久久久久久久 | av三级 | 欧美成人影院 | 国产精品久久久久无码av | 日本理论在线 | 激情视频网站 | 乱人伦xxxx国语对白 | 免费簧片| 久久久久久久久久久免费视频 | 欧美成年黄网站色视频 | 欧美一区二区三 | 日韩在线欧美 | 欧美久久久久久久久久久 | 伊人6 | 成人免费观看www的片 | 欧美一级欧美三级在线观看 | 亚洲精品国产成人 | 君岛美绪一区二区三区在线视频 | 国产午夜精品一区二区三区视频 | 91操碰| 欧美国产日韩一区 | av一区二区三区 | 四季久久免费一区二区三区四区 |