順序:
總的來說,web.xml的加載順序是: <context-param>-> <listener> -> <filter> -> <servlet>。其中,如果web.xml中出現了相同的元素,則按照在配置文件中出現的先后順序來加載。
過程:
簡單說一下,web.xml的加載過程。當我們啟動一個WEB項目容器時,容器包括(JBoss,Tomcat等)。首先會去讀取web.xml配置文件里的配置,當這一步驟沒有出錯並且完成之后,項目才能正常的被啟動起來。
啟動WEB項目的時候,容器首先會去讀取web.xml配置文件中的兩個節點:<context-param> </context-param>和<listener> </listener>
緊接着,容器創建一個ServletContext(application),這個web項目的所有部分都將共享這個上下文。容器以<context-param></context-param>的name作為鍵,value作為值,將其轉化為鍵值對,存入ServletContext。
容器創建<listener></listener>中的類實例,根據配置的class類路徑<listener-class>來創建監聽,在監聽中會有初始化方法,啟動Web應用時,系統調用Listener的該方法 contextInitialized(ServletContextEvent args),在這個方法中獲得:
ServletContext application =ServletContextEvent.getServletContext();
context-param的值= application.getInitParameter("context-param的鍵");
得到這個context-param的值之后,你就可以做一些操作了。
舉例:你可能想在項目啟動之前就打開數據庫,那么這里就可以在<context-param>中設置數據庫的連接方式(驅動、url、user、password),在監聽類中初始化數據庫的連接。這個監聽是自己寫的一個類,除了初始化方法,它還有銷毀方法,用於關閉應用前釋放資源。比如:說數據庫連接的關閉,此時,調用contextDestroyed(ServletContextEvent args),關閉Web應用時,系統調用Listener的該方法。
接着,容器會讀取<filter></filter>,根據指定的類路徑來實例化過濾器。
以上都是在WEB項目還沒有完全啟動起來的時候就已經完成了的工作。如果系統中有Servlet,則Servlet是在第一次發起請求的時候被實例化的,而且一般不會被容器銷毀,它可以服務於多個用戶的請求。所以,Servlet的初始化都要比上面提到的那幾個要遲。
所以,根據加載過程可以看出,web.xml的加載順序是: <context-param>-> <listener> -> <filter> -> <servlet>。其中,如果web.xml中出現了相同的元素,則按照在配置文件中出現的先后順序來加載。