tomcat是服務器,是一種比較簡單的中間件,用來把java web開發部署到tomcat中,此時tomcat是作為服務器的。
java的可移植性設計讓java依賴class文件運行的。jdk就是java運行的環境,使用它能編譯.java文件,運行java程序。
tomcat可以比作web容器,java應用發布在它上面然后通過它與瀏覽器進行交互,一種程序與瀏覽器適配的容器。
Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬於輕量級應用服務器,在中小型系統和並發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP 程序的首選。
當配置正確時,Apache 為HTML頁面服務,而Tomcat 實際上運行JSP 頁面和Servlet。另外,Tomcat和IIS等Web服務器一樣,具有處理HTML頁面的功能,另外它還是一個Servlet和JSP容器,獨立的Servlet容器是Tomcat的默認模式。
Tomcat 組成如下圖:
主要有 Container 和 Connector 以及相關組件構成。
Server:指的就是整個 Tomcat 服 務器,包含多組服務,負責管理和 啟動各個 Service,同時監聽 8005 端口發過來的 shutdown 命令,用 於關閉整個容器 ;
Service:Tomcat 封裝的、對外提 供完整的、基於組件的 web 服務, 包含 Connectors、Container 兩個 核心組件,以及多個功能組件,各 個 Service 之間是獨立的,但是共享 同一 JVM 的資源 ;
Connector:Tomcat 與外部世界的連接器,監聽固定端口接收外部請求,傳遞給 Container,並 將 Container 處理的結果返回給外部;
Container:Catalina,Servlet 容器,內部有多層容器組成,用於管理 Servlet 生命周期,調用 servlet 相關方法。
Loader:封裝了 Java ClassLoader,用於 Container 加載類文件; Realm:Tomcat 中為 web 應用程序提供訪問認證和角色管理的機制;
JMX:Java SE 中定義技術規范,是一個為應用程序、設備、系統等植入管理功能的框架,通過 JMX 可以遠程監控 Tomcat 的運行狀態;
Jasper:Tomcat 的 Jsp 解析引擎,用於將 Jsp 轉換成 Java 文件,並編譯成 class 文件。 Session:負責管理和創建 session,以及 Session 的持久化(可自定義),支持 session 的集
群。
Pipeline:在容器中充當管道的作用,管道中可以設置各種 valve(閥門),請求和響應在經由管 道中各個閥門處理,提供了一種靈活可配置的處理請求和響應的機制。
Naming:命名服務,JNDI, Java 命名和目錄接口,是一組在 Java 應用中訪問命名和目錄服務的 API。命名服務將名稱和對象聯系起來,使得我們可以用名稱訪問對象,目錄服務也是一種命名 服務,對象不但有名稱,還有屬性。Tomcat 中可以使用 JNDI 定義數據源、配置信息,用於開發 與部署的分離。
Container組成
Engine:Servlet 的頂層容器,包含一 個或多個 Host 子容器;
Host:虛擬主機,負責 web 應用的部 署和 Context 的創建;
Context:Web 應用上下文,包含多個 Wrapper,負責 web 配置的解析、管 理所有的 Web 資源;
Wrapper:最底層的容器,是對 Servlet 的封裝,負責 Servlet 實例的創 建、執行和銷毀。
生命周期管理
Tomcat 為了方便管理組件和容器的生命周期,定義了從創建、啟動、到停止、銷毀共 12 中狀態,tomcat 生命周期管理了內部狀態變化的規則控制,組件和容器只需實現相應的生命周期 方法即可完成各生命周期內的操作(initInternal、startInternal、stopInternal、 destroyInternal);
Servlet 是用 Java 編寫的服務器端程序。其主要功能在於交互式地瀏覽和修改數據,生成動態 Web 內容。
- 請求到達 server 端,server 根據 url 映射到相應的 Servlet
- 判斷 Servlet 實例是否存在,不存在則加載和實例化 Servlet 並調用 init 方法
- Server 分別創建 Request 和 Response 對象,調用 Servlet 實例的 service 方法(service 方法 內部會根據 http 請求方法類型調用相應的 doXXX 方法)
- doXXX 方法內為業務邏輯實現,從 Request 對象獲取請求參數,處理完畢之后將結果通過 response 對象返回給調用方
- 當 Server 不再需要 Servlet 時(一般當 Server 關閉時),Server 調用 Servlet 的 destroy() 方 法。
比如執行初始化操作時,會判斷當前狀態是否 New,如果不是則拋出生命周期異常;是的 話則設置當前狀態為 Initializing,並執行 initInternal 方法,由子類實現,方法執行成功則設置當 前狀態為 Initialized,執行失敗則設置為 Failed 狀態;
Tomcat 的生命周期管理引入了事件機制,在組件或容器的生命周期狀態發生變化時會通 知事件監聽器,監聽器通過判斷事件的類型來進行相應的操作。
事件監聽器的添加可以在 server.xml 文件中進行配置;
Tomcat 各類容器的配置過程就是通過添加 listener 的方式來進行的,從而達到配置邏輯與 容器的解耦。如 EngineConfig、HostConfig、ContextConfig。
EngineConfig:主要打印啟動和停止日志
HostConfig:主要處理部署應用,解析應用 META-INF/context.xml 並創建應用的 Context ContextConfig:主要解析並合並 web.xml,掃描應用的各類 web 資源 (filter、servlet、listener)
