web.xml結(jié)構(gòu)

一:web.xml加載過程
  簡單說一下端三,web.xml的加載過程鹃彻。當(dāng)我們啟動一個WEB項(xiàng)目容器時(shí)蛛株,容器包括(JBoss,Tomcat等)。首先會去讀取web.xml配置文件里的配置欢摄,當(dāng)這一步驟沒有出錯并且完成之后,項(xiàng)目才能正常的被啟動起來锹引。
  啟動WEB項(xiàng)目的時(shí)候嫌变,容器首先會去讀取web.xml配置文件中的兩個節(jié)點(diǎn):<listener> </listener>和<context-param> </context-param>如圖:
  


  緊接著腾啥,容器創(chuàng)建一個ServletContext(application),這個web項(xiàng)目的所有部分都將共享這個上下文。容器以<context-param></context-param>的name作為鍵疮跑,value作為值祖娘,將其轉(zhuǎn)化為鍵值對,存入ServletContext掀潮∫前桑  
  容器創(chuàng)建<listener></listener>中的類實(shí)例鞠眉,根據(jù)配置的class類路徑<listener-class>來創(chuàng)建監(jiān)聽凡蚜,在監(jiān)聽中會有初始化方法,啟動Web應(yīng)用時(shí)恶迈,系統(tǒng)調(diào)用Listener的該方法 contextInitialized(ServletContextEvent args)暇仲,在這個方法中獲得:
  ServletContext application =ServletContextEvent.getServletContext();
  context-param的值= application.getInitParameter("context-param的鍵");
  得到這個context-param的值之后副渴,你就可以做一些操作了煮剧。
  舉例:你可能想在項(xiàng)目啟動之前就打開數(shù)據(jù)庫,那么這里就可以在<context-param>中設(shè)置數(shù)據(jù)庫的連接方式(驅(qū)動佑颇、url挑胸、user宰闰、password),在監(jiān)聽類中初始化數(shù)據(jù)庫的連接老充。這個監(jiān)聽是自己寫的一個類舆逃,除了初始化方法路狮,它還有銷毀方法虫啥,用于關(guān)閉應(yīng)用前釋放資源。比如:說數(shù)據(jù)庫連接的關(guān)閉奄妨,此時(shí)涂籽,調(diào)用contextDestroyed(ServletContextEvent args),關(guān)閉Web應(yīng)用時(shí)砸抛,系統(tǒng)調(diào)用Listener的該方法评雌。
  接著,容器會讀取<filter></filter>直焙,根據(jù)指定的類路徑來實(shí)例化過濾器。
  以上都是在WEB項(xiàng)目還沒有完全啟動起來的時(shí)候就已經(jīng)完成了的工作奔誓。如果系統(tǒng)中有Servlet斤吐,則Servlet是在第一次發(fā)起請求的時(shí)候被實(shí)例化的,而且一般不會被容器銷毀厨喂,它可以服務(wù)于多個用戶的請求和措。所以,Servlet的初始化都要比上面提到的那幾個要遲蜕煌∨哨澹總的來說,web.xml的加載順序是: <context-param>-> <listener> -> <filter> -> <servlet>斜纪。其中贫母,如果web.xml中出現(xiàn)了相同的元素,則按照在配置文件中出現(xiàn)的先后順序來加載盒刚。
  二:web.xml標(biāo)簽詳解
  1.<web-app></web-app>
  <web-app></web-app>是部署描述的根元素腺劣,該元素含23個子元素。在Servlet2.3中伪冰,子元素必須按照DTD文件描述中指定的順序出現(xiàn)誓酒。比如:如果部署描述符中的<web-app>元素有<servlet>和<servlet-mapping>兩個子元素樟蠕,則<servlet>子元素必須出現(xiàn)在<servlet-mapping>子元素之前贮聂。在Servlet2.4中靠柑,順序并不重要。
  2.<display-name></display-name> 
  <display-name></display-name>定義web應(yīng)用的名稱吓懈。如<display-name>trk-order-rest</display-name>
  3.<distributable/>
  <distributable/>可以使用distributable元素來告訴servlet/JSP容器歼冰,Web容器中部署的應(yīng)用程序適合在分布式環(huán)境下運(yùn)行。
  4.<context-param></context-param>
  

  <context-param>元素含有一對參數(shù)名和參數(shù)值耻警,用作應(yīng)用的Servlet上下文初始化參數(shù)隔嫡,參數(shù)名在整個Web應(yīng)用中必須是惟一的,在web應(yīng)用的整個生命周期中上下文初始化參數(shù)都存在甘穿,任意的Servlet和jsp都可以隨時(shí)隨地訪問它腮恩。<param-name>子元素包含有參數(shù)名,而<param-value>子元素包含的是參數(shù)值温兼。作為選擇秸滴,可用<description>子元素來描述參數(shù)。
  配置Spring募判,必須需要<listener>荡含,而<context-param>可有可無,如果在web.xml中不寫<context-param>配置信息届垫,默認(rèn)的路徑是/WEB-INF/applicationContext.xml释液,在WEB-INF目錄下創(chuàng)建的xml文件的名稱必須是applicationContext.xml。如果是要自定義文件名可以在web.xml里加入contextConfigLocation這個context參數(shù):在<param-value>里指定相應(yīng)的xml文件名装处,如果有多個xml文件误债,可以寫在一起并以“,”號分隔,比如在business-client工程中符衔,我們采用了自定義配置方式找前,<context-param>配置如下:
  

  配置在同一個容器中的多個web項(xiàng)目,要配置不同的webAppRootKey判族,web.xml文件中最好定義webAppRootKey參數(shù)躺盛,如果不定義,將會缺省為“webapp.root”形帮,為防止log4j配置沖突槽惫,每個項(xiàng)目配置不同的webAppRootKey。如下:
  

  當(dāng)然也不能重復(fù)辩撑,否則報(bào)類似下面的錯誤:
  Web app root system property already set to different value: 'webapp.root' = [/home/user/tomcat/webapps/project1/] instead of   [/home/user/tomcat/webapps/project2/] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!
  5.<session-config></session-config>
  

  <session-config> 用于設(shè)置容器的session參數(shù)界斜,比如:<session-timeout>用于指定http session的失效時(shí)間。默認(rèn)時(shí)間設(shè)置(30minutes)合冀。<session-timeout>用來指定默認(rèn)的會話超時(shí)時(shí)間間隔各薇,以分鐘為單位。該元素值為整數(shù)。如果 session-timeout元素的值為零或負(fù)數(shù)峭判,則表示會話將永遠(yuǎn)不會超時(shí)开缎。
  6.<filter></filter>見我的博客,這里不在闡述林螃。(http://www.cnblogs.com/vanl/p/5742501.html)
  

  7.<listener></listener>見我的博客奕删,這里不在闡述。(http://www.cnblogs.com/vanl/p/5753722.html)
  

  8.<servlet></servlet>
  8.1.Servlet介紹
  Servlet通常稱為服務(wù)端小程序疗认,是服務(wù)端的程序完残,用于處理及響應(yīng)客戶的請求。Servlet是一個特殊的Java類横漏,創(chuàng)建Servlet類自動繼承HttpServlet谨设。客戶端通常只有GET和POST兩種請求方式缎浇,Servlet為了響應(yīng)這兩種請求铝宵,必須重寫doGet()和doPost()方法。大部分時(shí)候华畏,Servlet對于所有的請求響應(yīng)都是完全一樣的鹏秋,此時(shí)只需要重寫service()方法即可響應(yīng)客戶端的所有請求。另外HttpServlet有兩個方法:
  init(ServletConfig config):創(chuàng)建Servlet實(shí)例時(shí)亡笑,調(diào)用該方法初始化Servlet資源侣夷。
  destory():銷毀Servlet實(shí)例時(shí),自動調(diào)用該方法回收資源仑乌。
  通常無需重寫init()和destory()兩個方法百拓,除非需要在初始化Servlet時(shí),完成某些資源初始化的方法晰甚,才考慮重寫init()方法衙传。如果重寫了init()方法,應(yīng)該在重寫該方法的第一行調(diào)用super.init(config),該方法將調(diào)用HttpServlet的init()方法厕九。如果需要在銷毀Servlet之前蓖捶,先完先完成某些資源的回收,比如關(guān)閉數(shù)據(jù)庫鏈接扁远,才需要重寫destory()方法俊鱼。
  8.2.Servlet的生命周期
  創(chuàng)建Servlet實(shí)例有兩個時(shí)機(jī):
  客戶端第一次請求某個Servlet時(shí),系統(tǒng)創(chuàng)建該Servlet的實(shí)例畅买,大部分Servlet都是這種Servlet并闲;
  web應(yīng)用啟動時(shí)立即創(chuàng)建Servlet實(shí)例,即<load-on-start>1</laod-on-start>(LZ有篇文章詳細(xì)說明:http://www.cnblogs.com/vanl/p/5756122.html)
  每個Servlet的運(yùn)行都遵循如下生命周期:
 」刃摺(1)創(chuàng)建Servlet實(shí)例帝火。
  (2)Web容器調(diào)用Servlet的init()方法,對Servlet進(jìn)行初始化犀填。
 ∶染(3)Servlet初始化之后,將一直存在與容器之中宏浩,用于響應(yīng)客戶端請求,如果客戶端發(fā)送GET請求靠瞎,容器調(diào)用Servlet的doGet()方法處理并響應(yīng)請求比庄;如果客戶端發(fā)送POST請求,容器調(diào)用Servlet的doPost()方法處理并響應(yīng)請求乏盐〖岩ぃ或者統(tǒng)一使用service()方法處理來響應(yīng)用戶請求。
 「改堋(4)Web容器決定銷毀Servlet時(shí)神凑,先調(diào)用Servlet的destory()方法,通常在關(guān)閉Web應(yīng)用時(shí)銷毀Servlet實(shí)例何吝。
  8.3.Servlet的配置
  為了讓Servlet能響應(yīng)用戶請求溉委,還必須將Servlet配置在web應(yīng)用中,配置Servlet需要修改web.xml文件爱榕。從Servlet3.0開始瓣喊,配置Servlet有兩種方式:
  (1)在Servlet類中使用基于注解的方式進(jìn)行配置:@WebServlet
 ∏帧(2)在web.xml文件中進(jìn)行配置藻三。
  

  我們用web.xml文件來配置Servlet,需要配置<servlet>和<servlet-mapping>跪者。<servlet>用來聲明一個Servlet棵帽。<icon>、<display-name>和<description>元素的用法和<filter>的用法相同渣玲。<init-param>元素與<context-param>元素具有相同的元素描述符逗概,可以使用<init-param>子元素將初始化參數(shù)名和參數(shù)值傳遞給Servlet,訪問Servlet配置參數(shù)通過ServletConfig對象來完成忘衍,ServletConfig提供如下方法:
  java.lang.String.getInitParameter(java.lang.String name):用于獲取初始化參數(shù)
  ServletConfig獲取配置參數(shù)的方法和ServletContext獲取配置參數(shù)的方法完全一樣仗谆,只是ServletContex是取得當(dāng)前Servlet的配置參數(shù),而ServletContext是獲取整個web應(yīng)用的配置參數(shù)淑履。
  8.4.配置Spring MVC的Servlet
  

  配置Spring MVC隶垮,指定處理請求的Servlet,有兩種方式:
  (1)默認(rèn)查找MVC配置文件的地址是:/WEB-INF/${servletName}-servlet.xml秘噪。
  (2)可以通過修改配置文件的位置狸吞,需要在配置DispatcherServlet時(shí)指定MVC配置文件的位置。
  我們在平臺項(xiàng)目兩個工程中分別使用了不同的配置方式,介紹如下:
  我們在business-client工程中按照默認(rèn)方式查找MVC的配置文件蹋偏,配置文件目錄為: /WEB-INF/business-servlet.xml便斥。工程目錄結(jié)構(gòu)如下所示:
  

  我們在public-base-server工程中,通過第2種方式進(jìn)行配置威始,把spring-servlet.xml放到src/main/resources/config/spring-servlet.xml枢纠,則需要在配置DispatcherServlet時(shí)指定<init-param>標(biāo)簽。具體代碼如下:
  

  工程目錄結(jié)構(gòu)如下:
  

  其中黎棠,classpath是web項(xiàng)目的類路徑晋渺,可以理解為classes目錄下面。因?yàn)闊o論這些配置文件放在哪里脓斩,編譯之后沒有特殊情況的話都直接在classes下面木西。在我們的工程里,經(jīng)過驗(yàn)證随静,maven工程這兩個
  

  路徑經(jīng)過編譯后生成的文件都位于classes目錄下八千,即這兩個路徑相當(dāng)于類路徑,在下面創(chuàng)建config文件夾(folder),創(chuàng)建自定義的xml配置文件即可燎猛。
  8.5.classpath與classpath區(qū)別
  同名資源存在時(shí)恋捆,classpath只從第一個符合條件的classpath中加載資源,而classpath
會從所有的classpath中加載符合條件的資源重绷。classpath鸠信,需要遍歷所有的classpath,效率肯定比不上classpath论寨,因此在項(xiàng)目設(shè)計(jì)的初期就盡量規(guī)劃好資源文件所在的路徑星立,避免使用classpath來加載。
  8.6.ContextLoaderListener和DispatcherServlet初始化上下文關(guān)系和區(qū)別
  

  從上圖可以看出葬凳,ContextLoaderListener初始化的上下文加載的Bean是對于整個應(yīng)用程序共享的绰垂,一般如:DAO層、Service層Bean火焰;DispatcherServlet初始化的上下文加載的Bean是只對Spring MVC有效的Bean劲装,如:Controller、HandlerMapping昌简、HandlerAdapter等占业,該初始化上下文只加載Web相關(guān)組件。
  注意:用戶可以配置多個DispatcherServlet來分別處理不同的url請求纯赎,每個DispatcherServlet上下文都對應(yīng)一個自己的子Spring容器谦疾,他們都擁有相同的父Spring容器(業(yè)務(wù)層,持久(dao)bean所在的容器)犬金。
  9.<welcome-file-list></welcome-file-list>
  

  <welcome-file-list>包含一個子元素<welcome-file>念恍,<welcome-file>用來指定首頁文件名稱六剥。<welcome-file-list>元素可以包含一個或多個<welcome-file>子元素。如果在第一個<welcome-file>元素中沒有找到指定的文件峰伙,Web容器就會嘗試顯示第二個疗疟,以此類推。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞳氓,一起剝皮案震驚了整個濱河市策彤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匣摘,老刑警劉巖店诗,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恋沃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)必指,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門囊咏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人塔橡,你說我怎么就攤上這事梅割。” “怎么了葛家?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵户辞,是天一觀的道長。 經(jīng)常有香客問我癞谒,道長底燎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任弹砚,我火速辦了婚禮双仍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桌吃。我一直安慰自己朱沃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布茅诱。 她就那樣靜靜地躺著逗物,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瑟俭。 梳的紋絲不亂的頭發(fā)上翎卓,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音摆寄,去河邊找鬼莲祸。 笑死蹂安,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锐帜。 我是一名探鬼主播田盈,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缴阎!你這毒婦竟也來了允瞧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蛮拔,失蹤者是張志新(化名)和其女友劉穎述暂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體建炫,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畦韭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肛跌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艺配。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖衍慎,靈堂內(nèi)的尸體忽然破棺而出转唉,到底是詐尸還是另有隱情,我是刑警寧澤稳捆,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布赠法,位于F島的核電站,受9級特大地震影響乔夯,放射性物質(zhì)發(fā)生泄漏砖织。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一末荐、第九天 我趴在偏房一處隱蔽的房頂上張望镶苞。 院中可真熱鬧,春花似錦鞠评、人聲如沸茂蚓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聋涨。三九已至,卻和暖如春负乡,著一層夾襖步出監(jiān)牢的瞬間牍白,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工抖棘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茂腥,地道東北人狸涌。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像最岗,于是被迫代替她去往敵國和親帕胆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理般渡,服務(wù)發(fā)現(xiàn)懒豹,斷路器,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • 本章聊一聊ServletContext 3.0規(guī)范中定義的注解以及在web應(yīng)用中使用的框架和庫的可插拔性的提升驯用。 ...
    Lucky_Micky閱讀 6,010評論 0 3
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,791評論 0 11
  • 作者:羅秉利脸秽,浙江省長興中學(xué)。 今年浙江省的高考作文題蝴乔,大意是:“人在一生中要讀三本大書记餐,分別是‘有字之書’、‘無...
    l書劍飄零l閱讀 797評論 0 2