1. 程式人生 > >Tomcat資料夾下的context.xml和web.xml

Tomcat資料夾下的context.xml和web.xml

Tomcat資料夾下conf資料夾中的context.xml檔案存在的目的是什麼?

  • 首先,你要明白一點,tomcat的工作原理是什麼?也是一個Java程式,是一個網路服務。那麼,webapp是如何嵌入的?反射。
  • webapp是如何載入的?webapp的入口? 是servlet和過濾器以及監聽器。這是一個webapp的入口。
    一個webapp又被稱為什麼?在tomcat中被抽象成什麼物件?是ServletContext。
    假如,你的tomcat下部署了兩個webapp。最終你的tomcat中是不是管理了兩個ServletContext物件。每一個物件代表一個webapp。

  • 現在的問題是,為什麼建立2個,而不是3個?tomcat啟動之後為什麼會建立這樣兩個物件?Tomcat資料夾的conf資料夾中的server.xml裡面配置了context標籤。當tomcat啟動的時候,會讀取這個檔案。發現配置了2個context,那麼就應該建立兩個ServletContext物件。

  • 為什麼不同的url會跑到不同的ServeltContext?因為path,context標籤下是不是指定了path,這樣,在tomcat內部就是維護了一個map。每個context對應一個path,這樣,tomcat接受到請求,讀取url,就會把這個請求交給指定的ServletContext。但是,ServletContext粒度很大,一個ServeltContext下管理了很多個serlet,還需要進一步路由。這個路由規則由誰指定?是不是每個ServletContext內部,還會維護一個路由,這個路由就是每個專案的WEB-INF資料夾下的web.xml。也就是說專案裡的web.xml 是來管理自己專案中的東西的。某個具體專案的WEB-INF資料夾下的web.xml的範圍是這個專案ServletVontext的內部級別。

    WEB-INF資料夾下的web.xml是不是配置了不同的sevlet的mapping,全部由這個檔案來指定。那麼,tomcat為什麼知道是這個檔案?這些都需要tomcat這個java程式來讀取、來分配、來指定規則,因為Tomcat資料夾下的conf資料夾中的context.xml中指定了這個web.xml的路徑,

<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

假如你把第一行改了,你改成web2.xml。那麼,你的webapp中也要相應的改成web2.xml

Tomcat資料夾下conf資料夾中的web.xml檔案和自己專案下的web.xml關係

  • 舉一個例子,一個url請求並非一定訪問一個自定義的serlet。比如靜態資源,比如jsp,訪問這樣資源的url,沒有訪問你寫的servlet吧。那麼,tomcat怎麼可以準確的路由過去呢?
  • 你會說因為我的html靜態文字就放在根目錄指定的目錄結構,所以url和他匹配,當然會載入咯。這是一種自然的想法吧。
  • 你肯定會問這個servlet在哪裡?
  • 答案就是Tomcat資料夾下的中的conf資料夾下的web.xml。他是所有的webapp中的web.xml的父親,所有的webapp中的web.xml都會繼承此檔案中的內容。如果子自己專案裡的web.xml配置了一樣的,會覆蓋父親。現在還以為靜態資源是自然根據url路徑匹配嗎?不一定的,你可以覆蓋,寫你自己的規則。那tomcat為什麼要提供這個預設的web.xml給我們繼承呢?因為我上面說的這些靜態資源呀什麼的對於所有的webapp都是一個基本功能。如果他不提供,你就要自己實現,實現靜態檔案的url匹配返回客戶端。這是不是很艱難?好多靜態資源和其他通用的資源,能不讓程式設計人員再次寫url,就不讓多次做重複的工作,減輕程式設計人員的負擔。抽取共同功能,造成可重用性。
  • 這個和麵向物件的繼承沒關係,有共性。就是繼承的那種意思,你也可以當做是拼接,兩個web.xml拼接在一起。實際上,和麵向物件的繼承區別很大的,面向物件繼承那些有什麼多型。也就是,把常用的東西抽取出來,就成了conf資料夾下的web.xml;然後再和自己寫的專案裡的web.xml拼接起來。

    —————————————-本文來自某位大神的分享————————————