Context元素表明一個web應用,運行在某個特定的虛擬主機上。如Servlet Specification 2.2或之後版本中描述的那樣,每一個web應用基於一個Web Application Archive(WAR)文件,或者是一個目錄,包含WAR文件解壓後的內容。有關Web Application Archive的更多信息,能夠參考Servlet Specification和Tomcat 應用程序開發者指南。 經過將請求URI的最長可能前綴與每一個Context的context路徑進行匹配,Catalina選擇相應的web 應用處理HTTP請求。一旦選定,根據web application deployment descriptor 文件中定義的servlet映射,Context會選擇一個正確的servlet來處理進來的請求。servlet映射必須定義在該web應用目錄層次結構中的/WEB-INF/web.xml中。
你能夠在一個Host元素中嵌套任意多的Context元素。每一個Context的路徑必須是唯一的,由path屬性定義。另外,你必須定義一個context路徑長度爲0的Context,這個Context稱爲該虛擬主機的缺省web應用,用來處理那些不能匹配任何Context的Context路徑的請求。
除了在Host元素中嵌套Context元素之外,你也能夠將它們存儲在單個文件中(以.xml爲後綴),放在$CATALINA_HOME/conf/[enginename]/[hostname]/目錄下面。有關這方面的更多信息,參考應用的自動發佈。這種方法容許動態從新配置web應用,由於若是修改了conf/server.xml,就必須從新啓動 Tomcat。
除了明確指定Context元素之外,還有其餘幾種技術能夠自動生成Context元素。參考Automatic Application Deployment 和 User Web Applications
如下的描述使用變量$CATALINA_HOME來指Tomcat 5安裝的目錄。大多數的相對路徑都是以該目錄爲基準。可是,經過設置CATALINA_BASE目錄,能夠運行多個Tomcat 5實例,這時你應該使用$CATALINA_BASE來做爲目錄基準,而不是使用$CATALINA_HOME。
屬性 通用屬性 全部Context的實現支持以下屬性: backgroundProcessorDelay 這個值表明在context及其子容器(包括全部的wrappers【把應用封裝成適合該環境運行的程序】)上調用backgroundProcess方法的延時,以秒爲單位。若是延時值非負,子容器不會被調用,也就是說子容器使用本身的處理線程。若是該值爲正,會建立一個新的線程。在等待指定的時間之後,該線程在主機及其子容器上調用backgroundProcess方法。context利用後臺處理session過時,監測類的變化用於從新載入。若是沒有指定,該屬性的缺省值是-1,說明context依賴其所屬的Host的後臺處理。 className 實現的Java類名。該類必須實現org.apache.catalina.Context接口。若是沒有指定,使用標準實現(在下面定義)。 cookies 若是想利用cookies來傳遞session identifier(須要客戶端支持cookies),設爲ture。不然爲false,這種狀況下只能依靠URL Rewriting傳遞session identifier。
crossContext 若是想在應用內調用ServletContext.getContext()來返回在該虛擬主機上運行的其餘web application的request dispatcher,設爲true。在安全性很重要的環境中,設爲false,使得getContext()老是返回null。缺省值爲false。
docBase 該web應用的文檔基準目錄(Document Base,也稱爲Context Root【默認的根目錄】),或者是WAR文件的路徑。可使用絕對路徑,也可使用相對於context所屬的Host的appBase路徑。
override 若是想利用該Context元素中的設置覆蓋DefaultContext中相應的設置,設爲true。缺省狀況下使用DefaultContext中的設置。
privileged 設爲true,容許context使用container servlets,好比manager servlet。
path web應用的context路徑。catalina將每一個URL的起始和context path進行比較,選擇合適的web應用處理該請求。特定Host下的context path必須是唯一的。若是context path爲空字符串(""),這個context是所屬Host的缺省web應用,用來處理不能匹配任何context path的請求。
reloadable 若是但願Catalina監視/WEB-INF/classes/和/WEB-INF/lib下面的類是否發生變化,在發生變化的時候自動重載web application,設爲true。這個特徵在開發階段頗有用,但也大大增長了服務器的開銷。所以,在發佈之後,不推薦使用。可是,你可使用 Manager應用在必要的時候觸發應用的重載。 wrapperClass org.apache.catalina.Wrapper實現類的名稱,用於該Context管理的servlets。若是沒有指定,使用標準的缺省值。
標準實現 Context的標準實現是org.apache.catalina.core.StandardContext.它還支持以下的附加屬性:
屬性 描述 debug 與這個Engine關聯的Logger記錄的調試信息的詳細程度。數字越大,輸出越詳細。若是沒有指定,缺省爲0。
swallowOutput 若是該值爲true,System.out和System.err的輸出被重定向到web應用的logger。若是沒有指定,缺省值爲false
useNaming 若是但願Catalina爲該web應用使能一個JNDI InitialContext對象,設爲true。該InitialialContext符合J2EE平臺的約定,缺省值爲true。
workDir Context提供的臨時目錄的路徑,用於servlet的臨時讀/寫。利用javax.servlet.context.tempdir屬性,servlet能夠訪問該目錄。若是沒有指定,使用$CATALINA_HOME/work下一個合適的目錄。
嵌套組件 下列元素能夠嵌套在Context元素中,但每一個元素至多隻能嵌套一次。
Loader-配置該web應用用來加載servlet和javabean的類加載器。正常狀況下,使用缺省的類加載器就足夠了; Logger - 配置用來接收和處理全部日誌消息的logger,包括調用ServletContext.log()函數記錄的全部消息; Manager -配置用於建立,銷燬,維持HTTP session的session manager.正常狀況下,使用缺省的session manager配置就足夠了; Realm - 配置Realm,該Realm的用戶數據庫以及相關的角色僅用於這個特定的web應用中。若是沒有指定,該web應用使用所屬的Host或Engine的Realm。 Resources - 配置用於訪問與這個web應用相關聯的靜態資源。正常狀況下,使用缺省的resource manager就足夠了。
專有特徵 訪問日誌 正常狀況下,運行web服務器會生成訪問日誌。訪問日誌以標準格式爲每一個請求輸出一行信息。Catalina包含一個可選的Valve實現,能夠用標準格式生成日誌,還可使用任意定製的格式。
經過在Engine,Host或者Context中嵌套一個Valve元素,Catalina會爲該容器處理的全部請求建立訪問日誌,以下所示:
... prefix="localhost_access_log." suffix=".txt" pattern="common"/> ...
參考Access Log Valve,以得到更多配置屬性的信息;
Context的自動配置 若是使用標準的Context實現,當Catalina啓動,或者重載web應用的時候,以下的配置步驟會自動發生,不須要特殊的配置來使能這個特徵。
若是沒有定義本身的Loader元素,將會配置一個標準的web應用class loader; 若是沒有定義本身的Manager元素,會配置一個標準的session manager; 若是沒有定義本身的Resources元素,使用標準的resource manager。 在conf/web.xml中列出的web應用的屬性會當作該web應用的缺省的屬性。這被用於創建缺省的映射(好比將.jsp映射成對應的JSP servlet),以及其餘的標準屬性。 列舉在/WEB-INF/web.xml資源中的屬性被處理(若是資源存在); 若是web應用指定了安全限制,而且可能須要對用戶進行認證,Catalina會配置選定的Authenticator,該Authenticator實現了login方法。
Context參數 能夠在Context中元素中嵌套元素,配置帶有名稱的值,這些值做爲servletcontext初始化參數,對整個web應用可見。好比,你能夠像這樣建立初始化參數:
... override="false"/> ...
這與在/WEB-INF/web.xml中包含以下元素相等:
companyName My Company, Incorporated
區別是,前者不須要修改deployment descriptor來定製這個值。
元素的有效屬性值以下:
屬性 描述 description 關於該context初始化參數的文字描述(可選)
name
要建立的context初始化參數的名稱
override 若是不但願/WEB-INF/web.xml中具備相同參數名稱的覆蓋這裏指定的值,設爲false。缺省值爲true。
value 調用ServletContext.getInitParameter()時,返回給應用的參數值。
環境條目 能夠在Context中嵌套元素,配置命名的值,這些值做爲環境條目資源(Environment Entry Resource),對整個web應用可見。好比,能夠按照以下方法建立一個環境條目:
... type="java.lang.Integer" override="false"/> ...
這與在/WEB-INF/web.xml中包含以下元素是等價的:
maxExemptions 10 java.lang.Integer
區別是,前者不須要修改deployment descriptor來定製這個值。
元素的有效屬性所以下:
屬性 描述 description 環境條目的文字描述(可選)
name 環境條目的名稱,相對於java:comp/env context。
override 若是不但願/WEB-INF/web.xml中具備相同名稱的覆蓋這裏指定的值,設爲false。缺省值爲true。
type 環境條目的Java類名的全稱.在/WEB-INF/web.xml中,必須是以下的值:java.lang.Boolean, java.lang.Byte, java.lang.Character, java.lang.Double, java.lang.Float, java.lang.Integer, java.lang.Long, java.lang.Short, or java.lang.String.
value 經過JNDI context請求時,返回給應用的參數值。這個值必須轉換成type屬性定義的Java類型
生命期Listeners 若是一個Java對象須要知道Context何時啓動,何時中止,能夠在這個對象中嵌套一個Listener元素。該Listener元素必須實現了org.apache.catalina.LifecycleListener接口,在發生對應的生命期事件的時候,通知該Listener。能夠按照以下的格式配置這樣的Listener:
...
...
注意,一個listener能夠具備任意多的附加屬性。屬性名與JavaBean的屬性名相對應,使用標準的屬性命名方法。
請求過濾器(Request Filters) 對每一個發送到Engine,Host或者Context的請求,能夠要求Catalina檢查IP地址或主機名稱。Catalina使用一系列配置好的「接受」或者「拒絕」過濾器對客戶端的地址或者主機名進行檢查,過濾器是按照正則表達式語法定義的,由Jakarta Regexp正則表達式庫支持。不被接受的請求會返回一個HTTP「Forbidden」錯誤。下面是過濾器的定義。
... allow="*.mycompany.com," target="_blank">" target="_blank">www.yourcompany.com"/> deny="192.168.1.*"/> ...
資源定義(Resource Definitions) 能夠在/WEB-INF/web.xml中定義資源的特性。使用JNDI查找和元素時,這些特性被返回。對同一資源名稱,還必須定義資源參數(見下面「資源參數」小節),這些參數用來配置對象工廠(object factory)以及對象工廠的屬性。
好比,你能夠按照以下方式建立資源定義:
... type="javax.sql.DataSource" description="Employees Database for HR Applications"/> ...
這等價於在/WEB-INF/web.xml中包含以下元素:
Employees Database for HR Applications jdbc/EmployeeDB javax.sql.DataSource Container
區別是,前者不須要修改deployment descriptor來定製這個值。
元素的有效屬性以下:
屬性 描述 auth 指定時web應用代碼自己sign on到對應的resource mananger,仍是由container表明web應用sign on到resource manager。該屬性的值必須是Application或者Container。若是在web application deployment descriptor中使用,這個屬性是必需的,若是使用,這個屬性是可選的。
description 資源的文字描述(可選)
name 資源的名稱,相對於java:comp/env context
scope 指定經過這個resource manager獲得的鏈接是否共享。該屬性的值必須是Shareable或者Unshareable。缺省狀況下,假定鏈接是共享的。 type 當web應用查找該資源的時候,返回的Java類名的全稱。
資源參數 資源參數用來配置資源管理器(resource manager,或對象工廠,object factory)。在作JNDI查找時,資源管理器返回查找的對象。在資源能夠被訪問以前,對或元素的每一個元素,或者/WEB-INF/web.xml中定義的每一個或元素,都必須定義資源參數。
資源參數是用名稱定義的,使用的資源管理器(或者object factory)不一樣,參數名稱的集合也不同。這些參數名和工廠類的JavaBeans屬性相對應。JNDI實現經過調用對應的JavaBeans屬性設置函數來配置特定的工廠類,而後經過lookup()調用使得該實例可見。
一個JDBC數據源的資源參數能夠按照以下方式定義:
...
driverClassName org.hsql.jdbcDriver
url jdbc:HypersonicSQL:database
user dbusername
password dbpassword
...
若是你須要爲某個特定的資源類型指定工廠內的Java類名,在元素中嵌套一個叫作factory的條目。
元素的有效屬性以下:
屬性 描述 name 配置的資源名稱,相對於java:comp/env context。這個名稱必須與$CATALINA_HOME/conf/server.xml中某個元素定義的資源名稱匹配,或者在/WEB-INF/web.xml中經過或者元素應用。
資源鏈接(Resource Links) 資源鏈接用於建立到全局JNDI資源的鏈接。在鏈接名稱上進行JNDI查詢會返回被鏈接的global 資源。 好比,你能夠按照以下方法建立一個資源鏈接:
... global="simpleValue" type="java.lang.Integer" ...
元素的有效屬性以下:
屬性 描述 global 被鏈接的鏈接全局資源的名稱
name 建立的資源鏈接的名稱,相對於java:comp/env context
type 當web應用在該資源鏈接上進行查找時,返回的Java類名的全稱
java |