天天看點

java web項目的兩種上下文建構方式

1.前言

  前段時間在做開發需求時,遇到了一個我比較詫異的問題,即tomcat部署應用時,并沒有配置web.xml上下文。這讓我十分疑惑,之後輾轉查詢資料,才知道原來servlet3.0提供了一種基于注解的啟動方式,它與web.xml方式是可替代的。是以今天在查詢了吉奧多的資料後,結合自己的了解,做一個簡單的總結,一方面友善自己日後回憶,另一方面也希望能幫助到有需要的朋友。

2.tomcat伺服器容器的啟動流程

   這裡以tomcat伺服器容器為例,原因是它支援jsp動态語言。不敢保證其它的靜态伺服器具有類似的流程,如nginx,apach server,但是理論方面肯定有一些相似之處。

   雖然我很早以前就看過相關的資料,也整理過一些筆記。但是如今再看,依然惘若初見,說來慚愧。。。具體的我就不班門弄斧了,現在在我所看的資料中,我比較推薦的有這篇:

    TOMCAT原理詳解及請求過程    ------排版是稍微有些亂,但是内容是實打實的幹貨。

    同時可以結合其它朋友的博文資料,加深了解。

    這裡的話,我也想來簡單的了解一下,友善自己回顧: 

    何謂tomcat伺服器容器?

          1.首先,它是一個java程序,依托jvm宿主環境。那麼自然,與其相關的概念就有諸如: 類加載器啦,java源碼啦,位元組碼啦,main啟動程式等等。這一塊可以從 tomcat的bin目錄下的startup.sh裡面的指令來思考;

          2.其次,tomcat定義為servlet容器,可以了解為它是為了滿足servlet規範,或者說它的出現助推了servelt規範的出現(我沒有查詢資料,不保證這句話的正确性)。總而言之,tomcat容器與servlet規範是強耦合的。

          3.servlet規範中,包含了一些常用概念,如Filter,Servlet,Listener。tomcat提供了一些元件,實作了這個servlet規範。

3.基于web.xml的啟動方式

     web.xml是tomcat容器組織上下文的一種方式。

     在一個tomcat容器中,包含了多個層次的web.xml配置。我沒記錯的話應該是有三個層級的配置,分别是: 全局的web.xml配置,context的web.xml配置,應用的web.xm配置,它們存在覆寫關系。預設是應用的配置優先級最高,全局的最低。

     如果曾經配置過web.xml檔案,我們應該知道需要配置servlet,filter,listener用于實作自定義的上下文内容。各自的作用可以參考網上的資料,它也是比較正常的方式,了解方面應該比較好接受。這裡便不過多糾結。

4.基于spi的上下文啟動方式

4.1 servlet3.0規範

    servlet3.0規範中,提供了一些列的注解,用于替代手動輸入配置檔案的方式建構上下文。比如:@WebServlet,@WebFilter,@WebListener等,具體可以參看這篇博文:

                Servlet3.0的新特性

4.2 注解啟動的前提

   1.上面的參考博文有說到: tomcat需要7.0以上; 我猜測原因是因為tomcat7.0及以上啟動流程有ServiceLoader的服務發現流程;

   2.jdk需要6.0及以上,是以,tomcat7.0應該最低相容jdk6.0。  原因是 spi機制是jdk6.0提供的,如圖:

java web項目的兩種上下文建構方式

   需要強調的是,SPI機制是JDK提供的功能,而非tomcat提供,也非servlet規範所提供;

  關于spi機制推薦這幾篇博文:

        ​​進階開發必須了解的Java中SPI機制​​

       springMVC之利用Servlet3.0的SPI機制實作零配置原理

5.内置tomcat的啟動流程

   在探索這個問題時,我也有衍生這個問題,即springBoot的内容tomcat如何能夠與springBoot平滑的結合,在今後的程式設計實踐中,我能否将原本需要外部tomcat容器的項目改造為springBoot的tomcat内置容器啟動。比如開源的cas-overlay-web項目。

  在搜尋資料的過程中,推薦這篇寫内置tomcat啟動流程的文章:

          SpringBoot内置tomcat啟動原理