項目:3個filter,3個servlet,匹配的url路徑/hello。html
狀況1:servlet沒加<load-on-startup></load-on-startup>狀況(web.xml配置順序:first filter,second filter,third filter,first servlet,second servlet,third servlet):web
結論:初始化只執行filter的init()方法,不執行servlet的init()的方法。請求/hello時,執行最後一個servlet的init()方法,再按順序執行filter。最後執行最後一個servlet的方法。
filter執行循序看<filter-mapping>的。servlet執行順序看<servlet-mapping>的。tomcat
狀況2:servlet加了<load-on-startup></load-on-startup>的狀況(配置順序同1)app
結論:容器初始化時,先初始化全部filter的init()方法。再初始化全部servlet的init()方法。且servlet的init()方法根據load-on-startup值決定執行順序,值越小,越先執行。在請求/hello時,再也不執行init()方法。執行循序同1.this
=======================================================================================================url
總結:spa
1).filter的init方法在容器初始化時加載。第一次加載容器執行順序隨機,之後再次加載順序以第一次加載順序爲準。
2).filter的doFilter方法在請求url時執行,若是有多個filter匹配,則按照<filter-mapping>順序執行(前提是doFilter方法裏面最後要調用FilterChain的doFilter方法,這個方法做用是繼續執行下個filter,若是沒有加,則不執行下面的filter).net
3).serlvet的init方法
a.若是web.xml中配置了<load-on-startup>屬性,則在Tomcat初始化時按其值從小到大的順序加載全部servlet的init方法。
b.若是沒有配置<load-on-startup>屬性,容器初始化時不加載。在請求匹配的url時進行加載,而且只加載最後一個servlet的init方法。其餘的servlet不加載。
4).servlet的doGet、doPost方法:在請求匹配的url路徑時加載,並且只加載最後一個servlet的方法,其餘方法不加載。 xml
5).filter和servlet同時存在,且容器初始化都要加載,則先加載filter再加載servlet的init方法。htm
6).若是請求的url既匹配filter又匹配servlet,而且servlet的init方法沒有在容器初始化加載,則先加載匹配的servlet的最後一個servlet的init方法,再按順序執行filter方法,最後再執行匹配的最後一個servlet方法。
注:
在servlet的配置當中,<load-on-startup>5</load-on-startup>的含義是:
標記容器是否在啓動的時候就加載這個servlet。
當值爲0或者大於0時,表示容器在應用啓動時就加載這個servlet;
當是一個負數時或者沒有指定時,則指示容器在該servlet被選擇時才加載。
正數的值越小,啓動該servlet的優先級越高。
1)load-on-startup元素標記容器是否在啓動的時候就加載這個servlet(實例化並調用其init()方法)。
2)它的值必須是一個整數,表示servlet應該被載入的順序
2)當值爲0或者大於0時,表示容器在應用啓動時就加載並初始化這個servlet;
3)當值小於0或者沒有指定時,則表示容器在該servlet被選擇時纔會去加載。
4)正數的值越小,該servlet的優先級越高,應用啓動時就越先加載。
5)當值相同時,容器就會本身選擇順序來加載。