參考:https://www.cnblogs.com/roy-blog/p/7656834.html
web容器讀取web.xml文件,配置文件的加載順序:
? ? 3.1涛浙、context-param
? ? 3.2、listener
? ? 3.3、filter
? ? 3.4、servlet
二幅慌、細(xì)節(jié)
1、context-param:web應(yīng)用servlet上下文初始化參數(shù)的聲明酌媒。
2欠痴、listener:用來注冊(cè)一個(gè)監(jiān)聽器類迄靠。事件監(jiān)聽程序在以下情況時(shí)通知
????①應(yīng)用的啟動(dòng)和關(guān)閉秒咨;
????②session的創(chuàng)建與銷毀,屬性的新增掌挚、移除和更改雨席;????
????③對(duì)象被綁定到session中或從session中刪除哀托;
3办悟、filter:過濾器宏榕,就是對(duì)請(qǐng)求進(jìn)行過濾萤晴,filter也會(huì)在項(xiàng)目啟動(dòng)的時(shí)候被實(shí)例化两波。一般一個(gè)filter要對(duì)應(yīng)filter-mapping埃唯,用于篩選所要執(zhí)行過濾器中代碼的url路徑免糕。如果一個(gè)filter沒有filter-mapping善镰,那它存在的意義就不大是目,它在web.xml存在的目的純粹就是為了在項(xiàng)目啟動(dòng)的時(shí)候被實(shí)例化谤饭,從而執(zhí)行其內(nèi)部的代碼。
三懊纳、一個(gè)簡(jiǎn)單的web.xml文件詳解
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<!-- 配置加載Spring文件的監(jiān)聽器-->
<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>
<!-- 編碼過濾器 -->
<filter>
????<filter-name>encoding</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>encoding</filter-name>
????<url-pattern>*.action</url-pattern>
</filter-mapping>
<!-- 配置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:springmvc-config.xml</param-value>
????</init-param>
????<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
????<servlet-name>springmvc</servlet-name>
????<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
1揉抵、如果在web.xml中不寫任何參數(shù)配置信息,默認(rèn)的路徑是/WEB-INF/applicationContext.xml嗤疯,在WEB-INF目錄下創(chuàng)建的xml文件的名稱必須是applicationContext.xml冤今;contextConfigLocation 定義了要裝入的 Spring 配置文件,通過ContenxtLoarderListener實(shí)現(xiàn)茂缚。
2戏罢、ContextLoaderListener監(jiān)聽器的作用就是啟動(dòng)Web容器時(shí),自動(dòng)裝配ApplicationContext的配置信息脚囊。
3龟糕、DispatcherServlet:一個(gè)特殊的servlet,是整個(gè)spring mvc框架的核心凑术,他是一個(gè)前端servlet翩蘸,spring mvc經(jīng)過前端servlet來接受所有的請(qǐng)求,然后再講具體工作派發(fā)給其他的的servlet來具體實(shí)現(xiàn)淮逊。同時(shí)催首,名為springmvc的servlet讀取了contextConfigLocation所定義的配置文件(classpath:ApplicationContext-mvc.xml)扶踊,啟動(dòng)了web層的spring容器,在這個(gè)容器里郎任,我們初始化了所有的controller類秧耗。
4、把DispatcherServlet首先加載的原因:由于初始化DispatcherServlet伴隨著啟動(dòng)spring mvc容器舶治,所以需要較長(zhǎng)的時(shí)間分井,所以我們希望在項(xiàng)目啟動(dòng)的時(shí)候就進(jìn)行初始化的操作。因?yàn)檫@個(gè)屬性設(shè)為正數(shù)的表示在項(xiàng)目啟動(dòng)的時(shí)候就初始化霉猛,數(shù)字越小表明越早初始化尺锚。如果我們將其設(shè)為負(fù)數(shù)的話。那么在項(xiàng)目啟動(dòng)的時(shí)候惜浅,將不會(huì)啟動(dòng)spring mvc的容器瘫辩,而是當(dāng)我們第一次訪問某個(gè)controller所對(duì)應(yīng)的action的時(shí)候才來加載啟動(dòng)容器,這將會(huì)造成較長(zhǎng)時(shí)間的等待坛悉,所以我們一般將load-on-startup設(shè)為1伐厌。
5、context-param與init-param區(qū)別
? ? 5.1裸影、init-parm配置在<servlet>標(biāo)簽中,用來初始化當(dāng)前的Servlet的,屬于當(dāng)前Servlet的配置挣轨。
? ? 5.2、context-param直接配置在web.xml的<web-app>標(biāo)簽中,屬于上下文參數(shù),在整個(gè)web應(yīng)用中都可以使用,它是全局的轩猩。