這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān) web.xml的加載過(guò)程有哪些,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站制作、做網(wǎng)站與策劃設(shè)計(jì),壽縣網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:壽縣等地區(qū)。壽縣做網(wǎng)站價(jià)格咨詢:18982081108
一、 Web.xml詳解:
(一) web.xml加載過(guò)程(步驟)
首先簡(jiǎn)單說(shuō)一下,web.xml的加載過(guò)程。
當(dāng)我們?nèi)?dòng)一個(gè)WEB項(xiàng)目時(shí),容器包括(JBoss、Tomcat等)首先會(huì)讀取項(xiàng)目web.xml配置文件里的配置,當(dāng)這一步驟沒(méi)有出錯(cuò)并且完成之后,項(xiàng)目才能正常地被啟動(dòng)起來(lái)。
? 啟動(dòng)WEB項(xiàng)目的時(shí)候,容器首先會(huì)去它的配置文件web.xml讀取兩個(gè)節(jié)點(diǎn):
和
? 緊接著,容器創(chuàng)建一個(gè)ServletContext(application),這個(gè)WEB項(xiàng)目所有部分都將共享這個(gè)上下文。
? 容器以
的name作為鍵,value作為值,將其轉(zhuǎn)化為鍵值對(duì),存入ServletContext。
? 容器創(chuàng)建
ServletContext application =ServletContextEvent.getServletContext(); context-param的值= application.getInitParameter("context-param的鍵");
得到這個(gè)context-param的值之后,你就可以做一些操作了。
? 舉例:你可能想在項(xiàng)目啟動(dòng)之前就打開(kāi)數(shù)據(jù)庫(kù),那么這里就可以在
? 接著,容器會(huì)讀取
? 以上都是在WEB項(xiàng)目還沒(méi)有完全啟動(dòng)起來(lái)的時(shí)候就已經(jīng)完成了的工作。如果系統(tǒng)中有Servlet,則Servlet是在第一次發(fā)起請(qǐng)求的時(shí)候被實(shí)例化的,而且一般不會(huì)被容器銷毀,它可以服務(wù)于多個(gè)用戶的請(qǐng)求。所以,Servlet的初始化都要比上面提到的那幾個(gè)要遲。
總的來(lái)說(shuō),web.xml的加載順序是:
。其中,如果web.xml中出現(xiàn)了相同的元素,則按照在配置文件中出現(xiàn)的先后順序來(lái)加載。
對(duì)于某類元素而言,與它們出現(xiàn)的順序是有關(guān)的。以
(二) web.xml標(biāo)簽詳解
1.XML文檔有效性檢查
這段代碼指定文件類型定義(DTD),可以通過(guò)它檢查XML文檔的有效性。下面顯示的元素有幾個(gè)特性,這些特性告訴我們關(guān)于DTD的信息:
2.web-app定義該文檔(部署描述符,不是DTD文件)的根元素
?PUBLIC意味著DTD文件可以被公開(kāi)使用
?"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"意味著DTD由Sun Microsystems, Inc.維護(hù)。該信息也表示它描述的文檔類型是DTD Web Application 2.3,而且DTD是用英文書(shū)寫(xiě)的。
?URL"http://java.sun.com/dtd/web-app_2_3.dtd"表示D文件的位置。
部署描述符的根元素是
正如您所看到的,這個(gè)元素含有23個(gè)子元素,而且子元素都是可選的。問(wèn)號(hào)(?)表示子元素是可選的,而且只能出現(xiàn)一次。星號(hào)(*)表示子元素可在部署描述符中出現(xiàn)零次或多次。有些子元素還可以有它們自己的子元素。web.xml文件中
注意:
在Servlet 2.3中,子元素必須按照DTD文件語(yǔ)法描述中指定的順序出現(xiàn)。比如:如果部署描述符中的
3.
定義了web應(yīng)用的名稱,可以在
http://localhost:8080/manager/html中顯示。如下所示:
4.
5.
webAppRootKey business.root contextConfigLocation /WEB-INF/spring-configuration/*.xml
?
?什么情況下使用,為什么使用
比如:定義一個(gè)管理員email地址用來(lái)從程序發(fā)送錯(cuò)誤,或者與你整個(gè)應(yīng)用程序有關(guān)的其他設(shè)置。使用自己定義的設(shè)置文件需要額外的代碼和管理;直接在你的程序中使用硬編碼(Hard-coding)參數(shù)值會(huì)給你之后修改程序帶來(lái)麻煩,更困難的是,要根據(jù)不同的部署使用不同的設(shè)置;通過(guò)這種辦法,可以讓其他開(kāi)發(fā)人員更容易找到相關(guān)的參數(shù),因?yàn)樗且粋€(gè)用于設(shè)置這種參數(shù)的標(biāo)準(zhǔn)位置。
?Spring配置文件:
配置Spring,必須需要
contextConfigLocation /WEB-INF/spring-configuration/*.xml org.springframework.web.context.ContextLoaderListener
對(duì)應(yīng)工程目錄結(jié)構(gòu)如下所示:
?webAppRootKey配置:
部署在同一容器中的多個(gè)Web項(xiàng)目,要配置不同的webAppRootKey,web.xml文件中最好定義webAppRootKey參數(shù),如果不定義,將會(huì)缺省為“webapp.root”,如下:
webAppRootKey webapp.root
當(dāng)然也不能重復(fù),否則報(bào)類似下面的錯(cuò)誤:
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”這個(gè)key已經(jīng)指向了項(xiàng)目1,不可以再指向項(xiàng)目2。多個(gè)項(xiàng)目要對(duì)webAppRootKey進(jìn)行配置,我們工程主要是讓log4j能將日志寫(xiě)到對(duì)應(yīng)項(xiàng)目根目錄下,比如:我們的項(xiàng)目的webAppRootKey為
webAppRootKey business.root webAppRootKey pubbase.root
這樣就不會(huì)出現(xiàn)沖突了。就可以在運(yùn)行時(shí)動(dòng)態(tài)地找到項(xiàng)目路徑,在log4j.properties配置文件中可以按下面的方式使用${webapp.root}:
log4j.appender.file.File=${webapp.root}/WEB-INF/logs/sample.log
就可以在運(yùn)行時(shí)動(dòng)態(tài)地找出項(xiàng)目的路徑。
?多個(gè)配置文件交叉引用處理:
如果web.xml中有contextConfigLocation參數(shù)指定的Spring配置文件,則會(huì)去加載相應(yīng)的配置文件,而不會(huì)去加載/WEB-INF/下的applicationContext.xml。但是如果沒(méi)有指定的話,默認(rèn)會(huì)去/WEB-INF/下加載applicationContext.xml。
在一個(gè)團(tuán)隊(duì)使用Spring的實(shí)際項(xiàng)目中,應(yīng)該需要多個(gè)Spring的配置文件,如何使用和交叉引用的問(wèn)題:
多個(gè)配置文件可以在web.xml里用空格分隔寫(xiě)入,如:
contextConfigLocation applicationContext-database.xml,applicationContext.xml
多個(gè)配置文件里的交叉引用可以用ref的external或bean解決,例如:
applicationContext.xml
dbBean在applicationContext-database.xml中。
?在不同環(huán)境下如何獲取:
范例:
param_name param_value
此所設(shè)定的參數(shù),在JSP網(wǎng)頁(yè)中可以使用下列方法來(lái)取得:
${initParam.param_name}
若在Servlet可以使用下列方法來(lái)獲得:
String param_name=getServletContext().getInitParamter("param_name");
Servlet的ServletConfig對(duì)象擁有該Servlet的ServletContext的一個(gè)引用,所以可這樣取得上下文初始化參數(shù):getServletConfig().getServletContext().getInitParameter()也可以在Servlet中直接調(diào)用getServletContext().getInitParameter(),兩者是等價(jià)的。
6.
120
7.
org.springframework.web.util.Log4jConfigListener org.springframework.web.context.ContextLoaderListener com.yonyou.mcloud.cas.client.session.SingleSignOutHttpSessionListener
1. Listener介紹:
?ServletContextListener:用于監(jiān)聽(tīng)Web應(yīng)用的啟動(dòng)和關(guān)閉;
?ServletContextAttributeListener:用于監(jiān)聽(tīng)ServletContext范圍(application)內(nèi)屬性的改變;
?ServletRequestListener:用于監(jiān)聽(tīng)用戶的請(qǐng)求;
?ServletRequestAttributeListener:用于監(jiān)聽(tīng)ServletRequest范圍(request)內(nèi)屬性的改變;
?HttpSessionListener:用于監(jiān)聽(tīng)用戶session的開(kāi)始和結(jié)束;
?HttpSessionAttributeListener:用于監(jiān)聽(tīng)HttpSession范圍(session)內(nèi)屬性的改變。
2. Listener配置:
配置Listener只要向Web應(yīng)用注冊(cè)Listener實(shí)現(xiàn)類即可,無(wú)序配置參數(shù)之類的東西,因?yàn)長(zhǎng)istener獲取的是Web應(yīng)用ServletContext(application)的配置參數(shù)。為Web應(yīng)用配置Listener的兩種方式:
? 使用@WebListener修飾Listener實(shí)現(xiàn)類即可。
? 在web.xml文檔中使用
我們選擇web.xml這種配置方式,只有一個(gè)元素
org.springframework.web.context.ContextLoaderListener
這里的
1) 利用ServletContextListener實(shí)現(xiàn):
context org.springframework.web.context.ContextLoaderServlet 1
2) 采用load-on-startup Servlet 實(shí)現(xiàn):
org.springframework.web.context.ContextLoaderListener
我們選擇了第二種方式,在J2EE工程中web服務(wù)器啟動(dòng)的時(shí)候最先調(diào)用web.xml,上面這段配置的意思是加載spring的監(jiān)聽(tīng)器,其中ContextLoaderListener的作用就是啟動(dòng)Web容器時(shí),自動(dòng)裝配applicationContext.xml的配置信息,執(zhí)行它所實(shí)現(xiàn)的方法。
8.
CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true CAS Single Sign Out Filter com.yonyou.mcloud.cas.client.session.SingleSignOutFilter CAS Authentication Filter com.yonyou.mcloud.cas.client.authentication.ExpandAuthenticationFilter casServerLoginUrl https://dev.yonyou.com:443/sso-server/login serverName http://10.1.215.40:80 CAS Validation Filter org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter casServerUrlPrefix https://dev.yonyou.com:443/sso-server serverName http://10.1.215.40:80 proxyCallbackUrl https://dev.yonyou.com:443/business/proxyCallback proxyReceptorUrl /proxyCallback proxyGrantingTicketStorageClass com.yonyou.mcloud.cas.client.proxy.MemcachedBackedProxyGrantingTicketStorageImpl encoding UTF-8 CAS HttpServletRequest Wrapper Filter org.jasig.cas.client.util.HttpServletRequestWrapperFilter CAS Assertion Thread Local Filter org.jasig.cas.client.util.AssertionThreadLocalFilter NoCache Filter com.yonyou.mcloud.cas.client.authentication.NoCacheFilter CharacterEncodingFilter /* NoCache Filter /* CAS Single Sign Out Filter /* CAS Validation Filter /proxyCallback CAS Authentication Filter /* CAS Validation Filter /* CAS HttpServletRequest Wrapper Filter /* CAS Assertion Thread Local Filter /*
1. Filter介紹:
Filter可認(rèn)為是Servle的一種“加強(qiáng)版”,主要用于對(duì)用戶請(qǐng)求request進(jìn)行預(yù)處理,也可以對(duì)Response進(jìn)行后處理,是個(gè)典型的處理鏈。使用Filter的完整流程是:Filter對(duì)用戶請(qǐng)求進(jìn)行預(yù)處理,接著將請(qǐng)求HttpServletRequest交給Servlet進(jìn)行處理并生成響應(yīng),最后Filter再對(duì)服務(wù)器響應(yīng)HttpServletResponse進(jìn)行后處理。Filter與Servlet具有完全相同的生命周期,且Filter也可以通過(guò)
換種說(shuō)法,Servlet里有request和response兩個(gè)對(duì)象,F(xiàn)ilter能夠在一個(gè)request到達(dá)Servlet之前預(yù)處理request,也可以在離開(kāi)Servlet時(shí)處理response,F(xiàn)ilter其實(shí)是一個(gè)Servlet鏈。以下是Filter的一些常見(jiàn)應(yīng)用場(chǎng)合,
(1)認(rèn)證Filter
(2)日志和審核Filter
(3)圖片轉(zhuǎn)換Filter
(4)數(shù)據(jù)壓縮Filter
(5)密碼Filter
(6)令牌Filter
(7)觸發(fā)資源訪問(wèn)事件的Filter
(8)XSLT Filter
(9)媒體類型鏈Filter
Filter可負(fù)責(zé)攔截多個(gè)請(qǐng)求或響應(yīng);一個(gè)請(qǐng)求或響應(yīng)也可被多個(gè)Filter攔截。創(chuàng)建一個(gè)Filter只需兩步:
?創(chuàng)建Filter處理類
?Web.xml文件中配置Filter
Filter必須實(shí)現(xiàn)javax.servlet.Filter接口,在該接口中定義了三個(gè)方法:
?void init(FilterConfig config):用于完成Filter的初始化。FilteConfig用于訪問(wèn)Filter的配置信息。
?void destroy():用于Filter銷毀前,完成某些資源的回收。
?void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):實(shí)現(xiàn)過(guò)濾功能的核心方法,該方法就是對(duì)每個(gè)請(qǐng)求及響應(yīng)增加額外的處理。該方法實(shí)現(xiàn)對(duì)用戶請(qǐng)求request進(jìn)行預(yù)處理,也可以實(shí)現(xiàn)對(duì)服務(wù)器響應(yīng)response進(jìn)行后處理---它們的分界線為是否調(diào)用了chain.doFilter(request,response),執(zhí)行該方法之前,即對(duì)用戶請(qǐng)求request進(jìn)行預(yù)處理,執(zhí)行該方法之后,即對(duì)服務(wù)器響應(yīng)response進(jìn)行后處理。
2. Filter配置:
Filter可認(rèn)為是Servlet的“增強(qiáng)版”,因此Filter配置與Servlet的配置非常相似,需要配置兩部分:配置Filter名稱和Filter攔截器URL模式。區(qū)別在于Servlet通常只配置一個(gè)URL,而Filter可以同時(shí)配置多個(gè)請(qǐng)求的URL。配置Filter有兩種方式:
? 在Filter類中通過(guò)Annotation進(jìn)行配置。
? 在web.xml文件中通過(guò)配置文件進(jìn)行配置。
我們使用的是web.xml這種配置方式,下面重點(diǎn)介紹
?
?
?
?
1) 字符集過(guò)濾器
CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true CharacterEncodingFilter類可以通過(guò)簡(jiǎn)單配置來(lái)幫我們實(shí)現(xiàn)字符集轉(zhuǎn)換的功能,參數(shù)encoding用于指定編碼類型,參數(shù)forceEncoding設(shè)為true時(shí),強(qiáng)制執(zhí)行request.setCharacterEncoding(this.encoding)和reponse.setCharacterEncoding(this.encoding)中的方法。 ) 緩存控制 CharacterEncodingFilter /* NoCache Filter com.yonyou.mcloud.cas.client.authentication.NoCacheFilter ) 登錄認(rèn)證 NoCache Filter /* CAS Authentication Filter com.yonyou.mcloud.cas.client.authentication.ExpandAuthenticationFilter casServerLoginUrl https://dev.yonyou.com:443/sso-server/login serverName http://10.1.215.40:80 CAS Authentication Filter /*
登錄認(rèn)證,未登錄用戶導(dǎo)向CAS Server進(jìn)行認(rèn)證。
4) 單點(diǎn)登出
CAS Single Sign Out Filter org.jasig.cas.client.session.SingleSignOutFilter CAS Single Sign Out Filter /* org.jasig.cas.client.session.SingleSignOutHttpSessionListener
CAS Server通知CAS Client,刪除session,注銷登錄信息。
) 封裝request
CAS HttpServletRequest Wrapper Filter org.jasig.cas.client.util.HttpServletRequestWrapperFilter CAS HttpServletRequest Wrapper Filter /*
封裝request, 支持getUserPrincipal等方法。
6) 存放Assertion到ThreadLocal中
CAS Assertion Thread Local Filter org.jasig.cas.client.util.AssertionThreadLocalFilter CAS Assertion Thread Local Filter /*
7) 禁用瀏覽器緩存
NoCache Filter com.yonyou.mcloud.cas.client.authentication.NoCacheFilter NoCache Filter /*
8) CAS Client向CAS Server進(jìn)行ticket驗(yàn)證
CAS Validation Filter org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter casServerUrlPrefix https://dev.yonyou.com:443/sso-server serverName http://10.1.215.40:80 proxyCallbackUrl https://dev.yonyou.com:443/business/proxyCallback proxyReceptorUrl /proxyCallback proxyGrantingTicketStorageClass com.yonyou.mcloud.cas.client.proxy.MemcachedBackedProxyGrantingTicketStorageImpl encoding UTF-8 CAS Validation Filter /proxyCallback CAS Validation Filter /*
9.
business org.springframework.web.servlet.DispatcherServlet publishContext false 1 LogOutServlet com.yonyou.mcloud.cas.web.servlet.LogOutServlet serverLogoutUrl https://dev.yonyou.com:443/sso-server/logout serverName http://10.1.215.40:80/business/ LogOutServlet /logout business /
1.Servlet介紹:
Servlet通常稱為服務(wù)器端小程序,是運(yùn)行在服務(wù)器端的程序,用于處理及響應(yīng)客戶的請(qǐng)求。Servlet是個(gè)特殊的java類,繼承于HttpServlet??蛻舳送ǔV挥蠫ET和POST兩種請(qǐng)求方式,Servlet為了響應(yīng)則兩種請(qǐng)求,必須重寫(xiě)doGet()和doPost()方法。大部分時(shí)候,Servlet對(duì)于所有的請(qǐng)求響應(yīng)都是完全一樣的,此時(shí)只需要重寫(xiě)service()方法即可響應(yīng)客戶端的所有請(qǐng)求。
另外HttpServlet有兩個(gè)方法
?init(ServletConfig config):創(chuàng)建Servlet實(shí)例時(shí),調(diào)用該方法的初始化Servlet資源。
?destroy():銷毀Servlet實(shí)例時(shí),自動(dòng)調(diào)用該方法的回收資源。
通常無(wú)需重寫(xiě)init()和destroy()兩個(gè)方法,除非需要在初始化Servlet時(shí),完成某些資源初始化的方法,才考慮重寫(xiě)init()方法,如果重寫(xiě)了init()方法,應(yīng)在重寫(xiě)該方法的第一行調(diào)用super.init(config),該方法將調(diào)用HttpServlet的init()方法。如果需要在銷毀Servlet之前,先完成某些資源的回收,比如關(guān)閉數(shù)據(jù)庫(kù)連接,才需要重寫(xiě)destory方法()。
Servlet的生命周期:
創(chuàng)建Servlet實(shí)例有兩個(gè)時(shí)機(jī):
?客戶端第一次請(qǐng)求某個(gè)Servlet時(shí),系統(tǒng)創(chuàng)建該Servlet的實(shí)例,大部分Servlet都是這種Servlet。
?Web應(yīng)用啟動(dòng)時(shí)立即創(chuàng)建Servlet實(shí)例,即load-on-start Servlet。
每個(gè)Servlet的運(yùn)行都遵循如下生命周期:
1.創(chuàng)建Servlet實(shí)例。
2.Web容器調(diào)用Servlet的init()方法,對(duì)Servlet進(jìn)行初始化。
3.Servlet初始化后,將一直存在于容器中,用于響應(yīng)客戶端請(qǐng)求,如果客戶端發(fā)送GET請(qǐng)求,容器調(diào)用Servlet的doGet()方法處理并響應(yīng)請(qǐng)求;如果客戶端發(fā)送POST請(qǐng)求,容器調(diào)用Servlet的doPost()方法處理并響應(yīng)請(qǐng)求。或者統(tǒng)一使用service()方法處理來(lái)響應(yīng)用戶請(qǐng)求。
4.Web容器決定銷毀Servlet時(shí),先調(diào)用Servlet的destory()方法,通常在關(guān)閉Web應(yīng)用時(shí)銷毀Servlet實(shí)例。
2.Servlet配置:
為了讓Servlet能響應(yīng)用戶請(qǐng)求,還必須將Servlet配置在web應(yīng)用中,配置Servlet需要修改web.xml文件。
從Servlet3.0開(kāi)始,配置Servlet有兩種方式:
?在Servlet類中使用@WebServlet Annotation進(jìn)行配置。
?在web.xml文件中進(jìn)行配置。
我們用web.xml文件來(lái)配置Servlet,需要配置
java.lang.String.getInitParameter(java.lang.String name):用于獲取初始化參數(shù)
ServletConfig獲取配置參數(shù)的方法和ServletContext獲取配置參數(shù)的方法完全一樣,只是ServletConfig是取得當(dāng)前Servlet的配置參數(shù),而ServletContext是獲取整個(gè)Web應(yīng)用的配置參數(shù)。
1.
?
?
?
2.
?
?
?
3.
如果load-on-startup元素存在,而且也指定了jsp-file元素,則JSP文件會(huì)被重新編譯成Servlet,同時(shí)產(chǎn)生的Servlet也被載入內(nèi)存。
舉個(gè)例子:如果有兩個(gè)Servlet元素都含有
4.
?
?
5.加載Servlet的過(guò)程
容器的Context對(duì)象對(duì)請(qǐng)求路徑(URL)做出處理,去掉請(qǐng)求URL的上下文路徑后,按路徑映射規(guī)則和Servlet映射路徑(
3.DispatcherServlet在web.xml中的配置:
business org.springframework.web.servlet.DispatcherServlet publishContext false 1
配置Spring MVC,指定處理請(qǐng)求的Servlet,有兩種方式:
? 默認(rèn)查找MVC配置文件的地址是:/WEB-INF/${servletName}-servlet.xml
? 可以通過(guò)配置修改MVC配置文件的位置,需要在配置DispatcherServlet時(shí)指定MVC配置文件的位置。
我們?cè)谄脚_(tái)項(xiàng)目?jī)蓚€(gè)工程中分別使用了不同的配置方式,介紹如下:
我們?cè)赽usiness-client工程中按照默認(rèn)方式查找MVC的配置文件,配置文件目錄為: /WEB-INF/business-servlet.xml。工程目錄結(jié)構(gòu)如下所示:
我們?cè)趐ublic-base-server工程中,通過(guò)第2種方式進(jìn)行配置,把spring-servlet.xml放到src/main/resources/config/spring-servlet.xml,則需要在配置DispatcherServlet時(shí)指定
spring org.springframework.web.servlet.DispatcherServlet publishContext false contextConfigLocation classpath:config/spring-servlet.xml 1
工程目錄結(jié)構(gòu)如下:
其中,classpath是web項(xiàng)目的類路徑,可以理解為classes下面。因?yàn)闊o(wú)論這些配置文件放在哪,編譯之后如果沒(méi)有特殊情況的話都直接在classes下面。jar包的話雖然放在lib文件夾里,但實(shí)際上那些類可以直接引用,比如:com.test.ABC,仿佛也在classes下面一樣。
在我們的工程里,經(jīng)過(guò)驗(yàn)證,maven工程這兩個(gè)
路徑經(jīng)過(guò)編譯后生成的文件都位于classes目錄下,即這兩個(gè)路徑相當(dāng)于類路徑,在下面創(chuàng)建config文件夾(folder),然后創(chuàng)建自定義的xml配置文件即可。
classpath和classpath*區(qū)別:
同名資源存在時(shí),classpath只從第一個(gè)符合條件的classpath中加載資源,而classpath*會(huì)從所有的classpath中加載符合條件的資源。classpath*,需要遍歷所有的classpath,效率肯定比不上classpath,因此在項(xiàng)目設(shè)計(jì)的初期就盡量規(guī)劃好資源文件所在的路徑,避免使用classpath*來(lái)加載。
4.ContextLoaderListener和DispatcherServlet初始化上下文關(guān)系和區(qū)別:
從上圖可以看出,ContextLoaderListener初始化的上下文加載的Bean是對(duì)于整個(gè)應(yīng)用程序共享的,一般如:DAO層、Service層Bean;DispatcherServlet初始化的上下文加載的Bean是只對(duì)Spring MVC有效的Bean,如:Controller、HandlerMapping、HandlerAdapter等,該初始化上下文只加載Web相關(guān)組件。
注意:用戶可以配置多個(gè)DispatcherServlet來(lái)分別處理不同的url請(qǐng)求,每個(gè)DispatcherServlet上下文都對(duì)應(yīng)一個(gè)自己的子Spring容器,他們都擁有相同的父Spring容器(業(yè)務(wù)層,持久(dao)bean所在的容器)。
10.
index.html
上述就是小編為大家分享的 web.xml的加載過(guò)程有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。