1.背景介紹
2.知識剖析
3.常見問題
4.解決方案
5.編碼實戰(zhàn)
6.擴展思考
7.參考文獻
8.更多討論
1.背景介紹
web.xml作用:
當我們用IDEA創(chuàng)建一個webapp項目時,往往在WEB-INF文件夾下,會生成一個web.xml文件,這個配置文件的作用,就是初始化配置信息的。
比如:Welcome頁面、servlet、servlet-mapping、filter、listener、啟動加載級別等。如果工程不需要上述配置時,則web.xml就不是必需的了。
2.知識剖析
web.xml配置元素:
web.xml配置元素
1.根元素
web.xml的模式文件是由Sun公司定義的,每個web.xml文件的根元素中, 都必須標明這個web.xml使用的是哪個模式文檔。其它的元素都放在之中,也是根節(jié)點。
2.上下文參數(shù)
含有一對或多對參數(shù)名和參數(shù)值,用作應用的Servlet上下文初始化參數(shù),參數(shù)名在整個Web應用中必須是惟一的, 在web應用的整個生命周期中上下文初始化參數(shù)都存在,Servlet和jsp任何時候可以對其進行訪問。
3.監(jiān)聽器
Listener是Servlet的監(jiān)聽器,可以監(jiān)聽客戶端的請求,服務端的操作等。
在application,session,request三個對象創(chuàng)建、銷毀或者屬性變動時自動執(zhí)行代碼的功能組件。
常見的listener有:ServletContextListener、ServletRequestListener、HttpSessionListener等。
4.過濾器
過濾器對web服務器管理的所有web資源:例如Jsp, Servlet, 靜態(tài)圖片文件或靜態(tài) html 文件等進行攔截,從而實現(xiàn)一些特殊的功能。例如實現(xiàn)URL級別的權(quán)限訪問控制、過濾敏感詞匯、壓縮響應信息等一些高級功能。 它主要用于對用戶請求進行預處理,也可以對HttpServletResponse進行后處理。
5.servlet
servlet是一種運行服務器端的java應用程序,具有獨立于平臺和協(xié)議的特性,并且可以動態(tài)的生成web頁面,它工作在客戶端請求與服務器響應的中間層。 Servlet 的主要功能在于交互式地瀏覽和修改數(shù)據(jù),生成動態(tài) Web 內(nèi)容。
servlet后常跟servlet-mapping,該元素在Servlet和URL樣式之間定義一個映射,即servlet類提供一個url,在地址欄輸入對應的映射路徑就可以訪問servlet。
3.常見問題
web.xml的加載過程,元素的加載順序
4.解決方案
WEB容器啟動時,加載過程如下:
1.啟動一個WEB項目的時候,WEB容器會去讀取它的配置文件web.xml,讀取和兩個結(jié)點。
2.然后,容器創(chuàng)建一個ServletContext,這個web項目的所有部分都將共享這個上下文。
3.容器將轉(zhuǎn)換為鍵值對,并交給servletContext。
4.容器創(chuàng)建&lft;listener>中的類實例,創(chuàng)建監(jiān)聽器。
首先可以肯定的是,加載順序與它們在web.xml文件中的先后順序無關(guān)。即不會因為filter寫在listener的前面而會先加載filter。 同時還存在著這樣一種配置節(jié):context-param,它用于向ServletContext提供鍵值對,即應用程序上下文信息。
web.xml的加載順序是:context-param->listener->filter->servlet而同個類型之間的實際程序調(diào)用的時候的順序是根據(jù)對應的mapping的順序進行調(diào)用的。
load-on-startup元素標記容器是否在啟動的時候就加載這個servlet,當配置了多個servelet的時候,容器就需要讀取它的值來決定加載順序。
當值小于0或者沒有指定時,則表示容器在該servlet被選擇時才會去加載。當值為0或者大于0時,表示容器在應用啟動時就加載并初始化這個servlet。
正數(shù)的值越小,該servlet的優(yōu)先級越高,應用啟動時就越先加載。所以,x,中x的取值1,2,3,4,5代表的是優(yōu)先級,而非啟動延遲時間。
5.編碼實戰(zhàn)
6.擴展思考
filter、listener、interceptor之間的區(qū)別
filter能夠在一個請求到達servlet之前預處理用戶請求,也可以在離開servlet時處理http響應: 在執(zhí)行servlet之前,首先執(zhí)行filter程序,并為之做一些預處理工作; 根據(jù)程序需要修改請求和響應; 在servlet被調(diào)用之后截獲servlet的執(zhí)行
listener的作用則與接口類型有關(guān),監(jiān)聽器是在發(fā)生關(guān)注的事件后回調(diào)開發(fā)者提供的方法。
interceptor 攔截器,類似于filter,不過它不在web.xml中配置,跟使用的框架有關(guān),如果使用Spring框架則在spring容器指定的配置文件中配置;并且不是針對URL的,而是針對action,當頁面提交 action時,進行過濾操作。
7.參考文獻
https://www.cnblogs.com/shangxiaofei/p/5328377.html
http://www.blogjava.net/xzclog/archive/2011/09/29/359789.html
8.更多討論
web.xml可選元素和出現(xiàn)次數(shù)?
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*
問號(?)表示子元素是可選的,而且只能出現(xiàn)一次。星號(*)表示子元素可在部署描述符中出現(xiàn)零次或多次。
url-pattern有哪些匹配規(guī)則?
精確匹配 路徑匹配 匹配任意的url
ptteng.github.io/PPT/PPT-java/JAVA-task2-web.xml.html#/