JAVA Web.xml加載順序過程詳解
web.xml加載過程(步驟):
1.啟動WEB項目的時候,容器(如:Tomcat)會去讀它的配置文件web.xml.讀兩個節(jié)點:
<listener></listener> 和 <context-param></context-param>
2.緊接著,容器創(chuàng)建一個ServletContext(上下文),這個WEB項目所有部分都將共享這個上下文.
3.容器將<context-param></context-param>轉(zhuǎn)化為鍵值對,并交給ServletContext.
4.容器創(chuàng)建<listener></listener>中的類實例,即創(chuàng)建監(jiān)聽.
5.在監(jiān)聽中會有contextInitialized(ServletContextEvent args)初始化方法,在這個方法中獲得:
ServletContext = ServletContextEvent.getServletContext();
context-param的值 = ServletContext.getInitParameter("context-param的鍵");
6.得到這個context-param的值之后,你就可以做一些操作了.注意,這個時候你的WEB項目還沒有完全啟動完成.這個動作會比 所 有的Servlet都要早.
換句話說,這個時候,你對<context-param>中的鍵值做的操作,將在你的WEB項目完全啟動之前被執(zhí)行.
7.舉例.你可能想在項目啟動之前就打開數(shù)據(jù)庫.
那么這里就可以在<context-param>中設(shè)置數(shù)據(jù)庫的連接方式,在監(jiān)聽類中初始化數(shù)據(jù)庫的連接.
8.這個監(jiān)聽是自己寫的一個類,除了初始化方法,它還有銷毀方法.用于關(guān)閉應(yīng)用前釋放資源.比如說數(shù)據(jù)庫連接的關(guān)閉.
web.xml節(jié)點加載順序:
可以肯定的是,節(jié)點的加載順序與它們在 web.xml 文件中的先后順序無關(guān)。即不會因為 filter 寫在 listener 的前面而會先加載 filter。最終得出的結(jié)論是:listener -> filter -> servlet
同時還存在著這樣一種配置節(jié)點:context-param,它用于向 ServletContext 提供鍵值對,即應(yīng)用程序上下文信息。我們的 listener, filter 等在初始化時會用到這些上下文中的信息,那么 context-param 配置節(jié)是不是應(yīng)該寫在 listener 配置節(jié)前呢?實際上 context-param 配置節(jié)可寫在任意位置,因此真正的加載順序為:
context-param -> listener -> filter -> servlet
對于某類配置節(jié)而言,與它們出現(xiàn)的順序是有關(guān)的。以 filter 為例,web.xml 中當然可以定義多個 filter,與 filter 相關(guān)的一個配置節(jié)是 filter-mapping,這里一定要注意,對于擁有相同 filter-name 的 filter 和 filter-mapping 配置節(jié)而言,filter-mapping 必須出現(xiàn)在 filter 之后,否則當解析到 filter-mapping 時,它所對應(yīng)的 filter-name 還未定義。web 容器啟動時初始化每個 filter 時,是按照 filter 配置節(jié)出現(xiàn)的順序來初始化的,當請求資源匹配多個 filter-mapping 時,filter 攔截資源是按照 filter-mapping 配置節(jié)出現(xiàn)的順序來依次調(diào)用 doFilter() 方法的。
servlet 同 filter 類似,此處不再贅述。
【加載Spring】
比如filter 需要用到 bean ,但加載順序是: 先加載filter 后加載spring,則filter中初始化操作中的bean為null;
所以,如果過濾器中要使用到 bean,可以將spring 的加載 改成 Listener的方式 :
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
最終結(jié)論:
web.xml 的加載順序是:[context-param -> listener -> filter -> servlet -> spring] ,而同類型節(jié)點之間的實際程序調(diào)用的時候的順序是根據(jù)對應(yīng)的 mapping 的順序進行調(diào)用的。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JavaWeb項目web.xml中出現(xiàn)Element xxx is not allowed here問題
- Java web.xml之contextConfigLocation作用案例詳解
- JavaWeb工程web.xml基本配置過程解析
- web.xml中servlet, bean, filter, listenr 加載順序_動力節(jié)點Java學(xué)院整理
- web.xml詳解_動力節(jié)點Java學(xué)院整理
- JavaWeb中web.xml初始化加載順序詳解
- 淺談JavaWeb中的web.xml配置部署描述符文件
- BUUCTF-easy java WEB-INF/web.xml泄露漏洞及其利用方式
相關(guān)文章
Eclipse+Maven構(gòu)建Hadoop項目的方法步驟
這篇文章主要介紹了Eclipse+Maven構(gòu)建Hadoop項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02Java8新特性之lambda的作用_動力節(jié)點Java學(xué)院整理
我們期待了很久lambda為java帶來閉包的概念,但是如果我們不在集合中使用它的話,就損失了很大價值。現(xiàn)有接口遷移成為lambda風(fēng)格的問題已經(jīng)通過default methods解決了,在這篇文章將深入解析Java集合里面的批量數(shù)據(jù)操作解開lambda最強作用的神秘面紗。2017-06-06