web.xml被文件加載過程,各節點加載順序總結

在項目中我們總會遇到關於加載的優先級問題,現在我就來講講web.xml在項目啓動過程中,裏面各個配置文件的加載順序

首先我要聲明的是,加載順序與它們在 web.xml 文件中的先後順序無關。並不會說誰寫在前面就先加載誰,那麼正常的順序應該是怎麼樣的呢?

下面是標準的web.xml文件

下面是web.xml的加載過程 :

web.xml的加載順序是:<context-param>-><listener>-><filter>-><servlet>

  1. 當我們啓動web項目的時候,容器(如Tomcat,JBoss)就會去讀取他的配置文件web.xml,讀到裏面的兩個點: <listener></listener> 和 <context-param></context-param>。
  2. 容器創建一個ServletContext(上下文),這個WEB項目所有部分都將共享這個上下文.(ServletContext是一個web應用的上下文,是一個全局信息的存儲空間,代表當前web應用。)
  3. 容器將<context-param></context-param>轉化爲鍵值對,並交給ServletContext。
  4. 容器創建<listener></listener>中的類實例,根據配置的class類路徑<listener-class>來創建監聽,在監聽中會有contextInitialized(ServletContextEvent args)初始化方法,啓動Web應用時,系統調用Listener的該方法,在這個方法中獲得:ServletContext application = ServletContextEvent.getServletContext();context-param的值 = application.getInitParameter("context-param的鍵"); 得到這個context-param的值之後,你就可以做一些操作了。
  5. 舉例:你可能想在項目啓動之前就打開數據庫,那麼這裏就可以在<context-param>中設置數據庫的連接方式(驅動、url、user、password),在監聽類中初始化數據庫的連接。這個監聽是自己寫的一個類,除了初始化方法,它還有銷燬方法,用於關閉應用前釋放資源。比如:說數據庫連接的關閉,此時,調用contextDestroyed(ServletContextEvent args),關閉Web應用時,系統調用Listener的該方法。
  6. 接着,容器會讀取<filter></filter>,根據指定的類路徑來實例化過濾器。
  7. 以上都是在WEB項目還沒有完全啓動起來的時候就已經完成了的工作。如果系統中有Servlet,則Servlet是在第一次發起請求的時候被實例化的,而且一般不會被容器銷燬,它可以服務於多個用戶的請求。所以,Servlet的初始化都要比上面提到的那幾個要遲。
  8. 總的來說,web.xml的加載順序是:<context-param>-><listener>-><filter>-><servlet>。其中,如果web.xml中出現了相同的元素,則按照在配置文件中出現的先後順序來加載。
  9. 對於某類元素而言,與它們出現的順序是有關的。以<filter>爲例,web.xml中當然可以定義多個<filter>,與<filter>相關的一個元素是<filter-mapping>,注意,對於擁有相同<filter-name>的<filter>和<filter-mapping>元素而言,<filter-mapping>必須出現在<filter>之後,否則當解析到<filter-mapping>時,它所對應的<filter-name>還未定義。web容器啓動初始化每個<filter>時,按照<filter>出現的順序來初始化的,當請求資源匹配多個<filter-mapping>時,<filter>攔截資源是按照<filter-mapping>元素出現的順序來依次調用doFilter()方法的。<servlet>同<filter>類似,此處不再贅述。

web.xml標籤詳解:

  • XML文檔有效性檢查:
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" >

這段代碼指定文件類型定義(DTD),可以通過它檢查XML文檔的有效性。下面顯示的<!DOCTYPE>元素有幾個特性,這些特性告訴我們關於DTD的信息:

 1. web-app定義該文檔(部署描述符,不是DTD文件)的根元素 

 2. PUBLIC意味着DTD文件可以被公開使用 

 3. -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN”意味着DTD由Sun Microsystems, Inc.維護。該信息也表示它描述的文檔類型是DTD Web Application 2.3,而且DTD是用英文書寫的。 

 4. URL"http://java.sun.com/dtd/web-app_2_3.dtd"表示D文件的位置

  • <web-app></web-app>

部署描述符的根元素是<web-app>。DTD文件規定<web-app>元素的子元素的語法如下:

<!ELEMENT web-app (icon?, display-name?, description?,distributable?, context-param*, filter*, filter-mapping*,listener*, servlet*, servlet-mapping*, session-config?,mime-mapping*, welcome-file-list?,error-page*, taglib*, resource-env-ref*, resource-ref*,security-constraint*, login-config?, security-role*,env-entry*,ejb-ref*, ejb-local-ref*)> 

正如您所看到的,這個元素含有23個子元素,而且子元素都是可選的。問號(?)表示子元素是可選的,而且只能出現一次。星號(*)表示子元素可在部署描述符中出現零次或多次。有些子元素還可以有它們自己的子元素。web.xml文件中<web-app>元素聲明的是下面每個子元素的聲明。下面講述部署描述符中可能包含的所有子元素。

注意:在Servlet 2.3中,子元素必須按照DTD文件語法描述中指定的順序出現。比如:如果部署描述符中的<web-app>元素有<servlet>和<servlet-mapping>兩個子元素,則<servlet>子元素必須出現在<servlet-mapping>子元素之前。在Servlet2.4中,順序並不重要。

  • <display-name></display-name>

<display-name>gswx-web-application</display-name>定義了web應用的名稱,在http://localhost:9010/manager/html中顯示。如下所示:

  • <distributable/>

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

  • <context-param></context-param>

使用上下文初始化參數

<!--****************************上下文初始化參數***************************-->
<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>business.root</param-value>
</context-param>
<!-- spring config -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:/applicationContext*.xml</param-value>
</context-param>

       <context-param>解釋:

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

      什麼情況下使用,爲什麼使用<context-param>:

比如:定義一個管理員email地址用來從程序發送錯誤,或者與你整個應用程序有關的其他設置。使用自己定義的設置文件需要額外的代碼和管理;直接在你的程序中使用硬編碼(Hard-coding)參數值會給你之後修改程序帶來麻煩,更困難的是,要根據不同的部署使用不同的設置;通過這種辦法,可以讓其他開發人員更容易找到相關的參數,因爲它是一個用於設置這種參數的標準位置。

       Spring配置文件:

配置Spring,必須需要<listener>,而<context-param>可有可無,如果在web.xml中不寫<context-param>配置信息,默認的路徑是/WEB-INF/applicationontext.xml,在WEB-INF目錄下創建的xml文件的名稱必須是applicationContext.xml。如果是要自定義文件名可以在web.xml里加入contextConfigLocation這個context參數:在<param-value>
</param-value>裏指定相應的xml文件名,如果有多個xml文件,可以寫在一起並以“,”號分隔,比如在business-client工程中,我們採用了自定義配置方式,<context-param>配置如下:

<context-param>   
	<param-name>contextConfigLocation</param-name>   
	<param-value>classpath*:/applicationContext*.xml</param-value>   
</context-param>
<listener>   
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
</listener>

部署在同一容器中的多個Web項目,要配置不同的webAppRootKey,web.xml文件中最好定義webAppRootKey參數,如果不定義,將會缺省爲“webapp.root”,如下:

<!-- 應用路徑  -->  
 <context-param>  
        <param-name>webAppRootKey</param-name>  
        <param-value>webapp.root</param-value>  
 </context-param>

當然也不能重複,否則報類似下面的錯誤:
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!  
意思是“webapp.root”這個key已經指向了項目1,不可以再指向項目2。多個項目要對webAppRootKey進行配置,我們工程主要是讓log4j能將日誌寫到對應項目根目錄下,比如:我們的項目的webAppRootKey爲

<!-- business-client應用路徑  -->  
<context-param>  
	<param-name>webAppRootKey</param-name>  
	<param-value> business.root </param-value>  
</context-param>  
<!-- public-base應用路徑  -->  
<context-param>  
	<param-name>webAppRootKey</param-name>  
	<param-value> pubbase.root</param-value>  
</context-param> 

這樣就不會出現衝突了。就可以在運行時動態地找到項目路徑,在log4j.properties配置文件中可以按下面的方式使用${webapp.root}:log4j.appender.file.File=${webapp.root}/WEB-INF/logs/sample.log 就可以在運行時動態地找出項目的路徑。

        多個配置文件交叉引用處理:

如果web.xml中有contextConfigLocation參數指定的Spring配置文件,則會去加載相應的配置文件,而不會去加載/WEB-INF/下的applicationContext.xml。但是如果沒有指定的話,默認會去/WEB-INF/下加載applicationContext.xml。
在一個團隊使用Spring的實際項目中,應該需要多個Spring的配置文件,如何使用和交叉引用的問題:
多個配置文件可以在web.xml裏用空格分隔寫入,如:

<context-param>
	<param-name>contextConfigLocation </param-name>
	<param-value>applicationContext-database.xml,applicationContext.xml</param-value>  
</context-param>

多個配置文件裏的交叉引用可以用ref的external或bean解決,例如:applicationContext.xml

<bean id="userService" class="domain.user.service.impl.UserServiceImpl"> 
	<property name="dbbean">
		<ref bean="dbBean"/>
	</property> 
</bean>

dbBean在applicationContext-database.xml中。

       在不同環境下如何獲取:範例:

<context-param>
	<param-name>param_name</param-name>
	<param-value>param_value</param-value>
</context-param>

此所設定的參數,在JSP網頁中可以使用下列方法來取得:${initParam.param_name}

若在Servlet可以使用下列方法來獲得:String param_name=getServletContext().getInitParamter("param_name");

Servlet的ServletConfig對象擁有該Servlet的ServletContext的一個引用,所以可這樣取得上下文初始化參數:getServletConfig().getServletContext().getInitParameter()也可以在Servlet中直接調用getServletContext().getInitParameter(),兩者是等價的。

  • <session-config></session-config>
<!-- Set timeout to 120 minutes -->
<session-config> 
	<session-timeout>120</session-timeout> 
</session-config> 

<session-config> 用於設置容器的session參數,比如:<session-timeout> 用於指定http session的失效時間。默認時間設置在<jakarta>/conf/web.xml (30 minutes)。<session-timeout>用來指定默認的會話超時時間間隔,以分鐘爲單位。該元素值必須爲整數。如果 session-timeout元素的值爲零或負數,則表示會話將永遠不會超時。

  •  <listener></listener>
<!--****************************監聽器配置*********************************-->
<!-- Spring的log4j監聽器 -->
<listener>
	<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 與CAS Single Sign Out Filter配合,註銷登錄信息  --> 
<listener>
	<listener-class>com.yonyou.mcloud.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>

        Listener介紹:

<listener>爲web應用程序定義監聽器,監聽器用來監聽各種事件,比如:application和session事件,所有的監聽器按照相同的方式定義,功能取決去它們各自實現的接口,常用的Web事件接口有如下幾個:
(1). ServletContextListener:用於監聽Web應用的啓動和關閉;
(2). ServletContextAttributeListener:用於監聽ServletContext範圍(application)內屬性的改變;
(3). ServletRequestListener:用於監聽用戶的請求;
(4). ServletRequestAttributeListener:用於監聽ServletRequest範圍(request)內屬性的改變;
(5). HttpSessionListener:用於監聽用戶session的開始和結束;
(6). HttpSessionAttributeListener:用於監聽HttpSession範圍(session)內屬性的改變。
<listener>主要用於監聽Web應用事件,其中有兩個比較重要的WEB應用事件:應用的啓動和停止(starting up or shutting down)和Session的創建和失效(created or destroyed)。應用啓動事件發生在應用第一次被Servlet容器裝載和啓動的時候;停止事件發生在Web應用停止的時候。Session創建事件發生在每次一個新的session創建的時候,類似地Session失效事件發生在每次一個Session失效的時候。爲了使用這些Web應用事件做些有用的事情,我們必須創建和使用一些特殊的“監聽類”。它們是實現了以下兩個接口中任何一個接口的簡單java類:javax.servlet.ServletContextListener或javax.servlet.http.HttpSessionListener,如果想讓你的類監聽應用的啓動和停止事件,你就得實現ServletContextListener接口;想讓你的類去監聽Session的創建和失效事件,那你就得實現HttpSessionListener接口。

       Listener配置:

配置Listener只要向Web應用註冊Listener實現類即可,無序配置參數之類的東西,因爲Listener獲取的是Web應用ServletContext(application)的配置參數。爲Web應用配置Listener的兩種方式:
(1). 使用@WebListener修飾Listener實現類即可。
(2). 在web.xml文檔中使用<listener>進行配置。
我們選擇web.xml這種配置方式,只有一個元素<listener-class>指定Listener的實現類,如下所示:
 

<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

這裏的<listener>用於Spring的加載,Spring加載可以利用ServletContextListener實現,也可以採用load-on-startup Servlet 實現,但是當<filter>需要用到bean時,但加載順序是:先加載<filter>後加載<servlet>,則<filter>中初始化操作中的bean爲null;所以,如果過濾器中要使用到bean,此時就可以根據加載順序<listener> -> <filter> -> <servlet>,將spring的加載改成Listener的方式。

(1). 利用ServletContextListener實現:

<servlet>  
   <servlet-name>context</servlet-narne> 
   <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>  
   <load-on-startup>1</load-on-startup>  
</servlet>

(2).採用load-on-startup Servlet 實現:

<listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> 

我們選擇了第二種方式,在J2EE工程中web服務器啓動的時候最先調用web.xml,上面這段配置的意思是加載spring的監聽器,其中ContextLoaderListener的作用就是啓動Web容器時,自動裝配applicationContext.xml的配置信息,執行它所實現的方法。

  •  <filter></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>
	<init-param>
		<param-name>forceEncoding</param-name>
		<param-value>true</param-value>
	</init-param>
</filter>
<!-- 單點登出過濾器 -->
<filter>
	<filter-name>CAS Single Sign Out Filter</filter-name>
	<filter-class>com.yonyou.mcloud.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<!-- 認證過濾器 -->
<filter>
	<filter-name>CAS Authentication Filter</filter-name>
	<filter-class>com.yonyou.mcloud.cas.client.authentication.ExpandAuthenticationFilter</filter-class>
	<init-param>
		<param-name>casServerLoginUrl</param-name>
		<param-value>https://dev.yonyou.com:443/sso-server/login</param-value>
	</init-param>
	<init-param>
		<!--這裏的server是服務端的IP -->
		<param-name>serverName</param-name>
		<param-value>http://10.1.215.40:80</param-value>
	</init-param>
</filter>
<!-- 驗證ST/PT過濾器 -->
<filter>
	<filter-name>CAS Validation Filter</filter-name>
	<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
	<init-param>
		<param-name>casServerUrlPrefix</param-name>
		<param-value>https://dev.yonyou.com:443/sso-server</param-value>
	</init-param>
	<init-param>
		<param-name>serverName</param-name>
		<param-value>http://10.1.215.40:80</param-value>
	</init-param>
	<init-param>
		<param-name>proxyCallbackUrl</param-name>
		<param-value>https://dev.yonyou.com:443/business/proxyCallback</param-value>
	</init-param>
	<init-param>
		<param-name>proxyReceptorUrl</param-name>
		<param-value>/proxyCallback</param-value>
	</init-param>
	<init-param>
		<param-name>proxyGrantingTicketStorageClass</param-name>
		<param-value>com.yonyou.mcloud.cas.client.proxy.MemcachedBackedProxyGrantingTicketStorageImpl</param-value>
	</init-param>
	<!-- 解決中文問題 -->
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
</filter>

<filter>
	<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
	<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter>
	<filter-name>CAS Assertion Thread Local Filter</filter-name>
	<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter>
	<filter-name>NoCache Filter</filter-name>
	<filter-class>com.yonyou.mcloud.cas.client.authentication.NoCacheFilter</filter-class>
</filter>
<!--****************************映射關係配置********************************-->
<filter-mapping>
	<filter-name>CharacterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
	<filter-name>NoCache Filter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
	<filter-name>CAS Single Sign Out Filter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
	<filter-name>CAS Validation Filter</filter-name>
	<url-pattern>/proxyCallback</url-pattern>
</filter-mapping>
<filter-mapping>
	<filter-name>CAS Authentication Filter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
	<filter-name>CAS Validation Filter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
	<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
	<filter-name>CAS Assertion Thread Local Filter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

       Filter介紹:

Filter可認爲是Servle的一種“加強版”,主要用於對用戶請求request進行預處理,也可以對Response進行後處理,是個典型的處理鏈。使用Filter的完整流程是:Filter對用戶請求進行預處理,接着將請求HttpServletRequest交給Servlet進行處理並生成響應,最後Filter再對服務器響應HttpServletResponse進行後處理。Filter與Servlet具有完全相同的生命週期,且Filter也可以通過<init-param>來配置初始化參數,獲取Filter的初始化參數則使用FilterConfig的getInitParameter()。
換種說法,Servlet裏有request和response兩個對象,Filter能夠在一個request到達Servlet之前預處理request,也可以在離開Servlet時處理response,Filter其實是一個Servlet鏈。以下是Filter的一些常見應用場合,
(1)認證Filter
(2)日誌和審覈Filter
(3)圖片轉換Filter
(4)數據壓縮Filter
(5)密碼Filter
(6)令牌Filter
(7)觸發資源訪問事件的Filter
(8)XSLT Filter
(9)媒體類型鏈Filter
Filter可負責攔截多個請求或響應;一個請求或響應也可被多個Filter攔截。創建一個Filter只需兩步:
(1) 創建Filter處理類
(2) Web.xml文件中配置Filter
Filter必須實現javax.servlet.Filter接口,在該接口中定義了三個方法:
(1) void init(FilterConfig config):用於完成Filter的初始化。FilteConfig用於訪問Filter的配置信息。
(2) void destroy():用於Filter銷燬前,完成某些資源的回收。
(3) void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):實現過濾功能的核心方法,該方法就是對每個請求及響應增加額外的處理。該方法實現對用戶請求request進行預處理,也可以實現對服務器響應response進行後處理---它們的分界線爲是否調用了chain.doFilter(request,response),執行該方法之前,即對用戶請求request進行預處理,執行該方法之後,即對服務器響應response進行後處理。

Filter配置:

Filter可認爲是Servlet的“增強版”,因此Filter配置與Servlet的配置非常相似,需要配置兩部分:配置Filter名稱和Filter攔截器URL模式。區別在於Servlet通常只配置一個URL,而Filter可以同時配置多個請求的URL。配置Filter有兩種方式:
(1). 在Filter類中通過Annotation進行配置。
(2). 在web.xml文件中通過配置文件進行配置。
我們使用的是web.xml這種配置方式,下面重點介紹<filter>內包含的一些元素。
<filter>用於指定Web容器中的過濾器,可包含<filter-name>、<filter-class>、<init-param>、<icon>、<display-name>、<description>。
(1).<filter-name>用來定義過濾器的名稱,該名稱在整個程序中都必須唯一。
(2).<filter-class>元素指定過濾器類的完全限定的名稱,即Filter的實現類。
(3). <init-param>爲Filter配置參數,與<context-param>具有相同的元素描述符<param-name>和<param-value>。
(4). <filter-mapping>元素用來聲明Web應用中的過濾器映射,過濾器被映射到一個servlet或一個URL 模式。這個過濾器的<filter>和<filter-mapping>必須具有相同的<filter-name>,指定該Filter所攔截的URL。過濾是按照部署描述符的<filter-mapping>出現的順序執行的。

     字符集過濾器

<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>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

CharacterEncodingFilter類可以通過簡單配置來幫我們實現字符集轉換的功能,參數encoding用於指定編碼類型,參數forceEncoding設爲true時,強制執行request.setCharacterEncoding(this.encoding)和reponse.setCharacterEncoding(this.encoding)中的方法。

    緩存控制

<filter>
    <filter-name>NoCache Filter</filter-name>
    <filter-class>com.yonyou.mcloud.cas.client.authentication.NoCacheFilter</filter-class>
</filter>
    <filter-mapping>
<filter-name>NoCache Filter</filter-name>
    <!—表示對URL全部過濾-->
    <url-pattern>/*</url-pattern>
</filter-mapping>
  • <servlet></servlet>
<!-- 加載spring-mvc的配置 -->
<servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
       </init-param>
       <load-on-startup>1</load-on-startup>
</servlet>
<!-- 配置spring-mvc的訪問路徑 -->
<servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <url-pattern>/</url-pattern>
</servlet-mapping>

Servlet配置

爲了讓Servlet能響應用戶請求,還必須將Servlet配置在web應用中,配置Servlet需要修改web.xml文件。從Servlet3.0開始,配置Servlet有兩種方式:
(1). 在Servlet類中使用@WebServlet Annotation進行配置。
(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獲取配置參數的方法完全一樣,只是ServletConfig是取得當前Servlet的配置參數,而ServletContext是獲取整個Web應用的配置參數。
(1). <description>、<display-name>和<icon>
1). <description>:爲Servlet指定一個文本描述。
2). <display-name>:爲Servlet提供一個簡短的名字被某些工具顯示。
3). <icon>:爲Servlet指定一個圖標,在圖形管理工具中表示該Servlet。
(2). <servlet-name>、<servlet-class>和<jsp-file>元素
<servlet>必須含有<servlet-name>和<servlet-class>,或者<servlet-name>和<jsp-file>。 描述如下:
1). <servlet-name>用來定義servlet的名稱,該名稱在整個應用中必須是惟一的。
2). <servlet-class>用來指定servlet的完全限定的名稱。
3). <jsp-file>用來指定應用中JSP文件的完整路徑。這個完整路徑必須由/開始。
(3). <load-on-startup>
如果load-on-startup元素存在,而且也指定了jsp-file元素,則JSP文件會被重新編譯成Servlet,同時產生的Servlet也被載入內存。<load-on-startup>的內容可以爲空,或者是一個整數。這個值表示由Web容器載入內存的順序。
舉個例子:如果有兩個Servlet元素都含有<load-on-startup>子元素,則<load-on-startup>子元素值較小的Servlet將先被加載。如果<load-on-startup>子元素值爲空或負值,則由Web容器決定什麼時候加載Servlet。如果兩個Servlet的<load-on-startup>子元素值相同,則由Web容器決定先加載哪一個Servlet。<load-on-startup>1</load-on-startup>表示啓動容器時,初始化Servlet。
(4). <servlet-mapping>
<servlet-mapping>含有<servlet-name>和<url-pattern>
1). <servlet-name>:Servlet的名字,唯一性和一致性,與<servlet>元素中聲明的名字一致。
2). <url-pattern>:指定相對於Servlet的URL的路徑。該路徑相對於web應用程序上下文的根路徑。<servlet-mapping>將URL模式映射到某個Servlet,即該Servlet處理的URL。
(5). 加載Servlet的過程 
容器的Context對象對請求路徑(URL)做出處理,去掉請求URL的上下文路徑後,按路徑映射規則和Servlet映射路徑(<url- pattern>)做匹配,如果匹配成功,則調用這個Servlet處理請求。 

  •  <welcome-file-list></welcome-file-list>
<!-- 當啓動項目後,直接訪問項目默認啓動的頁面 -->
<welcome-file-list>
    <welcome-file>/WEB-INF/pages/houtai/login.jsp</welcome-file>
</welcome-file-list>

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章