大家好,我是IT修真院深圳分院第1期學(xué)員,一枚正直純潔善良的web程序員。今天給大家分享一下,修真院官網(wǎng)JAVA(職業(yè))任務(wù)2的知識(shí)點(diǎn)——web.xml配置。
1.背景介紹
當(dāng)我們?nèi)?dòng)一個(gè)WEB項(xiàng)目時(shí),容器包括(Jetty、Tomcat等)首先會(huì)讀取項(xiàng)目web.xml配置文件里的配置,當(dāng)這一步驟沒有出錯(cuò)并且完成之后,項(xiàng)目才能正常地被啟動(dòng)起來。
2.知識(shí)剖析
2.1?web啟動(dòng)加載過程
web項(xiàng)目啟動(dòng)時(shí),容器首先在web.xml中讀取context-param和listener,然后創(chuàng)建一個(gè)ServletContext,作為全局共享信息存儲(chǔ),將context-param中的name和value存入。然后創(chuàng)建listener實(shí)例,listener繼承了ContextLoader類,由ContextLoader加載上下文(父子),然后容器繼續(xù)讀取filter,實(shí)例化過濾器。然后讀取servlet,根據(jù)load-on-startup的值(整數(shù)值)來決定是即時(shí)實(shí)例化還是第一次請(qǐng)求時(shí)實(shí)例化。
2.2 web.xml標(biāo)簽
2.2.1 web-app
部署描述符的根元素是web-app。DTD文件規(guī)定web-app元素的子元素的語法如下: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*)
問號(hào)(?)表示子元素是可選的,而且只能出現(xiàn)一次。星號(hào)(*)表示子元素可在部署描述符中出現(xiàn)零次或多次。
2.2.2?display-name
web應(yīng)用的名稱,可以在容器的管理系統(tǒng)中查看
2.2.3?distributable
告訴servlet/JSP容器,Web容器中部署的應(yīng)用程序適合在分布式環(huán)境下運(yùn)行。
2.2.4?context-param
含有一對(duì)參數(shù)名和參數(shù)值,用作應(yīng)用的Servlet上下文初始化參數(shù),參數(shù)名在整個(gè)Web應(yīng)用中必須是惟一的,在web應(yīng)用的整個(gè)生命周期中上下文初始化參數(shù)都存在,任意的Servlet和jsp都可以隨時(shí)隨地訪問它。
2.2.5?session-config
用于設(shè)置容器的session參數(shù)。
2.2.6?listener
為web應(yīng)用程序定義監(jiān)聽器,監(jiān)聽器用來監(jiān)聽各種事件。常用的Web事件接口有如下幾個(gè):
ServletContextListener:用于監(jiān)聽Web應(yīng)用的啟動(dòng)和關(guān)閉;
ServletContextAttributeListener:用于監(jiān)聽ServletContext范圍(application)內(nèi)屬性的改變;
ServletRequestListener:用于監(jiān)聽用戶的請(qǐng)求;
ServletRequestAttributeListener:用于監(jiān)聽ServletRequest范圍(request)內(nèi)屬性的改變;
HttpSessionListener:用于監(jiān)聽用戶session的開始和結(jié)束;
HttpSessionAttributeListener:用于監(jiān)聽HttpSession范圍(session)內(nèi)屬性的改變。
2.2.7?filter
filter可認(rèn)為是Servlet的一種“加強(qiáng)版”,主要用于對(duì)用戶請(qǐng)求request進(jìn)行預(yù)處理,也可以對(duì)response進(jìn)行后處理,是個(gè)典型的處理鏈。使用filter的完整流程是:filter對(duì)用戶請(qǐng)求HttpServletRequest進(jìn)行預(yù)處理,接著將請(qǐng)求交給Servlet進(jìn)行處理并生成響應(yīng),最后filter再對(duì)服務(wù)器響應(yīng)HttpServletResponse進(jìn)行后處理。filter與Servlet具有完全相同的生命周期,且filter也可以通過init-param來配置初始化參數(shù),獲取filter的初始化參數(shù)則使用filterConfig的getInitParameter()。
filter在web.xml中配置,可包含filter-name、filter-class、init-param等子元素.
2.2.8?filter-mapping
用來聲明Web應(yīng)用中的過濾器映射,過濾器被映射到一個(gè)servlet或一個(gè)URL模式。這個(gè)過濾器的filter和filter-mapping必須具有相同的filter-name,指定該filter所攔截的URL。過濾是按照部署描述符的filter-mapping出現(xiàn)的順序執(zhí)行的。
2.2.9?servlet
運(yùn)行在服務(wù)器端的程序,用于處理及響應(yīng)客戶的請(qǐng)求。
2.2.10?servlet-mapping
將URL模式映射到某個(gè)Servlet,即該Servlet處理的URL。
2.2.11?error-page
設(shè)置系統(tǒng)錯(cuò)誤時(shí)返回的頁面,包括error-code和location。
2.2.12?welcome-file
用來指定首頁文件名稱。welcome-file-list元素可以包含一個(gè)或多個(gè)welcome-file子元素。如果在第一個(gè)welcome-file元素中沒有找到指定的文件,Web容器就會(huì)嘗試顯示第二個(gè),以此類推。
3.常見問題
容器加載過程
4.解決方案
5.編碼實(shí)戰(zhàn)
6.擴(kuò)展思考
Servlet 3.0開始支持用@WebServlet注解來代替web.xml里的配置servlet的作用
7.參考文獻(xiàn)
參考一:spring mvc教程
8.更多討論
不使用web.xml的webapp是什么樣的?
問:url-pattern為什么不能寫成 /** 的形式?如果寫成 /*,會(huì)不會(huì)報(bào)錯(cuò)?
答:/**匹配的是靜態(tài)資源的路徑。/*是一種正常的url-pattern,會(huì)匹配所有的url:路徑型的和后綴型的url(包括/springmvc,.jsp,.js和*.html等)。另外/是rest的匹配風(fēng)格,會(huì)匹配到/springmvc這樣的路徑型url,不會(huì)匹配到模式為*.jsp這樣的后綴型url。web.xml中寫成/**會(huì)報(bào)錯(cuò)。
問:listener、filter、servlet不按這個(gè)順序放會(huì)出現(xiàn)問題嗎?
答:這個(gè)與容器有關(guān),我在本地隨便改順序啟動(dòng)運(yùn)行沒有問題。但是最好按順序來寫,避免遷移的時(shí)候出錯(cuò)。
問:為什么一般只在web.xml中配置一個(gè)servlet?
答:web.xml中的servlet扮演的角色是前段請(qǐng)求分發(fā)器,會(huì)根據(jù)請(qǐng)求的url分配到對(duì)應(yīng)的controller中處理,在內(nèi)部就對(duì)應(yīng)一個(gè)子容器上下文,多個(gè)servlet就對(duì)應(yīng)多個(gè)容器上下文,這樣代價(jià)開銷很大。我們做項(xiàng)目都是rest風(fēng)格,url-pattern統(tǒng)一是/,只一個(gè)就可以。
鳴謝
感謝大家觀看
------------------------------------------------------------------------------------------------------------------------
今天的分享就到這里啦,歡迎大家點(diǎn)贊、轉(zhuǎn)發(fā)、留言、拍磚~