摘要:的版本增加了對事件監(jiān)聽程序的支持,事件監(jiān)聽程序在建立修改和刪除會話或環(huán)境時得到通知。元素指出事件監(jiān)聽程序類。過濾器配置將一個名字與一個實現(xiàn)接口的類相關(guān)聯(lián)。
1.簡介
web.xml文件是Java web項目中的一個配置文件,主要用于配置歡迎頁、Filter、Listener、Servlet等,但并不是必須的,一個java web項目沒有web.xml文件照樣能跑起來。Tomcat容器/conf目錄下也有作用于全局web應(yīng)用web.xml文件,當(dāng)一個web項目要啟動時,Tomcat會首先加載項目中的web.xml文件,然后通過其中的配置來啟動項目,只有配置的各項沒有錯誤時,項目才能正常啟動。
那么web.xml文件中到底有些什么內(nèi)容呢?我們要如何去配置它以適應(yīng)我們的項目呢?
首先讓我們從Tomcat加載資源的順序開始,一步步分析web.xml文件的作用。
Tomcat啟動時加載資源主要有三個階段:
第一階段:JVM相關(guān)資源
(1)$JAVA_HOME/jre/lib/ext/*.jar (2)系統(tǒng)classpath環(huán)境變量中的*.jar和*.class
第二階段:Tomcat自身相關(guān)資源
(1)$CATALINA_HOME/common/classes/*.class (2)$CATALINA_HOME/commons/endorsed/*.jar (3)$CATALINA_HOME/commons/i18n/*.jar (4)$CATALINA_HOME/common/lib/*.jar (5)$CATALINA_HOME/server/classes/*.class (6)$CATALINA_HOME/server/lib/*.jar (7)$CATALINA_BASE/shared/classes/*.class (8)$CATALINA_BASE/shared/lib/*.jar
第三階段:Web應(yīng)用相關(guān)資源
(1)具體應(yīng)用的webapp目錄: /WEB-INF/classes/*.class (2)具體應(yīng)用的webapp: /WEB-INF/lib/*.jar
在同一個文件夾下,jar包是按順序從上到下依次加載,由ClassLoader的雙親委托模式加載機(jī)制我們可以知道,假設(shè)兩個包名和類名完全相同的class文件不再同一個jar包,如果一個class文件已經(jīng)被加載java虛擬機(jī)里了,那么后面的相同的class文件就不會被加載了。
但tomcat的加載運(yùn)行機(jī)制與JAVA虛擬機(jī)的父類委托機(jī)制稍有不同。
下面來做詳細(xì)敘述:
1、首先加載TOMCAT_HOME/lib目錄下的jar包
2、然后加載TOMCAT_HOME/webapps/項目名/WEB-INF/lib的jar包
3、最后加載的是TOMCAT_HOME/webapps/項目名/WEB-INF/classes下的類文件
值得注意的關(guān)鍵是:tomcat按上述順序依次加載資源,當(dāng)后加載的資源與之前加載的資源相重時,后加載的資源會繼續(xù)加載并將之前的資源覆蓋。
Tomcat的具體內(nèi)部細(xì)節(jié)及解讀可以參考:
Apache Tomcat 9 (9.0.0.M26) - Documentation
極客學(xué)院wiki - 《Tomcat 8 權(quán)威指南》
《深入剖析Tomcat》
3.web.xml配置文件簡介servlet和JSP規(guī)范在發(fā)展階段中出現(xiàn)了很多的web.xml配置版本,如3.0、3.1、4.0等,版本的變更會改變web.xml對應(yīng)的配置代碼。下圖是來自Tomcat官網(wǎng)的Servlet和JSP規(guī)范規(guī)范與的Apache Tomcat版本之間的對應(yīng)關(guān)系:
下面是各個版本的web.xml配置示例代碼:
servlet 2.5 [Tomcat 6.0.x(archived)]
...
servlet 3.0 [Tomcat 7.0.x]
...
servlet 3.1 [Tomcat 8.0.x (superseded) & 8.5.x]
...
servlet 4.0 [Tomcat 9.0.x]
...
在tomcat目錄${CATALINA_HOME}/conf下和web應(yīng)用目錄${CATALINA_HOME}/webapps/WebDemo(WebDemo為web應(yīng)用名)下都有web.xml這個文件,但是內(nèi)容不一樣。
Tomcat在激活、加載、部署web應(yīng)用時,會解析加載${CATALINA_HOME}/conf目錄下所有web應(yīng)用通用的web.xml,然后解析加載web應(yīng)用目錄中的WEB-INF/web.xml。
其實根據(jù)他們的位置,我們就可以知道,conf/web.xml文件中的設(shè)定會應(yīng)用于所有的web應(yīng)用程序,而某些web應(yīng)用程序的WEB-INF/web.xml中的設(shè)定只應(yīng)用于該應(yīng)用程序本身。
如果沒有WEB-INF/web.xml文件,tomcat會輸出找不到的消息,但仍然會部署并使用web應(yīng)用程序,servlet規(guī)范的作者想要實現(xiàn)一種能迅速并簡易設(shè)定新范圍的方法,以用作測試,因此,這個web.xml并不是必要的,不過通常最好還是讓每一個上線的web應(yīng)用程序都有一個自己的WEB-INF/web.xml。
3.web.xml元素配置詳解web.xml文件加載順序為:(與順序無關(guān))
ServletContext -> context-param -> listener -> filter -> servlet
web.xml中定義了以下元素:
定義了WEB應(yīng)用的名字 聲明WEB應(yīng)用的描述信息 context-param元素聲明應(yīng)用范圍內(nèi)的初始化參數(shù)。 過濾器元素將一個名字與一個實現(xiàn)javax.servlet.Filter接口的類相關(guān)聯(lián)。 一旦命名了一個過濾器,就要利用filter-mapping元素把它與一個或多個servlet或JSP頁面相關(guān)聯(lián)。 servlet API的版本2.3增加了對事件監(jiān)聽程序的支持,事件監(jiān)聽程序在建立、修改和刪除會話或servlet環(huán)境時得到通知。Listener元素指出事件監(jiān)聽程序類。 在向servlet或JSP頁面制定初始化參數(shù)或定制URL時,必須首先命名servlet或JSP頁面。Servlet元素就是用來完成此項任務(wù)的。 服務(wù)器一般為servlet提供一個缺省的URL:http://host/webAppPrefix/servlet/ServletName. 但是,常常會更改這個URL,以便servlet可以訪問初始化參數(shù)或更容易地處理相對URL。在更改缺省URL時,使用servlet-mapping元素。 如果某個會話在一定時間內(nèi)未被訪問,服務(wù)器可以拋棄它以節(jié)省內(nèi)存。 可通過使用HttpSession的setMaxInactiveInterval方法明確設(shè)置單個會話對象的超時值,或者可利用session-config元素制定缺省超時值。 如果Web應(yīng)用具有想到特殊的文件,希望能保證給他們分配特定的MIME類型,則mime-mapping元素提供這種保證。 指示服務(wù)器在收到引用一個目錄名而不是文件名的URL時,使用哪個文件。 在返回特定HTTP狀態(tài)代碼時,或者特定類型的異常被拋出時,能夠制定將要顯示的頁面。 對標(biāo)記庫描述符文件(Tag Libraryu Descriptor file)指定別名。此功能使你能夠更改TLD文件的位置,而不用編輯使用這些文件的JSP頁面。 聲明與資源相關(guān)的一個管理對象。 聲明一個資源工廠使用的外部資源。 制定應(yīng)該保護(hù)的URL。它與login-config元素聯(lián)合使用 指定服務(wù)器應(yīng)該怎樣給試圖訪問受保護(hù)頁面的用戶授權(quán)。它與sercurity-constraint元素聯(lián)合使用。 給出安全角色的一個列表,這些角色將出現(xiàn)在servlet元素內(nèi)的security-role-ref元素的role-name子元素中。分別地聲明角色可使高級IDE處理安全信息更為容易。 聲明Web應(yīng)用的環(huán)境項。 聲明一個EJB的主目錄的引用。 聲明一個EJB的本地主目錄的應(yīng)用。
相應(yīng)元素的配置:
Web應(yīng)用圖標(biāo):指出IDE和GUI工具用來表示W(wǎng)eb應(yīng)用的大圖標(biāo)和小圖標(biāo)
/images/app_small.gif /images/app_large.gif
Web 應(yīng)用名稱:提供GUI工具可能會用來標(biāo)記這個特定的Web應(yīng)用的一個名稱
Tomcat Example
Web 應(yīng)用描述: 給出于此相關(guān)的說明性文本
Tomcat Example servlets and JSP pages.
上下文參數(shù):聲明應(yīng)用范圍內(nèi)的初始化參數(shù)。
ContextParameter test It is a test parameter.
在servlet里面可以通過getServletContext().getInitParameter("context/param")得到。
過濾器配置:將一個名字與一個實現(xiàn)javaxs.servlet.Filter接口的類相關(guān)聯(lián)。
setCharacterEncoding com.myTest.setCharacterEncodingFilter encoding GB2312 setCharacterEncoding /*
監(jiān)聽器配置
listener.SessionListener
Servlet配置
基本配置
snoop SnoopServlet snoop /snoop
高級配置
snoop SnoopServlet foo bar Security role for anonymous access tomcat snoop /snoop
元素說明
用來聲明一個servlet的數(shù)據(jù),主要有以下子元素: 指定servlet的名稱 指定servlet的類名稱 指定web站臺中的某個JSP網(wǎng)頁的完整路徑 用來定義參數(shù),可有多個init-param。在servlet類中通過getInitParamenter(String name)方法訪問初始化參數(shù) 指定當(dāng)Web應(yīng)用啟動時,裝載Servlet的次序。 當(dāng)值為正數(shù)或零時:Servlet容器先加載數(shù)值小的servlet,再依次加載其他數(shù)值大的servlet. 當(dāng)值為負(fù)或未定義:Servlet容器將在Web客戶首次訪問這個servlet時加載它 用來定義servlet所對應(yīng)的URL,包含兩個子元素 指定servlet的名稱 指定servlet所對應(yīng)的URL
會話超時配置(單位為分鐘)
120
MIME類型配置
htm text/html
指定歡迎文件頁配置
index.jsp index.html index.htm
配置錯誤頁面
方法1:通過錯誤碼來配置error-page
404 /NotFound.jsp
上面配置了當(dāng)系統(tǒng)發(fā)生404錯誤時,跳轉(zhuǎn)到錯誤處理頁面NotFound.jsp。 方法2:通過異常的類型配置error-page
java.lang.NullException /error.jsp
上面配置了當(dāng)系統(tǒng)發(fā)生java.lang.NullException(即空指針異常)時,跳轉(zhuǎn)到錯誤處理頁面error.jsp
TLD配置
http://jakarta.apache.org/tomcat/debug-taglib /WEB-INF/jsp/debug-taglib.tld
如果MyEclipse一直在報錯,應(yīng)該把放到 中
http://jakarta.apache.org/tomcat/debug-taglib /WEB-INF/pager-taglib.tld
資源管理對象配置
jms/StockQueue
資源工廠配置
mail/Session javax.mail.Session Container
配置數(shù)據(jù)庫連接池就可在此配置:
JNDI JDBC DataSource of shop jdbc/sample_db javax.sql.DataSource Container
安全限制配置
Example Security Constraint Protected Area /jsp/security/protected/* DELETE GET POST PUT tomcat role1
登陸驗證配置
FORM Example-Based Authentiation Area /jsp/security/protected/login.jsp /jsp/security/protected/error.jsp
安全角色:security-role元素給出安全角色的一個列表,這些角色將出現(xiàn)在servlet元素內(nèi)的security-role-ref元素的role-name子元素中。
分別地聲明角色可使高級IDE處理安全信息更為容易。
tomcat
Web環(huán)境參數(shù):env-entry元素聲明Web應(yīng)用的環(huán)境項
minExemptions 1 java.lang.Integer
EJB 聲明
Example EJB reference ejb/Account Entity com.mycompany.mypackage.AccountHome com.mycompany.mypackage.Account
本地EJB聲明
Example Loacal EJB reference ejb/ProcessOrder Session com.mycompany.mypackage.ProcessOrderHome com.mycompany.mypackage.ProcessOrder
配置DWR
4.spring項目中web.xml基礎(chǔ)配置dwr-invoker uk.ltd.getahead.dwr.DWRServlet dwr-invoker /dwr/*
配置基于servlet 3.1
5.流行的web.xml零配置demo demo characterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true characterEncodingFilter /* org.springframework.web.context.ContextLoaderListener contextConfigLocation classpath:spring/applicationContext.xml default *.css default *.swf default *.gif default *.jpg default *.png default *.js default *.html default *.xml default *.json default *.map DispatcherServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring/dispatcher-servlet.xml 1 DispatcherServlet / login.html 404 /nopage.html java.lang.NullPointerException /error.html 360
servlet3.0+規(guī)范后,允許servlet,filter,listener不必聲明在web.xml中,而是以硬編碼的方式存在,實現(xiàn)容器的零配置。
spring框架提供了一些類如WebApplicationInitializer用來配置web.xml,這意味著我們可以舍棄web.xml,僅僅在主程序代碼中進(jìn)行配置。
spring的“約定大于配置”思想也體現(xiàn)在這里,用java注解來優(yōu)化過去繁雜的xml文件配置,大大提高了開發(fā)者的編程速度和體驗。
現(xiàn)在很流行的spring boot框架,只要幾步就可以搭建一個java web項目,根本無需自己手動配置web.xml,框架已經(jīng)為你提供了足夠多的注解、接口及實現(xiàn)類,讓我們能夠?qū)W⒂趹?yīng)用本身。
有關(guān)spring對web.xml配置的隱藏實現(xiàn)細(xì)節(jié),這里就不詳細(xì)展開了,歡迎關(guān)注我的下一篇博客。
6.參考資料Apache Tomcat 9 (9.0.0.M26) - Documentation
極客學(xué)院wiki - 《Tomcat 8 權(quán)威指南》
Tomcat啟動時類加載順序
Tomcat web.xml詳解
Web啟動過程及web.xml配置
tomcat下的web.xml和web工程下web.xml的區(qū)別
web.xml文件的作用及基本配置
web.xml結(jié)構(gòu)
web.xml格式及其詳解
java : maven web項目中的 web.xml
Spring MVC 配置文件 web.xml文件詳解
漫談Spring的啟動與初始化(一)
SpringMVC4零配置--web.xml
本人知識有限,如文中有錯誤或不妥的地方,歡迎私信或評論
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67621.html
摘要:探究系統(tǒng)登錄驗證碼的實現(xiàn)后端掘金驗證碼生成類手把手教程后端博客系統(tǒng)第一章掘金轉(zhuǎn)眼間時間就從月份到現(xiàn)在的十一月份了。提供了與標(biāo)準(zhǔn)不同的工作方式我的后端書架后端掘金我的后端書架月前本書架主要針對后端開發(fā)與架構(gòu)。 Spring Boot干貨系列總綱 | 掘金技術(shù)征文 - 掘金原本地址:Spring Boot干貨系列總綱博客地址:http://tengj.top/ 前言 博主16年認(rèn)識Spin...
摘要:當(dāng)兩臺想要互相通信時,只知道對方的地址,是不可以實現(xiàn)的。要想實現(xiàn)通信,必須通過地址,查詢對方的地址,才能夠?qū)崿F(xiàn)通信。地址就是無線或者有線網(wǎng)卡的硬件地址。所謂地址解析就是主機(jī)在發(fā)送幀前將目標(biāo)地址轉(zhuǎn)換成目標(biāo)地址的過程。 當(dāng)兩臺pc想要互相通信時,只知道對方的ip地址,是不可以實現(xiàn)的。要想實現(xiàn)通信,必須通過IP地址,...
摘要:關(guān)于中的消息機(jī)制就進(jìn)行到這里,下一篇將講講中的內(nèi)存泄漏問題以及處理方法。 這幾天對handler有一些研究,寫出來供大家看看。 一、消息機(jī)制詳解 Android程序中,主要是通過消息機(jī)制來推動整個程序運(yùn)作的。而消息機(jī)制中,完成主要功能的主要有以下幾個類: 1、Looper 2、Message、MessageQueue 3、handler 這是最基礎(chǔ)的幾個消息機(jī)制類,下面探究一下這幾個類...
閱讀 2694·2023-04-25 17:58
閱讀 2978·2021-11-15 11:38
閱讀 2378·2021-11-02 14:48
閱讀 1184·2021-08-25 09:40
閱讀 1823·2019-08-30 15:53
閱讀 1093·2019-08-30 15:52
閱讀 1031·2019-08-30 13:55
閱讀 2437·2019-08-29 15:21