首先可以肯定的是紫新,加載順序與它們?cè)?web.xml 文件中的先后順序無關(guān)。即不會(huì)因?yàn)?filter 寫在 listener 的前面而會(huì)先加載 filter熙卡。最終得出的結(jié)論是:listener -> filter -> servlet
同時(shí)還存在著這樣一種配置節(jié):context-param,它用于向 ServletContext 提供鍵值對(duì)掏湾,即應(yīng)用程序上下文信息。我們的 listener, filter 等在初始化時(shí)會(huì)用到這些上下文中的信息肿嘲,那么 context-param 配置節(jié)是不是應(yīng)該寫在 listener 配置節(jié)前呢融击?實(shí)際上 context-param 配置節(jié)可寫在任意位置,因此真正的加載順序?yàn)椋篶ontext-param -> listener -> filter -> servlet
對(duì)于某類配置節(jié)而言雳窟,與它們出現(xiàn)的順序是有關(guān)的尊浪。以 filter 為例,web.xml 中當(dāng)然可以定義多個(gè) filter封救,與 filter 相關(guān)的一個(gè)配置節(jié)是 filter-mapping拇涤,這里一定要注意,對(duì)于擁有相同 filter-name 的 filter 和 filter-mapping 配置節(jié)而言誉结,filter-mapping 必須出現(xiàn)在 filter 之后鹅士,否則當(dāng)解析到 filter-mapping 時(shí),它所對(duì)應(yīng)的 filter-name 還未定義惩坑。web 容器啟動(dòng)時(shí)初始化每個(gè) filter 時(shí)掉盅,是按照 filter 配置節(jié)出現(xiàn)的順序來初始化的,當(dāng)請(qǐng)求資源匹配多個(gè) filter-mapping 時(shí)以舒,filter 攔截資源是按照 filter-mapping 配置節(jié)出現(xiàn)的順序來依次調(diào)用 doFilter() 方法的趾痘。
servlet 同 filter 類似,此處不再贅述蔓钟。
由此永票,可以看出,web.xml 的加載順序是:context-param -> listener -> filter -> servlet 奋刽,而同個(gè)類型之間的實(shí)際程序調(diào)用的時(shí)候的順序是根據(jù)對(duì)應(yīng)的 mapping 的順序進(jìn)行調(diào)用的瓦侮。
web.xml文件詳解
Xml代碼
Web.xml常用元素
<web-app >
<display-name > </display-name > 定義了WEB應(yīng)用的名字
<description > </description > 聲明WEB應(yīng)用的描述信息
<context-param > </context-param > context-param元素聲明應(yīng)用范圍內(nèi)的初始化參數(shù)。
<filter > </filter > 過濾器元素將一個(gè)名字與一個(gè)實(shí)現(xiàn)javax.servlet.Filter接口的類相關(guān)聯(lián)佣谐。
<filter-mapping > </filter-mapping > 一旦命名了一個(gè)過濾器肚吏,就要利用filter-mapping元素把它與一個(gè)或多個(gè)servlet或JSP頁面相關(guān)聯(lián)。
<listener > </listener > servlet API的版本2.3增加了對(duì)事件監(jiān)聽程序的支持狭魂,事件監(jiān)聽程序在建立罚攀、修改和刪除會(huì)話或servlet環(huán)境時(shí)得到通知。
Listener元素指出事件監(jiān)聽程序類雌澄。
<servlet > </servlet > 在向servlet或JSP頁面制定初始化參數(shù)或定制URL時(shí)斋泄,必須首先命名servlet或JSP頁面。Servlet元素就是用來完成此項(xiàng)任務(wù)的镐牺。
<servlet-mapping > </servlet-mapping > 服務(wù)器一般為servlet提供一個(gè)缺省的URL:http://host/webAppPrefix/servlet/ServletName炫掐。
但是,常常會(huì)更改這個(gè)URL睬涧,以便servlet可以訪問初始化參數(shù)或更容易地處理相對(duì)URL募胃。在更改缺省URL時(shí)旗唁,使用servlet-mapping元素。
<session-config > </session-config > 如果某個(gè)會(huì)話在一定時(shí)間內(nèi)未被訪問痹束,服務(wù)器可以拋棄它以節(jié)省內(nèi)存检疫。
可通過使用HttpSession的setMaxInactiveInterval方法明確設(shè)置單個(gè)會(huì)話對(duì)象的超時(shí)值,或者可利用session-config元素制定缺省超時(shí)值祷嘶。
<mime-mapping > </mime-mapping > 如果Web應(yīng)用具有想到特殊的文件屎媳,希望能保證給他們分配特定的MIME類型,則mime-mapping元素提供這種保證论巍。
<welcome-file-list > </welcome-file-list > 指示服務(wù)器在收到引用一個(gè)目錄名而不是文件名的URL時(shí)烛谊,使用哪個(gè)文件。
<error-page > </error-page > 在返回特定HTTP狀態(tài)代碼時(shí)环壤,或者特定類型的異常被拋出時(shí)晒来,能夠制定將要顯示的頁面。
<taglib > </taglib > 對(duì)標(biāo)記庫(kù)描述符文件(Tag Libraryu Descriptor file)指定別名郑现。此功能使你能夠更改TLD文件的位置湃崩,而不用編輯使用這些文件的JSP頁面。
<resource-env-ref > </resource-env-ref > 聲明與資源相關(guān)的一個(gè)管理對(duì)象接箫。
<resource-ref > </resource-ref > 聲明一個(gè)資源工廠使用的外部資源攒读。 <security-constraint > </security-constraint > 制定應(yīng)該保護(hù)的URL。它與login-config元素聯(lián)合使用
<login-config > </login-config >指定服務(wù)器應(yīng)該怎樣給試圖訪問受保護(hù)頁面的用戶授權(quán)辛友。它與sercurity-constraint元素聯(lián)合使用薄扁。 <security-role > </security-role > 給出安全角色的一個(gè)列表,這些角色將出現(xiàn)在servlet元素內(nèi)的security-role-ref元素
的role-name子元素中废累。分別地聲明角色可使高級(jí)IDE處理安全信息更為容易邓梅。
<env-entry > </env-entry > 聲明Web應(yīng)用的環(huán)境項(xiàng)。
<ejb-ref > </ejb-ref > 聲明一個(gè)EJB的主目錄的引用邑滨。
< ejb-local-ref > </ ejb-local-ref > 聲明一個(gè)EJB的本地主目錄的應(yīng)用日缨。
</web-app >
相應(yīng)元素配置
1、Web應(yīng)用圖標(biāo):指出IDE和GUI工具用來表示W(wǎng)eb應(yīng)用的大圖標(biāo)和小圖標(biāo)
<icon >
<small-icon > /images/app_small.gif</small-icon >
<large-icon > /images/app_large.gif</large-icon >
</icon >
2掖看、Web 應(yīng)用名稱:提供GUI工具可能會(huì)用來標(biāo)記這個(gè)特定的Web應(yīng)用的一個(gè)名稱
<display-name > Tomcat Example</display-name >
3匣距、Web 應(yīng)用描述: 給出于此相關(guān)的說明性文本
<disciption > Tomcat Example servlets and JSP pages.</disciption >
4、上下文參數(shù):聲明應(yīng)用范圍內(nèi)的初始化參數(shù)哎壳。
<context-param >
<param-name > ContextParameter</para-name >
<param-value > test</param-value >
<description > It is a test parameter.</description >
</context-param >
在servlet里面可以通過getServletContext().getInitParameter("context/param")得到
5毅待、過濾器配置:將一個(gè)名字與一個(gè)實(shí)現(xiàn)javaxs.servlet.Filter接口的類相關(guān)聯(lián)。
<filter >
<filter-name > setCharacterEncoding</filter-name >
<filter-class > com.myTest.setCharacterEncodingFilter</filter-class >
<init-param >
<param-name > encoding</param-name >
<param-value > GB2312</param-value >
</init-param >
</filter >
<filter-mapping >
<filter-name > setCharacterEncoding</filter-name >
<url-pattern > /</url-pattern >
</filter-mapping >
6归榕、監(jiān)聽器配置
<listener >
<listerner-class > listener.SessionListener</listener-class >
</listener >
7尸红、Servlet配置
基本配置
<servlet >
<servlet-name > snoop</servlet-name >
<servlet-class > SnoopServlet</servlet-class >
</servlet >
<servlet-mapping >
<servlet-name > snoop</servlet-name >
<url-pattern > /snoop</url-pattern >
</servlet-mapping >
高級(jí)配置
<servlet >
<servlet-name > snoop</servlet-name >
<servlet-class > SnoopServlet</servlet-class >
<init-param >
<param-name > foo</param-name >
<param-value > bar</param-value >
</init-param >
<run-as >
<description > Security role for anonymous access</description >
<role-name > tomcat</role-name >
</run-as >
</servlet >
<servlet-mapping >
<servlet-name > snoop</servlet-name >
<url-pattern > /snoop</url-pattern >
</servlet-mapping >
元素說明
<servlet > </servlet > 用來聲明一個(gè)servlet的數(shù)據(jù),主要有以下子元素:
<servlet-name > </servlet-name > 指定servlet的名稱
<servlet-class > </servlet-class > 指定servlet的類名稱
<jsp-file > </jsp-file > 指定web站臺(tái)中的某個(gè)JSP網(wǎng)頁的完整路徑
<init-param > </init-param > 用來定義參數(shù),可有多個(gè)init-param驶乾。在servlet類中通過getInitParamenter( String name)方法訪問初始化參數(shù)
<load-on-startup > </load-on-startup > 指定當(dāng)Web應(yīng)用啟動(dòng)時(shí)邑飒,裝載Servlet的次序循签。
當(dāng)值為正數(shù)或零時(shí):Servlet容器先加載數(shù)值小的servlet级乐,再依次加載其他數(shù)值大的servlet.
當(dāng)值為負(fù)或未定義:Servlet容器將在Web客戶首次訪問這個(gè)servlet時(shí)加載它
<servlet-mapping > </servlet-mapping > 用來定義servlet所對(duì)應(yīng)的URL,包含兩個(gè)子元素
<servlet-name > </servlet-name > 指定servlet的名稱
<url-pattern > </url-pattern > 指定servlet所對(duì)應(yīng)的URL
8县匠、會(huì)話超時(shí)配置(單位為分鐘)
<session-config >
<session-timeout > 120</session-timeout >
</session-config >
9风科、MIME類型配置
<mime-mapping >
<extension > htm</extension >
<mime-type > text/html</mime-type >
</mime-mapping >
10、指定歡迎文件頁配置
<welcome-file-list >
<welcome-file > index.jsp</welcome-file >
<welcome-file > index.html</welcome-file >
<welcome-file > index.htm</welcome-file >
</welcome-file-list >
11乞旦、配置錯(cuò)誤頁面
一贼穆、 通過錯(cuò)誤碼來配置error-page
<error-page >
<error-code > 404</error-code >
<location > /NotFound.jsp</location >
</error-page >
上面配置了當(dāng)系統(tǒng)發(fā)生404錯(cuò)誤時(shí),跳轉(zhuǎn)到錯(cuò)誤處理頁面NotFound.jsp兰粉。
二故痊、通過異常的類型配置error-page
<error-page >
<exception-type > java.lang.NullException</exception-type >
<location > /error.jsp</location >
</error-page >
上面配置了當(dāng)系統(tǒng)發(fā)生java.lang.NullException(即空指針異常)時(shí),跳轉(zhuǎn)到錯(cuò)誤處理頁面error.jsp
12玖姑、TLD配置
<taglib >
<taglib-uri > http://jakarta.apache.org/tomcat/debug-taglib</taglib-uri >
<taglib-location > /WEB-INF/jsp/debug-taglib.tld</taglib-location >
</taglib >
如果MyEclipse一直在報(bào)錯(cuò),應(yīng)該把<taglib > 放到 <jsp-config > 中
<jsp-config >
<taglib >
<taglib-uri > http://jakarta.apache.org/tomcat/debug-taglib</taglib-uri >
<taglib-location > /WEB-INF/pager-taglib.tld</taglib-location >
</taglib >
</jsp-config >
13愕秫、資源管理對(duì)象配置
<resource-env-ref >
<resource-env-ref-name > jms/StockQueue</resource-env-ref-name >
</resource-env-ref >
14、資源工廠配置
<resource-ref >
<res-ref-name > mail/Session</res-ref-name >
<res-type > javax.mail.Session</res-type >
<res-auth > Container</res-auth >
</resource-ref >
配置數(shù)據(jù)庫(kù)連接池就可在此配置:
<resource-ref >
<description > JNDI JDBC DataSource of shop</description >
<res-ref-name > jdbc/sample_db</res-ref-name >
<res-type > javax.sql.DataSource</res-type >
<res-auth > Container</res-auth >
</resource-ref >
15焰络、安全限制配置
<security-constraint >
<display-name > Example Security Constraint</display-name >
<web-resource-collection >
<web-resource-name > Protected Area</web-resource-name >
<url-pattern > /jsp/security/protected/</url-pattern >
<http-method > DELETE</http-method >
<http-method > GET</http-method >
<http-method > POST</http-method >
<http-method > PUT</http-method >
</web-resource-collection >
<auth-constraint >
<role-name > tomcat</role-name >
<role-name > role1</role-name >
</auth-constraint >
</security-constraint >
16戴甩、登陸驗(yàn)證配置
<login-config >
<auth-method > FORM</auth-method >
<realm-name > Example-Based Authentiation Area</realm-name >
<form-login-config >
<form-login-page > /jsp/security/protected/login.jsp</form-login-page >
<form-error-page > /jsp/security/protected/error.jsp</form-error-page >
</form-login-config >
</login-config >
17、安全角色:security-role元素給出安全角色的一個(gè)列表闪彼,這些角色將出現(xiàn)在servlet元素內(nèi)的security-role-ref元素的role- name子元素中甜孤。
分別地聲明角色可使高級(jí)IDE處理安全信息更為容易。
<security-role >
<role-name > tomcat</role-name >
</security-role >
18畏腕、Web環(huán)境參數(shù):env-entry元素聲明Web應(yīng)用的環(huán)境項(xiàng)
<env-entry >
<env-entry-name > minExemptions</env-entry-name >
<env-entry-value > 1</env-entry-value >
<env-entry-type > java.lang.Integer</env-entry-type >
</env-entry >
19缴川、EJB 聲明
<ejb-ref >
<description > Example EJB reference</decription >
<ejb-ref-name > ejb/Account</ejb-ref-name >
<ejb-ref-type > Entity</ejb-ref-type >
<home > com.mycompany.mypackage.AccountHome</home >
<remote > com.mycompany.mypackage.Account</remote >
</ejb-ref >
20、本地EJB聲明
<ejb-local-ref >
<description > Example Loacal EJB reference</decription >
<ejb-ref-name > ejb/ProcessOrder</ejb-ref-name >
<ejb-ref-type > Session</ejb-ref-type >
<local-home > com.mycompany.mypackage.ProcessOrderHome</local-home >
<local > com.mycompany.mypackage.ProcessOrder</local >
</ejb-local-ref >
21描馅、配置DWR
<servlet >
<servlet-name > dwr-invoker</servlet-name >
<servlet-class > uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet >
<servlet-mapping >
<servlet-name > dwr-invoker</servlet-name>
<url-pattern > /dwr/*</url-pattern>
</servlet-mapping >
22把夸、配置Struts
<display-name > Struts Blank Application</display-name >
<servlet >
<servlet-name > action</servlet-name >
<servlet-class >
org.apache.struts.action.ActionServlet
</servlet-class >
<init-param >
<param-name > detail</param-name >
<param-value > 2</param-value >
</init-param >
<init-param >
<param-name > debug</param-name>
<param-value > 2</param-value >
</init-param >
<init-param >
<param-name > config</param-name >
<param-value > /WEB-INF/struts-config.xml</param-value >
</init-param >
<init-param >
<param-name > application</param-name >
<param-value > ApplicationResources</param-value >
</init-param >
<load-on-startup > 2</load-on-startup>
</servlet >
<servlet-mapping >
<servlet-name > action</servlet-name >
<url-pattern > *.do</url-pattern >
</servlet-mapping >
<welcome-file-list >
<welcome-file > index.jsp</welcome-file >
</welcome-file-list >
<!-- Struts Tag Library Descriptors -->
<taglib >
<taglib-uri > struts-bean</taglib-uri >
<taglib-location> /WEB-INF/tld/struts-bean.tld</taglib-location >
</taglib>
<taglib>
<taglib-uri> struts-html</taglib-uri>
<taglib-location > /WEB-INF/tld/struts-html.tld</taglib-location>
</taglib >
<taglib >
<taglib-uri> struts-nested</taglib-uri>
<taglib-location > /WEB-INF/tld/struts-nested.tld</taglib-location>
</taglib >
<taglib >
<taglib-uri> struts-logic</taglib-uri >
<taglib-location> /WEB-INF/tld/struts-logic.tld</taglib-location>
</taglib>
<taglib >
<taglib-uri> struts-tiles</taglib-uri>
<taglib-location> /WEB-INF/tld/struts-tiles.tld</taglib-location>
</taglib>
23、配置Spring(基本上都是在Struts中配置的)
<!-- 指定spring配置文件位置 -->
<context-param>
<param-name> contextConfigLocation</param-name >
<param-value>
<!--加載多個(gè)spring配置文件 -->
/WEB-INF/applicationContext.xml, /WEB-INF/action-servlet.xml
</param-value>
</context-param>
<!-- 定義SPRING監(jiān)聽器流昏,加載spring -->
<listener >
<listener-class > org.springframework.web.context.ContextLoaderListener</listener-class>
</listener >
<listener >
<listener-class >
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener >