關於web.xml配置的那些事兒

1.簡介

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

2.Tomcat加載資源順序

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的具體內部細節及解讀能夠參考:數據庫

3.web.xml配置文件簡介

servlet和JSP規範在發展階段中出現了不少的web.xml配置版本,如3.0、3.一、4.0等,版本的變動會改變web.xml對應的配置代碼。下圖是來自Tomcat官網的Servlet和JSP規範規範與的Apache Tomcat版本之間的對應關係:apache

Servlet和JSP規範規範與的Apache Tomcat版本之間的對應關係

下面是各個版本的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。

3.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>

相應元素的配置:

  1. Web應用圖標:指出IDE和GUI工具用來表示Web應用的大圖標和小圖標

    <icon> 
        <small-icon>/images/app_small.gif</small-icon> 
        <large-icon>/images/app_large.gif</large-icon> 
    </icon>
  2. Web 應用名稱:提供GUI工具可能會用來標記這個特定的Web應用的一個名稱

    <display-name>Tomcat Example</display-name>
  3. Web 應用描述: 給出於此相關的說明性文本

    <disciption>Tomcat Example servlets and JSP pages.</disciption>
  4. 上下文參數:聲明應用範圍內的初始化參數。

    <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. 過濾器配置:將一個名字與一個實現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>
  6. 監聽器配置

    <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>
    高級配置
    <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
  8. 會話超時配置(單位爲分鐘)

    <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. 配置錯誤頁面
    方法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

  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一直在報錯,應該把<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. 資源管理對象配置

    <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>
    配置數據庫鏈接池就可在此配置:
    <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. 登錄驗證配置

    <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元素給出安全角色的一個列表,這些角色將出如今servlet元素內的security-role-ref元素的role-name子元素中。
    分別地聲明角色可以使高級IDE處理安全信息更爲容易。

    <security-role> 
    <role-name>tomcat</role-name> 
    </security-role>
  18. 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>
  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>

4.spring項目中web.xml基礎配置

配置基於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>

5.流行的web.xml零配置

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配置的隱藏實現細節,這裏就不詳細展開了,歡迎關注個人下一篇博客。

6.參考資料

本人知識有限,如文中有錯誤或不妥的地方,歡迎私信或評論

相關文章
相關標籤/搜索