web.xml的載入過程配置詳解

來源:互聯網
上載者:User

標籤:上下   roo   設計   共用   完全   結構   自動   res   project   

 

 一:web.xml載入過程

  簡單說一下,web.xml的載入過程。當我們啟動一個WEB項目容器時,容器包括(JBoss,Tomcat等)。首先會去讀取web.xml設定檔裡的配置,當這一步驟沒有出錯並且完成之後,項目才能正常的被啟動起來。

  啟動WEB項目的時候,容器首先會去讀取web.xml設定檔中的兩個節點:<listener> </listener>和<context-param> </context-param>

  

  緊接著,容器建立一個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中出現了相同的元素,則按照在設定檔中出現的先後順序來載入。

  二:web.xml標籤詳解

  1.<web-app></web-app>

  <web-app></web-app>是部署描述的根項目,該元素含23個子項目。在Servlet2.3中,子項目必須按照DTD檔案描述中指定的順序出現。比如:如果部署描述符中的<web-app>元素有<servlet>和<servlet-mapping>兩個子項目,則<servlet>子項目必須出現在<servlet-mapping>子項目之前。在Servlet2.4中,順序並不重要。

  2.<display-name></display-name> 

  <display-name></display-name>定義web應用的名稱。如<display-name>trk-order-rest</display-name>

  3.<distributable/>

  <distributable/>可以使用distributable元素來告訴servlet/JSP容器,Web容器中部署的應用程式適合在分布式環境下運行。

  4.<context-param></context-param>

  

  <context-param>元素含有一對參數名和參數值,用作應用的Servlet上下文初始化參數,參數名在整個Web應用中必須是惟一的,在web應用的整個生命週期中上下文初始化參數都存在,任意的Servlet和jsp都可以隨時隨地訪問它。<param-name>子項目包含有參數名,而<param-value>子項目包含的是參數值。作為選擇,可用<description>子項目來描述參數。

  配置Spring,必須需要<listener>,而<context-param>可有可無,如果在web.xml中不寫<context-param>配置資訊,預設的路徑是/WEB-INF/applicationContext.xml,在WEB-INF目錄下建立的xml檔案的名稱必須是applicationContext.xml。如果是要自訂檔案名稱可以在web.xml裡加入contextConfigLocation這個context參數:在<param-value>裡指定相應的xml檔案名稱,如果有多個xml檔案,可以寫在一起並以“,”號分隔,比如在business-client工程中,我們採用了自訂配置方式,<context-param>配置如下:

  

  配置在同一個容器中的多個web項目,要配置不同的webAppRootKey,web.xml檔案中最好定義webAppRootKey參數,如果不定義,將會預設為“webapp.root”,為防止log4j配置衝突,每個項目配置不同的webAppRootKey。如下:

  

  當然也不能重複,否則報類似下面的錯誤:

  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> 用於設定容器的session參數,比如:<session-timeout>用於指定http session的失效時間。預設時間設定(30minutes)。<session-timeout>用來指定預設的會話逾時時間間隔,以分鐘為單位。該元素值為整數。如果 session-timeout元素的值為零或負數,則表示會話將永遠不會逾時。

  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通常稱為服務端小程式,是服務端的程式,用於處理及響應客戶的請求。Servlet是一個特殊的Java類,建立Servlet類自動繼承HttpServlet。用戶端通常只有GET和POST兩種請求方式,Servlet為了響應這兩種請求,必須重寫doGet()和doPost()方法。大部分時候,Servlet對於所有的請求響應都是完全一樣的,此時只需要重寫service()方法即可響應用戶端的所有請求。另外HttpServlet有兩個方法:

  init(ServletConfig config):建立Servlet執行個體時,調用該方法初始化Servlet資源。

  destory():銷毀Servlet執行個體時,自動調用該方法回收資源。

  通常無需重寫init()和destory()兩個方法,除非需要在初始化Servlet時,完成某些資源初始化的方法,才考慮重寫init()方法。如果重寫了init()方法,應該在重寫該方法的第一行調用super.init(config),該方法將調用HttpServlet的init()方法。如果需要在銷毀Servlet之前,先完先完成某些資源的回收,比如關閉資料庫連結,才需要重寫destory()方法。

  8.2.Servlet的生命週期

  建立Servlet執行個體有兩個時機:

  用戶端第一次請求某個Servlet時,系統建立該Servlet的執行個體,大部分Servlet都是這種Servlet;

  web應用啟動時立即建立Servlet執行個體,即<load-on-start>1</laod-on-start>(LZ有篇文章詳細說明:http://www.cnblogs.com/vanl/p/5756122.html)

  每個Servlet的運行都遵循如下生命週期:

  (1)建立Servlet執行個體。

  (2)Web容器調用Servlet的init()方法,對Servlet進行初始化。

  (3)Servlet初始化之後,將一直存在與容器之中,用於響應用戶端請求,如果用戶端發送GET請求,容器調用Servlet的doGet()方法處理並響應請求;如果用戶端發送POST請求,容器調用Servlet的doPost()方法處理並響應請求。或者統一使用service()方法處理來響應使用者請求。

  (4)Web容器決定銷毀Servlet時,先調用Servlet的destory()方法,通常在關閉Web應用時銷毀Servlet執行個體。

  8.3.Servlet的配置

  為了讓Servlet能響應使用者請求,還必須將Servlet配置在web應用中,配置Servlet需要修改web.xml檔案。從Servlet3.0開始,配置Servlet有兩種方式:

  (1)在Servlet類中使用基於註解的方式進行配置:@WebServlet

  (2)在web.xml檔案中進行配置。

  

  我們用web.xml檔案來配置Servlet,需要配置<servlet>和<servlet-mapping>。<servlet>用來聲明一個Servlet。<icon>、<display-name>和<description>元素的用法和<filter>的用法相同。<init-param>元素與<context-param>元素具有相同的元素描述符,可以使用<init-param>子項目將初始化參數名和參數值傳遞給Servlet,訪問Servlet配置參數通過ServletConfig對象來完成,ServletConfig提供如下方法:

  java.lang.String.getInitParameter(java.lang.String name):用於擷取初始化參數

  ServletConfig擷取配置參數的方法和ServletContext擷取配置參數的方法完全一樣,只是ServletContex是取得當前Servlet的配置參數,而ServletContext是擷取整個web應用的配置參數。

  8.4.配置Spring MVC的Servlet

  

  配置Spring MVC,指定處理請求的Servlet,有兩種方式:

  (1)預設尋找MVC設定檔的地址是:/WEB-INF/${servletName}-servlet.xml。

  (2)可以通過修改設定檔的位置,需要在配置DispatcherServlet時指定MVC設定檔的位置。

  我們在平台項目兩個工程中分別使用了不同的配置方式,介紹如下:

  我們在business-client工程中按照預設尋找MVC的設定檔,設定檔目錄為: /WEB-INF/business-servlet.xml。工程目錄結構如下所示:

  

  我們在public-base-server工程中,通過第2種方式進行配置,把spring-servlet.xml放到src/main/resources/config/spring-servlet.xml,則需要在配置DispatcherServlet時指定<init-param>標籤。具體代碼如下:

  

  工程目錄結構如下:

  

  其中,classpath是web項目的類路徑,可以理解為classes目錄下面。因為無論這些設定檔放在哪裡,編譯之後沒有特殊情況的話都直接在classes下面。在我們的工程裡,經過驗證,maven工程這兩個

  

  路徑經過編譯後產生的檔案都位於classes目錄下,即這兩個路徑相當於類路徑,在下面建立config檔案夾(folder),建立自訂的xml設定檔即可。

  8.5.classpath與classpath*區別

  同名資源存在時,classpath只從第一個合格classpath中載入資源,而classpath*會從所有的classpath中載入合格資源。classpath*,需要遍曆所有的classpath,效率肯定比不上classpath,因此在項目設計的初期就盡量規劃好資源檔所在的路徑,避免使用classpath*來載入。

  8.6.ContextLoaderListener和DispatcherServlet初始化上下文關係和區別

  

  從可以看出,ContextLoaderListener初始化的上下文載入的Bean是對於整個應用程式共用的,一般如:DAO層、Service層Bean;DispatcherServlet初始化的上下文載入的Bean是只對Spring MVC有效Bean,如:Controller、HandlerMapping、HandlerAdapter等,該初始化上下文只載入Web相關組件。

  注意:使用者可以配置多個DispatcherServlet來分別處理不同的url請求,每個DispatcherServlet上下文都對應一個自己的子Spring容器,他們都擁有相同的父Spring容器(業務層,持久(dao)bean所在的容器)。

  9.<welcome-file-list></welcome-file-list>

  

  <welcome-file-list>包含一個子項目<welcome-file>,<welcome-file>用來指定首頁檔案名稱。<welcome-file-list>元素可以包含一個或多個<welcome-file>子項目。如果在第一個<welcome-file>元素中沒有找到指定的檔案,Web容器就會嘗試顯示第二個,以此類推。

 

web.xml的載入過程配置詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.