web.xml是Java web項目的配置文件,但它不是項目必須的。java
web.xml的模式(Schema)文件中定義了多少種標籤元素,web.xml中就能夠出現它的模式文件所定義的標籤元素,它就能擁有定義出來的那些功能。web.xml的模式文件是由Sun公司定義的,每一個web.xml文件的根元素
web.xml Schema 頭部聲明 4.0數據庫
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> </web-app>
當啓動一個WEB項目時,容器(如Tomcat、Apache)會去讀取它的配置文件web.xml ,當這一步驟沒有出錯而且完成以後,項目才能正常地被啓動起來。具體以下:安全
a. 啓動web項目,容器(如Tomcat、Apache)會去讀取它的配置文件web.xml 中的兩個節點,context-param和listener。服務器
b. 緊接着,容器將建立一個ServletContext(又稱爲:Servlet上下文),應用範圍內即整個WEB項目都能使用這個Servlet上下文。
容器將< context-param >轉化爲鍵值對,並交給ServletContext。session
c. 容器建立< listener >中的類實例,即建立監聽。(備註:listener定義的類能夠是自定義的類但必須須要繼承ServletContextListener)。app
d. 在監聽中會有contextInitialized(ServletContextEvent args)初始化方法,在這個方法中得到:jsp
ServletContext = ServletContextEvent.getServletContext(); context-param的值 = ServletContext.getInitParameter(「context-param的鍵」); 在這個類中還必須有一個contextDestroyed(ServletContextEvent event) 銷燬方法。用於關閉應用前釋放資源,好比說數據庫鏈接的關閉。
e. 獲得context-param的值以後,你就能夠作一些操做了。注意,這個時候你的WEB項目尚未徹底啓動完成。這個動做會比全部的Servlet都要早。例如:你可能想在項目啓動以前就打開數據庫。那麼這裏就能夠在< context-param >中設置數據庫的鏈接方式,在監聽類中初始化數據庫的鏈接。分佈式
f. 補充知識:ServletContext,是一個全局的儲存信息的空間,服務器開始,其就存在,服務器關閉,其才釋放。request,一個用戶可有多個;session,一個用戶一個;而servletContext,全部用戶共用一個。因此,爲了節省空間,提升效率,ServletContext中,要放必須的、重要的、全部用戶須要共享的線程又是安全的一些信息。例如,一個購物網站,用戶要訪問商品的詳細信息,若是放在session域,每一個用戶都要訪問一遍數據庫,這樣效率過低;而放在ServletContext中,服務器一啓動,就訪問數據庫將商品信息存入,這樣全部用戶只須要經過上下文就能訪問到商品的信息。網站
首先能夠確定的是,不一樣類型的節點,加載順序與它們在 web.xml 文件中的前後順序無關。即不會由於 filter 寫在 listener 的前面而會先加載 filter。
web.xml節點加載順序:context-param -> listener -> filter -> servlet
對於同類配置節而言,與它們出現的順序是有關的。以 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() 方法的。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> </web-app>
其它的元素都放在<web-app> 之中。
<discription></discription> 對應用的描述
<display-name></display-name> 定義應用的名稱
<distributable/> 指定該應用是否可分佈式處理
<context-param></context-param> 用來設定應用的環境參數,它包含兩個子元素:
<param-name></param-name> 用來指定參數的名稱
<param-value></param-value> 用來設定參數值
<context-param> <param-name>param1</param-name> <param-value>zhangsan</param-value> <description></description> </context-param> <context-param> <param-name>param2</param-name> <param-value>123abc</param-value> </context-param>
在此設定的參數,能夠在servlet中用 getServletContext().getInitParameter("param1") 來取得。
ServletContext context = getServletContext(); Enumeration<String> initParameterNames = context.getInitParameterNames(); while (initParameterNames.hasMoreElements()) { String element = initParameterNames.nextElement(); String initParameter = context.getInitParameter(element); System.out.println(element + " = " + initParameter); }
<filter></filter>是用來聲明filter的相關設定,它包含如下子元素:
<filter-name></filter-name> 指定filter的名字
<filter-class></filter-class> 定義filter的類的名稱
<init-param></init-param>用來定義參數,它有兩個子元素:
<param-name></param-name> 用來指定參數的名稱
<param-value></param-value> 用來設定參數值
<filter> <filter-name>setCharacterEncoding</filter-name> <filter-class>com.myTest.setCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GB2312</param-value> </init-param> </filter>
與<filter></filter>成對使用的是<filter-mapping></filter-mapping> 用來定義filter所對應的URL,它有兩個子元素:
<filter-name></filter-name> 指定filter的名字
<url-pattern></url-pattern>指定filter所對應的URL
<filter-mapping> <filter-name>setCharacterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
<listener></listener> 用來設定Listener接口,它的主要子元素爲
<listener-class></listener-class> 定義Listener的類名稱
<listener> <listener-class>com.myTest.ContextListener</listener-class> </listener>
<servlet></servlet> 用來聲明一個servlet的數據,主要有如下子元素:
<servlet-name></servlet-name> 指定servlet的名稱
<servlet-class></servlet-class> 指定servlet的類名稱
<jsp-file></jsp-file> 指定web應用中的某個JSP網頁的完整路徑
<init-param></init-param> 用來定義參數,和前面的
一樣,與<servlet></servlet>成對使用的是<servlet-mapping></servlet-mapping> 用來定義servlet所對應的URL,包含兩個子元素:
<servlet-name></servlet-name> 指定servlet的名稱
<url-pattern></url-pattern> 指定servlet所對應的URL
<servlet> <servlet-name>ShoppingServlet</servlet-name> <servlet-class>com.myTest.ShoppingServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ShoppingServlet</servlet-name> <url-pattern>/shop/ShoppingServlet</url-pattern> </servlet-mapping>
<session-config></session-config> 用來定義web應用中的session參數,包含一個子元素:
<session-timeout></session-timeout> 用來定義這個web應用全部session的有效期限,單位爲分鐘
<mime-mapping></mime-mapping> 定義某一個擴展名和某一個MIME Type作對映,包含兩個子元素:
<extension></extension> 擴展名的名稱
<mime-type></mime-type> MIME格式
<welcome-file-list></welcom-file-list> 用來定義首頁的列單,包含一個子元素:
<welcome-file></welcome-file> 指定首頁的文件名稱
<error-page></error-page> 用來處理錯誤代碼或異常的頁面,有三個子元素:
<error-code></error-code> 指定錯誤代碼
<exception-type></exception-type> 指定一個JAVA異常類型
<location></location> 指定在web應用內的相關資源路徑
<error-page> <error-code>404</error-code> <location>/error404.jsp</location> </error-page> <error-page> <exception-type>java.lang.Exception</exception-type> <location>/exception.jsp</location> </error-page>
<taglib></taglib> 用來設定JSP網頁所用到的Tag Library路徑,有兩個子元素:
<taglib-uri></taglib-uri> 定義TLD文件的URI,在JSP網頁中用taglib指令即可取得該URI的TLD文件
<taglib-location></taglib-location> 指定TLD文件相對於web站臺的存放位置
<taglib> <taglib-uri>myTaglib</taglib-uri> <taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location> </taglib>