? 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類名的全稱
|
轉載于:https://www.cnblogs.com/w-wfy/p/6241618.html