一、我們知道,tomcat可以由org.apache.catalina.startup.Bootstrap這個類啟動,這個類型做了兩件事情:
1、指定classloader
2、引導Catalina啟動,使用reflection反射技術,調用org.apache.catalina.startup.Catalina的process()方法, 並傳遞參數過去。public void process(String args[])
Catalina.java的process()做幾件事:
a: 使用Digester技術裝配tomcat各個容器與組件(server.xml檔案載入);
b: 為top level的server做初始化工作
c: 從Server這個容器開始啟動,————轉下一步(二)
d: 為Server做一個hook程式,當Server 關閉時,關閉整個Tomact容器
e: 監聽8005連接埠,如果發shutdown,關閉8005連接埠的socket
二、啟動容器
Server(代表整個容器):觸發Server容器中的啟動前、啟動中、啟動後事件,並運行事件處理器。
Server---->啟動Server的子容器Service(指定提供服務的組件,server.xml中可以配置一個或多個)
<!-- A "Service" is a collection of one or more "Connectors" that share a single "Container" Note: A "Service" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level. Documentation at /docs/config/service.html -->
Service----> 啟動子容器Engine,啟動Connector(每個Service只有一個Engine,可以有多個Connector)
Engine中指定了處理所有Connector接受到的客戶請求的Host主機名稱。
Connector定義了服務的連接埠號碼,負責接受客戶的請求和向客戶返回相應結果。
Engine----> Host(一個或多個,每個Host表示一個虛擬機器主機,可以包含一個或多個web應用)
Host ---->Context(每個Context代表運行在Host上的單個Web應用.)
StandardContext.start() 這個啟動Context容器的方法被StandardHost調用:
1、指定Loader,用預設的org.apache.catalina.loader.WebappLoader,Loader就是用來指定這個context會用到哪些類, 哪些jar包。
2、指定 Manager. 通常使用預設的org.apache.catalina.session. StandardManager 。 Manager是用來管理session的。得到請求後,Request中有一個session屬性。
3、Binding thread。到了這裡, 就應該發生 class Loader 互換了。 之前是看得見tomcat下面所有的class和lib. 接下來需要看得見當前context下的class。 所以要設定contextClassLoader, 同時還要把舊的ClassLoader記錄下來,因為以後還要用的。
4、啟動 Loader. 指定這個Context具體要使用哪些classes, 用到哪些jar檔案。 如果reloadable設定成了true, 就會啟動一個線程來監視classes的變化, 如果有變化就重新啟動Context。
5、啟動logger
6、觸發Context上的監聽器,作為監聽器之一,ContextConfig會被啟動. ContextConfig就是用來配置web.xml的。 比如這個Context有多少Servlet, 又有多少Filter, 就是在這裡給Context裝上去的。
6.1、 defaultConfig. 每個context都得配置 tomcat/conf/web.xml 這個檔案。
6.2、 applicationConfig 配置自己的 WEB-INF/web.xml 檔案
6.3、 validateSecurityRoles 許可權驗證。 通常我們在訪問/admin 或者/manager的時候,需要使用者要麼是admin的要麼是manager的, 才能訪問。 而且我們還可以限制那些資源可以訪問, 而哪些不能。 都是在這裡實現的。
6.4、 tldScan: 掃描一下, 需要用到哪些標籤(tag lab)
7、啟動manager
8、postWelcomeFiles() 我們通常會用到的3個開機檔案的名稱:
index.html、index.htm、index.jsp 就被預設地綁在了這個context上
9、 listenerStart 配置listener,初始化Listener
10、 filterStart 配置 filter,初始化Filter
11、 啟動帶有<load-on-startup>;1</load-on-startup>;的Servlet.
順序是從小到大: 1,2,3… 最後是0
預設情況下, 至少會啟動如下3個的Servlet:
org.apache.catalina.servlets.DefaultServlet
處理靜態資源的Servlet. 什麼圖片啊, html啊, css啊, js啊都找他
org.apache.catalina.servlets.InvokerServlet
處理沒有做Servlet Mapping的那些Servlet.
org.apache.jasper.servlet.JspServlet
處理JSP檔案的.
12、 標識context已經啟動完畢。
關鍵代碼以後會補上。。