context元素大概解說

 

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

相關文章
相關標籤/搜索