1. 程式人生 > >javaweb 中 web.xml 配置檔案簡述

javaweb 中 web.xml 配置檔案簡述

一.  Servlet介紹:

Servlet通常稱為伺服器端小程式,是執行在伺服器端的程式,用於處理及響應客戶的請求。Servlet是個特殊的java類,繼承於HttpServlet。客戶端通常只有GET和POST兩種請求方式,Servlet為了響應則兩種請求,必須重寫doGet()和doPost()方法。大部分時候,Servlet對於所有的請求響應都是完全一樣的,此時只需要重寫service()方法即可響應客戶端的所有請求。

另外HttpServlet有兩個方法

·        init(ServletConfig config):建立Servlet例項時,呼叫該方法的初始化Servlet資源。

·        destroy():銷燬Servlet例項時,自動呼叫該方法的回收資源。

    通常無需重寫init()和destroy()兩個方法,除非需要在初始化Servlet時,完成某些資源初始化的方法,才考慮重寫init()方法,如果重寫了init()方法,應在重寫該方法的第一行呼叫super.init(config),該方法將呼叫HttpServlet的init()方法。如果需要在銷燬Servlet之前,先完成某些資源的回收,比如關閉資料庫連線,才需要重寫destory方法()。

建立Servlet例項有兩個時機:

·        客戶端第一次請求某個Servlet時,系統建立該Servlet的例項,大部分Servlet都是這種Servlet。

·        Web應用啟動時立即建立Servlet例項,即load-on-start Servlet。

每個Servlet的執行都遵循如下生命週期:

1.  建立Servlet例項。

2.  Web容器呼叫Servlet的init()方法,對Servlet進行初始化。

3.  Servlet初始化後,將一直存在於容器中,用於響應客戶端請求,如果客戶端傳送GET請求,容器呼叫Servlet的doGet()方法處理並響應請求;如果客戶端傳送POST請求,容器呼叫Servlet的doPost()方法處理並響應請求。或者統一使用service()方法處理來響應使用者請求。

4.  Web容器決定銷燬Servlet時,先呼叫Servlet的destory()方法,通常在關閉Web應用時銷燬Servlet例項。

5.  為了讓Servlet能響應使用者請求,還必須將Servlet配置在web應用中,配置Servlet需要修改web.xml檔案。

二.web.xml理解:

    容器的Context物件對請求路徑(URL)做出處理,去掉請求URL的上下文路徑後,按路徑對映規則和Servlet對映路徑(<url- pattern>)做匹配,如果匹配成功,則呼叫這個Servlet處理請求。servlet容器對url的匹配過程:

      當一個請求傳送到servlet容器的時候,容器先會將請求的url減去當前應用上下文的路徑作為servlet的對映url,比如我訪問的是http://localhost/test/aaa.html,我的應用上下文是test,容器會將http://localhost/test去掉,剩下的/aaa.html部分拿來做servlet的對映匹配。這個對映匹配過程是有順序的,而且當有一個servlet匹配成功以後,就不會去理會剩下的servlet了(filter不同,後文會提到)。其匹配規則和順序如下:

1.     精確路徑匹配。例子:比如servletA 的url-pattern為 /test,servletB的url-pattern為 /* ,這個時候,如果我訪問的url為http://localhost/test,這個時候容器就會先進行精確路徑匹配,發現/test正好被servletA精確匹配,那麼就去呼叫servletA,也不會去理會其他的servlet了。

2.     最長路徑匹配。例子:servletA的url-pattern為/test/*,而servletB的url-pattern為/test/a/*,此時訪問http://localhost/test/a時,容器會選擇路徑最長的servlet來匹配,也就是這裡的servletB。

3.     擴充套件匹配,如果url最後一段包含擴充套件,容器將會根據擴充套件選擇合適的servlet。例子:servletA的url-pattern:*.action

4.     如果前面三條規則都沒有找到一個servlet,容器會根據url選擇對應的請求資源。如果應用定義了一個default servlet,則容器會將請求丟給default servlet(什麼是default servlet?後面會講)。

     根據這個規則表,就能很清楚的知道servlet的匹配過程,所以定義servlet的時候也要考慮url-pattern的寫法,以免出錯。

例:
    <!--****************************servlet配置******************************-->  
    <!-- Spring view分發器  對所有的請求都由business對應的類來控制轉發 -->  
    <servlet>  
        <servlet-name>business</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <init-param>  
          <param-name>publishContext</param-name>  
          <param-value>false</param-value>  
        </init-param>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <!-- 使用者登出 -->  
    <servlet>  
        <servlet-name>LogOutServlet</servlet-name>  
        <servlet-class>com.yonyou.mcloud.cas.web.servlet.LogOutServlet</servlet-class>  
        <init-param>  
          <param-name>serverLogoutUrl</param-name>  
          <param-value>https://dev.yonyou.com:443/sso-server/logout</param-value>  
        </init-param>  
        <init-param>  
          <param-name>serverName</param-name>  
          <param-value>http://10.1.215.40:80/business/</param-value>  
        </init-param>  
    </servlet>  
    <!--****************************servlet對映關係配置*************************-->  
    <servlet-mapping>  
        <servlet-name>LogOutServlet</servlet-name>  
        <url-pattern>/logout</url-pattern>  
    </servlet-mapping>  
    <servlet-mapping>  
        <servlet-name>business</servlet-name>  
        <url-pattern>/</url-pattern>  
    </servlet-mapping>