web.xml文件是Java web項目中的一個配置文件,主要用於配置歡迎頁、Filter、Listener、Servlet等,但並非必須的,一個java web項目沒有web.xml文件照樣能跑起來。Tomcat容器/conf
目錄下也有做用於全局web應用web.xml文件,當一個web項目要啓動時,Tomcat會首先加載項目中的web.xml文件,而後經過其中的配置來啓動項目,只有配置的各項沒有錯誤時,項目才能正常啓動。css
那麼web.xml文件中到底有些什麼內容呢?咱們要如何去配置它以適應咱們的項目呢?
首先讓咱們從Tomcat加載資源的順序開始,一步步分析web.xml文件的做用。html
Tomcat啓動時加載資源主要有三個階段:java
第一階段:JVM相關資源git
(1)$JAVA_HOME/jre/lib/ext/*.jar (2)系統classpath環境變量中的*.jar和*.class
第二階段:Tomcat自身相關資源github
(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應用相關資源web
(1)具體應用的webapp目錄: /WEB-INF/classes/*.class (2)具體應用的webapp: /WEB-INF/lib/*.jar
在同一個文件夾下,jar包是按順序從上到下依次加載,由ClassLoader的雙親委託模式加載機制咱們能夠知道,假設兩個包名和類名徹底相同的class文件再也不同一個jar包,若是一個class文件已經被加載java虛擬機裏了,那麼後面的相同的class文件就不會被加載了。spring
但tomcat的加載運行機制與JAVA虛擬機的父類委託機制稍有不一樣。
下面來作詳細敘述:
一、首先加載TOMCAT_HOME/lib目錄下的jar包
二、而後加載TOMCAT_HOME/webapps/項目名/WEB-INF/lib的jar包
三、最後加載的是TOMCAT_HOME/webapps/項目名/WEB-INF/classes下的類文件
值得注意的關鍵是:tomcat按上述順序依次加載資源,當後加載的資源與以前加載的資源相重時,後加載的資源會繼續加載並將以前的資源覆蓋。sql
Tomcat的具體內部細節及解讀能夠參考:數據庫
servlet和JSP規範在發展階段中出現了不少的web.xml配置版本,如3.0、3.一、4.0等,版本的變動會改變web.xml對應的配置代碼。下圖是來自Tomcat官網的Servlet和JSP規範規範與的Apache Tomcat版本之間的對應關係:apache
下面是各個版本的web.xml配置示例代碼:
servlet 2.5 [Tomcat 6.0.x(archived)]
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> ... </web-app>
servlet 3.0 [Tomcat 7.0.x]
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"> ... </web-app>
servlet 3.1 [Tomcat 8.0.x (superseded) & 8.5.x]
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" metadata-complete="true"> ... </web-app>
servlet 4.0 [Tomcat 9.0.x]
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="true"> ... </web-app>
在tomcat目錄${CATALINA_HOME}/conf
下和web應用目錄${CATALINA_HOME}/webapps/WebDemo
(WebDemo爲web應用名)下都有web.xml這個文件,可是內容不同。
Tomcat在激活、加載、部署web應用時,會解析加載${CATALINA_HOME}/conf
目錄下全部web應用通用的web.xml,而後解析加載web應用目錄中的WEB-INF/web.xml
。
其實根據他們的位置,咱們就能夠知道,conf/web.xml文件中的設定會應用於全部的web應用程序,而某些web應用程序的WEB-INF/web.xml中的設定只應用於該應用程序自己。
若是沒有WEB-INF/web.xml文件,tomcat會輸出找不到的消息,但仍然會部署並使用web應用程序,servlet規範的做者想要實現一種能迅速並簡易設定新範圍的方法,以用做測試,所以,這個web.xml並非必要的,不過一般最好仍是讓每個上線的web應用程序都有一個本身的WEB-INF/web.xml。
web.xml文件加載順序爲:(與順序無關)
ServletContext -> context-param -> listener -> filter -> servlet
web.xml中定義瞭如下元素:
<web-app> <display-name></display-name>定義了WEB應用的名字 <description></description> 聲明WEB應用的描述信息 <context-param></context-param> context-param元素聲明應用範圍內的初始化參數。 <filter></filter> 過濾器元素將一個名字與一個實現javax.servlet.Filter接口的類相關聯。 <filter-mapping></filter-mapping> 一旦命名了一個過濾器,就要利用filter-mapping元素把它與一個或多個servlet或JSP頁面相關聯。 <listener></listener>servlet API的版本2.3增長了對事件監聽程序的支持,事件監聽程序在創建、修改和刪除會話或servlet環境時獲得通知。Listener元素指出事件監聽程序類。 <servlet></servlet> 在向servlet或JSP頁面制定初始化參數或定製URL時,必須首先命名servlet或JSP頁面。Servlet元素就是用來完成此項任務的。 <servlet-mapping></servlet-mapping> 服務器通常爲servlet提供一個缺省的URL:http://host/webAppPrefix/servlet/ServletName. 可是,經常會更改這個URL,以便servlet能夠訪問初始化參數或更容易地處理相對URL。在更改缺省URL時,使用servlet-mapping元素。 <session-config></session-config> 若是某個會話在必定時間內未被訪問,服務器能夠拋棄它以節省內存。 可經過使用HttpSession的setMaxInactiveInterval方法明確設置單個會話對象的超時值,或者可利用session-config元素制定缺省超時值。 <mime-mapping></mime-mapping>若是Web應用具備想到特殊的文件,但願能保證給他們分配特定的MIME類型,則mime-mapping元素提供這種保證。 <welcome-file-list></welcome-file-list> 指示服務器在收到引用一個目錄名而不是文件名的URL時,使用哪一個文件。 <error-page></error-page> 在返回特定HTTP狀態代碼時,或者特定類型的異常被拋出時,可以制定將要顯示的頁面。 <taglib></taglib> 對標記庫描述符文件(Tag Libraryu Descriptor file)指定別名。此功能使你可以更改TLD文件的位置,而不用編輯使用這些文件的JSP頁面。 <resource-env-ref></resource-env-ref>聲明與資源相關的一個管理對象。 <resource-ref></resource-ref> 聲明一個資源工廠使用的外部資源。 <security-constraint></security-constraint> 制定應該保護的URL。它與login-config元素聯合使用 <login-config></login-config> 指定服務器應該怎樣給試圖訪問受保護頁面的用戶受權。它與sercurity-constraint元素聯合使用。 <security-role></security-role>給出安全角色的一個列表,這些角色將出如今servlet元素內的security-role-ref元素的role-name子元素中。分別地聲明角色可以使高級IDE處理安全信息更爲容易。 <env-entry></env-entry>聲明Web應用的環境項。 <ejb-ref></ejb-ref>聲明一個EJB的主目錄的引用。 <ejb-local-ref></ejb-local-ref>聲明一個EJB的本地主目錄的應用。 </web-app>
相應元素的配置:
Web應用圖標:指出IDE和GUI工具用來表示Web應用的大圖標和小圖標
<icon> <small-icon>/images/app_small.gif</small-icon> <large-icon>/images/app_large.gif</large-icon> </icon>
Web 應用名稱:提供GUI工具可能會用來標記這個特定的Web應用的一個名稱
<display-name>Tomcat Example</display-name>
Web 應用描述: 給出於此相關的說明性文本
<disciption>Tomcat Example servlets and JSP pages.</disciption>
上下文參數:聲明應用範圍內的初始化參數。
<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")獲得。
過濾器配置:將一個名字與一個實現javaxs.servlet.Filter接口的類相關聯。
<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>
監聽器配置
<listener> <listerner-class>listener.SessionListener</listener-class> </listener>
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>
高級配置
<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> 用來聲明一個servlet的數據,主要有如下子元素: <servlet-name></servlet-name> 指定servlet的名稱 <servlet-class></servlet-class> 指定servlet的類名稱 <jsp-file></jsp-file> 指定web站臺中的某個JSP網頁的完整路徑 <init-param></init-param> 用來定義參數,可有多個init-param。在servlet類中經過getInitParamenter(String name)方法訪問初始化參數 <load-on-startup></load-on-startup>指定當Web應用啓動時,裝載Servlet的次序。 當值爲正數或零時:Servlet容器先加載數值小的servlet,再依次加載其餘數值大的servlet. 當值爲負或未定義:Servlet容器將在Web客戶首次訪問這個servlet時加載它 <servlet-mapping></servlet-mapping> 用來定義servlet所對應的URL,包含兩個子元素 <servlet-name></servlet-name> 指定servlet的名稱 <url-pattern></url-pattern> 指定servlet所對應的URL
會話超時配置(單位爲分鐘)
<session-config> <session-timeout>120</session-timeout> </session-config>
MIME類型配置
<mime-mapping> <extension>htm</extension> <mime-type>text/html</mime-type> </mime-mapping>
指定歡迎文件頁配置
<welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> </welcome-file-list>
配置錯誤頁面
方法1:經過錯誤碼來配置error-page
<error-page> <error-code>404</error-code> <location>/NotFound.jsp</location> </error-page>
上面配置了當系統發生404錯誤時,跳轉到錯誤處理頁面NotFound.jsp。 方法2:經過異常的類型配置error-page
<error-page> <exception-type>java.lang.NullException</exception-type> <location>/error.jsp</location> </error-page>
上面配置了當系統發生java.lang.NullException(即空指針異常)時,跳轉到錯誤處理頁面error.jsp
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一直在報錯,應該把<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>
資源管理對象配置
<resource-env-ref> <resource-env-ref-name>jms/StockQueue</resource-env-ref-name> </resource-env-ref>
資源工廠配置
<resource-ref> <res-ref-name>mail/Session</res-ref-name> <res-type>javax.mail.Session</res-type> <res-auth>Container</res-auth> </resource-ref>
配置數據庫鏈接池就可在此配置:
<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>
安全限制配置
<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>
登錄驗證配置
<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>
安全角色:security-role元素給出安全角色的一個列表,這些角色將出如今servlet元素內的security-role-ref元素的role-name子元素中。
分別地聲明角色可以使高級IDE處理安全信息更爲容易。
<security-role> <role-name>tomcat</role-name> </security-role>
Web環境參數:env-entry元素聲明Web應用的環境項
<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>
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>
本地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>
配置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>
配置基於servlet 3.1
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1" metadata-complete="true"> <display-name>demo</display-name> <description>demo</description> <!-- 在Spring框架中是如何解決從頁面傳來的字符串的編碼問題的呢? 下面咱們來看看Spring框架給咱們提供過濾器CharacterEncodingFilter 這個過濾器就是針對於每次瀏覽器請求進行過濾的,而後再其之上添加了父類沒有的功能即處理字符編碼。 其中encoding用來設置編碼格式,forceEncoding用來設置是否理會 request.getCharacterEncoding()方法,設置爲true則強制覆蓋以前的編碼格式。--> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 項目中使用Spring 時,applicationContext.xml配置文件中並無BeanFactory,要想在業務層中的class 文件中直接引用Spring容器管理的bean可經過如下方式--> <!--一、在web.xml配置監聽器ContextLoaderListener--> <!--ContextLoaderListener的做用就是啓動Web容器時,自動裝配ApplicationContext的配置信息。由於它實現了ServletContextListener這個接口,在web.xml配置這個監聽器,啓動容器時,就會默認執行它實現的方法。 在ContextLoaderListener中關聯了ContextLoader這個類,因此整個加載配置過程由ContextLoader來完成。 它的API說明 第一段說明ContextLoader能夠由 ContextLoaderListener和ContextLoaderServlet生成。 若是查看ContextLoaderServlet的API,能夠看到它也關聯了ContextLoader這個類並且它實現了HttpServlet 這個接口 第二段,ContextLoader建立的是 XmlWebApplicationContext這樣一個類,它實現的接口是WebApplicationContext->ConfigurableWebApplicationContext->ApplicationContext-> BeanFactory這樣一來spring中的全部bean都由這個類來建立 IUploaddatafileManager uploadmanager = (IUploaddatafileManager) ContextLoaderListener.getCurrentWebApplicationContext().getBean("uploadManager");--> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--二、部署applicationContext的xml文件--> <!--若是在web.xml中不寫任何參數配置信息,默認的路徑是"/WEB-INF/applicationContext.xml, 在WEB-INF目錄下建立的xml文件的名稱必須是applicationContext.xml。 若是是要自定義文件名能夠在web.xml里加入contextConfigLocation這個context參數: 在<param-value> </param-value>裏指定相應的xml文件名,若是有多個xml文件,能夠寫在一塊兒並以「,」號分隔。 也能夠這樣applicationContext-*.xml採用通配符,好比這那個目錄下有applicationContext-ibatis-base.xml, applicationContext-action.xml,applicationContext-ibatis-dao.xml等文件,都會一同被載入。 在ContextLoaderListener中關聯了ContextLoader這個類,因此整個加載配置過程由ContextLoader來完成。--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext.xml</param-value> </context-param> <!--若是你的DispatcherServlet攔截"/",爲了實現REST風格,攔截了全部的請求,那麼同時對*.js,*.jpg等靜態文件的訪問也就被攔截了。--> <!--方案一:激活Tomcat的defaultServlet來處理靜態文件--> <!--要寫在DispatcherServlet的前面, 讓 defaultServlet先攔截請求,這樣請求就不會進入Spring了,我想性能是最好的吧。--> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.swf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.xml</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.json</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.map</url-pattern> </servlet-mapping> <!--使用Spring MVC,配置DispatcherServlet是第一步。DispatcherServlet是一個Servlet,,因此能夠配置多個DispatcherServlet--> <!--DispatcherServlet是前置控制器,配置在web.xml文件中的。攔截匹配的請求,Servlet攔截匹配規則要自已定義,把攔截下來的請求,依據某某規則分發到目標Controller(咱們寫的Action)來處理。--> <servlet> <servlet-name>DispatcherServlet</servlet-name> <!--在DispatcherServlet的初始化過程當中,框架會在web應用的 WEB-INF文件夾下尋找名爲[servlet-name]-servlet.xml 的配置文件,生成文件中定義的bean。--> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--指明瞭配置文件的文件名,不使用默認配置文件名,而使用dispatcher-servlet.xml配置文件。--> <init-param> <param-name>contextConfigLocation</param-name> <!--其中<param-value>**.xml</param-value> 這裏可使用多種寫法--> <!--一、不寫,使用默認值:/WEB-INF/<servlet-name>-servlet.xml--> <!--二、<param-value>/WEB-INF/classes/dispatcher-servlet.xml</param-value>--> <!--三、<param-value>classpath*:dispatcher-servlet.xml</param-value>--> <!--四、多個值用逗號分隔--> <param-value>classpath:spring/dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <!--是啓動順序,讓這個Servlet隨Servletp容器一塊兒啓動。--> </servlet> <servlet-mapping> <!--這個Servlet的名字是dispatcher,能夠有多個DispatcherServlet,是經過名字來區分的。每個DispatcherServlet有本身的WebApplicationContext上下文對象。同時保存的ServletContext中和Request對象中.--> <!--ApplicationContext是Spring的核心,Context咱們一般解釋爲上下文環境,我想用「容器」來表述它更容易理解一些,ApplicationContext則是「應用的容器」了:P,Spring把Bean放在這個容器中,在須要的時候,用getBean方法取出--> <servlet-name>DispatcherServlet</servlet-name> <!--Servlet攔截匹配規則能夠自已定義,當映射爲@RequestMapping("/user/add")時,爲例,攔截哪一種URL合適?--> <!--一、攔截*.do、*.htm, 例如:/user/add.do,這是最傳統的方式,最簡單也最實用。不會致使靜態文件(jpg,js,css)被攔截。--> <!--二、攔截/,例如:/user/add,能夠實現如今很流行的REST風格。不少互聯網類型的應用很喜歡這種風格的URL。弊端:會致使靜態文件(jpg,js,css)被攔截後不能正常顯示。 --> <url-pattern>/</url-pattern> <!--會攔截URL中帶「/」的請求。--> </servlet-mapping> <welcome-file-list> <!--指定歡迎頁面--> <welcome-file>login.html</welcome-file> </welcome-file-list> <error-page> <!--當系統出現404錯誤,跳轉到頁面nopage.html--> <error-code>404</error-code> <location>/nopage.html</location> </error-page> <error-page> <!--當系統出現java.lang.NullPointerException,跳轉到頁面error.html--> <exception-type>java.lang.NullPointerException</exception-type> <location>/error.html</location> </error-page> <session-config> <!--會話超時配置,單位分鐘--> <session-timeout>360</session-timeout> </session-config> </web-app>
servlet3.0+規範後,容許servlet,filter,listener沒必要聲明在web.xml中,而是以硬編碼的方式存在,實現容器的零配置。
spring框架提供了一些類如WebApplicationInitializer
用來配置web.xml,這意味着咱們能夠捨棄web.xml,僅僅在主程序代碼中進行配置。
spring的「約定大於配置」思想也體如今這裏,用java註解來優化過去繁雜的xml文件配置,大大提升了開發者的編程速度和體驗。
如今很流行的spring boot框架,只要幾步就能夠搭建一個java web項目,根本無需本身手動配置web.xml,框架已經爲你提供了足夠多的註解、接口及實現類,讓咱們可以專一於應用自己。
有關spring對web.xml配置的隱藏實現細節,這裏就不詳細展開了,歡迎關注個人下一篇博客。
本人知識有限,如文中有錯誤或不妥的地方,歡迎私信或評論