詳解Java Web項(xiàng)目啟動(dòng)執(zhí)行順序
一、web.xml配置節(jié)點(diǎn)簡(jiǎn)介
(1) context-param
格式定義
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-mybatis.xml</param-value> </context-param>
作用:
- 該元素用來聲明應(yīng)用范圍(整個(gè)WEB項(xiàng)目)內(nèi)的上下文初始化參數(shù)。
- param-name 設(shè)定上下文的參數(shù)名稱。必須是唯一名稱
- param-value 設(shè)定的參數(shù)名稱的值,這里的例子是指定spring配置文件的位置
(2) listener
格式定義
//listen-class 指定監(jiān)聽類,該類繼承ServletContextListener 包含初始化方法contextInitialized(ServletContextEvent event) 和銷毀方法contextDestoryed(ServletContextEvent event) <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
作用:該元素用來注冊(cè)一個(gè)監(jiān)聽器類??梢允盏绞录裁磿r(shí)候發(fā)生以及用什么作為響應(yīng)的通知。事件監(jiān)聽程序在建立、修改和刪除會(huì)話或servlet環(huán)境時(shí)得到通知。常與context-param聯(lián)合使用。
(3) filter
格式定義
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
作用:用于指定WEB容器的過濾器, filter能夠在一個(gè)請(qǐng)求到達(dá)servlet之前預(yù)處理用戶請(qǐng)求,也可以在離開servlet時(shí)處理http響應(yīng);在執(zhí)行servlet之前,首先執(zhí)行filter程序,并為之做一些預(yù)處理工作;根據(jù)程序需要修改請(qǐng)求和響應(yīng);在servlet被調(diào)用之后截獲servlet的執(zhí)行。
(4)servlet
- 格式定義
//配置Spring MVC,指定處理請(qǐng)求的Servlet,有兩種方式: //1. 默認(rèn)查找MVC配置文件的地址是:/WEB-INF/${servletName}-servlet.xml //2. 可以通過配置修改MVC配置文件的位置,需要在配置DispatcherServlet時(shí)指定MVC配置文件的位置。 //這里使用的是第二種方式 <!-- Springmvc的核心控制器 --> <servlet> <servlet-name>dispatchServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatchServlet</servlet-name> <url-pattern>*.shtml</url-pattern> </servlet-mapping>
作用:
- 創(chuàng)建并返回一個(gè)包含基于客戶請(qǐng)求性質(zhì)的動(dòng)態(tài)內(nèi)容的完整的html頁(yè)面;
- 創(chuàng)建可嵌入到現(xiàn)有的html頁(yè)面中的一部分html頁(yè)面(html片段);
- 讀取客戶端發(fā)來的隱藏?cái)?shù)據(jù);
- 讀取客戶端發(fā)來的顯示數(shù)據(jù);
- 與其他服務(wù)器資源(包括數(shù)據(jù)庫(kù)和java的應(yīng)用程序)進(jìn)行通信;
二、 web.xml加載過程(步驟):
- 啟動(dòng)web項(xiàng)目,容器(如Tomcat、Apache)會(huì)去讀取它的配置文件web.xml 中的兩個(gè)節(jié)點(diǎn),context-param和listener。
- 緊接著,容器將創(chuàng)建一個(gè)ServletContext(又稱為:Servlet上下文),應(yīng)用范圍內(nèi)即整個(gè)WEB項(xiàng)目都能使用這個(gè)Servlet上下文。
- 容器將< context-param >轉(zhuǎn)化為鍵值對(duì),并交給ServletContext。
- 容器創(chuàng)建< listener >中的類實(shí)例,即創(chuàng)建監(jiān)聽。(備注:listener定義的類可以是自定義的類但必須需要繼承ServletContextListener)。
- 在監(jiān)聽中會(huì)有contextInitialized(ServletContextEvent args)初始化方法,在這個(gè)方法中獲得:ServletContext = ServletContextEvent.getServletContext(); context-param的值 = ServletContext.getInitParameter(“context-param的鍵”); 在這個(gè)類中還必須有一個(gè)contextDestroyed(ServletContextEvent event) 銷毀方法。用于關(guān)閉應(yīng)用前釋放資源,比如說數(shù)據(jù)庫(kù)連接的關(guān)閉。
- 得到這個(gè)context-param的值之后,你就可以做一些操作了。注意,這個(gè)時(shí)候你的WEB項(xiàng)目還沒有完全啟動(dòng)完成。這個(gè)動(dòng)作會(huì)比所有的Servlet都要早。換句話說,這個(gè)時(shí)候,你對(duì) < context-param > 中的鍵值做的操作,將在你的WEB項(xiàng)目完全啟動(dòng)之前被執(zhí)行。
- 舉例.你可能想在項(xiàng)目啟動(dòng)之前就打開數(shù)據(jù)庫(kù)。那么這里就可以在< context-param >中設(shè)置數(shù)據(jù)庫(kù)的連接方式,在監(jiān)聽類中初始化數(shù)據(jù)庫(kù)的連接。
補(bǔ)充知識(shí):ServletContext,是一個(gè)全局的儲(chǔ)存信息的空間,服務(wù)器開始,其就存在,服務(wù)器關(guān)閉,其才釋放。request,一個(gè)用戶可有多個(gè);session,一個(gè)用戶一個(gè);而servletContext,所有用戶共用一個(gè)。所以,為了節(jié)省空間,提高效率,ServletContext中,要放必須的、重要的、所有用戶需要共享的線程又是安全的一些信息。例如,一個(gè)購(gòu)物網(wǎng)站,用戶要訪問商品的詳細(xì)信息,如果放在session域,每個(gè)用戶都要訪問一遍數(shù)據(jù)庫(kù),這樣效率太低;而放在ServletContext中,服務(wù)器一啟動(dòng),就訪問數(shù)據(jù)庫(kù)將商品信息放入數(shù)據(jù)庫(kù),這樣所有用戶只需要通過上下文就能訪問到商品的信息。
三、web.xml節(jié)點(diǎn)加載順序:
- web.xml節(jié)點(diǎn)的加載順序與它們?cè)趙eb.xml中位置的先后無(wú)關(guān),即不會(huì)因?yàn)?lt; filter >寫在< context-param >前面就先加載< filter >。
- 上文也提到到了,< context-param >用于對(duì)ServletContext提供鍵值對(duì),即應(yīng)用程序的上下文信息。而listener、servlet等節(jié)點(diǎn)在初始化的過程中會(huì)使用到這些上下文信息,所以最后我們得出web.xml節(jié)點(diǎn)的加載順序應(yīng)該為:context-param->listener->filter->servlet。
- 對(duì)于某類配置節(jié)點(diǎn)而言,位置的先后是有要求的。以servlet舉例,與servlet相關(guān)的配置節(jié)點(diǎn)是servlet-mapping,對(duì)于擁有相同配置節(jié)servlet-name的servlet和servlet-mapping來說,servlet-mapping必須在servlet后定義,否則當(dāng)解析到servlet-mapping時(shí),它的servlet-name還沒有定義。web 容器啟動(dòng)時(shí)初始化每個(gè) servlet時(shí),是按照 servlet配置節(jié)出現(xiàn)的順序來初始化的。
- 最終結(jié)論: web.xml 的加載順序是:[context-param -> listener -> filter -> servlet -> spring] ,而同類型節(jié)點(diǎn)之間的實(shí)際程序調(diào)用的時(shí)候的順序是根據(jù)對(duì)應(yīng)的 mapping 的順序進(jìn)行調(diào)用的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Javaweb項(xiàng)目啟動(dòng)Tomcat常見的報(bào)錯(cuò)解決方案
- java 實(shí)現(xiàn)web項(xiàng)目啟動(dòng)加載properties屬性文件
- Java web項(xiàng)目啟動(dòng)Tomcat報(bào)錯(cuò)解決方案
- IDEA JavaWeb項(xiàng)目啟動(dòng)運(yùn)行后出現(xiàn)404錯(cuò)誤的解決方法
- java如何實(shí)現(xiàn)項(xiàng)目啟動(dòng)時(shí)執(zhí)行指定方法
- 解決JAVA項(xiàng)目啟動(dòng)卡住,無(wú)任何異常信息的問題
相關(guān)文章
idea中Java實(shí)體類怎樣生成序列化的版本號(hào)的方法
這篇文章主要介紹了idea中Java實(shí)體類怎樣生成序列化的版本號(hào)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11SpringMVC使用注解實(shí)現(xiàn)登錄功能
這篇文章主要為大家詳細(xì)介紹了SpringMVC使用注解實(shí)現(xiàn)登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09關(guān)于swagger配置及踩坑@Api參數(shù)postion無(wú)效解決接口排序問題
這篇文章主要介紹了關(guān)于swagger配置及踩坑@Api參數(shù)postion無(wú)效解決接口排序問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06springcloud使用profile實(shí)現(xiàn)多環(huán)境配置方式
這篇文章主要介紹了springcloud使用profile實(shí)現(xiàn)多環(huán)境配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03JavaApi實(shí)現(xiàn)更新刪除及讀取節(jié)點(diǎn)
這篇文章主要介紹了JavaApi實(shí)現(xiàn)更新刪除及讀取節(jié)點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05淺談maven 多環(huán)境打包發(fā)布的兩種方式
這篇文章主要介紹了淺談maven 多環(huán)境打包發(fā)布的兩種方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08