1. 程式人生 > >Tomcat中Context元素詳解

Tomcat中Context元素詳解

1、通用屬性

所有Context的實現支援如下屬性:

 
1)、backgroundProcessorDelay : 這個值代表在context及其子容器(包括所有的wrappers)上呼叫backgroundProcess方法的延時,以秒為單位。如果延時值為負,子容器不會被呼叫,也就是說子容器使用自己的處理執行緒。如果該值為正,會建立一個新的執行緒。在等待指定的時間以後,該執行緒在主機及其 子容器上呼叫backgroundProcess方法。context利用後臺處理session期間,監測類的變化用於重新載入。如果沒有指定,該屬性的預設值是-1,說明context所依賴其所屬的Host的後臺處理。
 
2)、className : 實現的Java類名。該類必須實現org.apache.catalina.Context介面。如果沒有指定,使用標準實現(在下面定義)。

3)、cookies :  如果想利用cookies來傳遞session identifier(需要客戶端支援cookies),設為ture。否則為false,這種情況下只能依靠URL Rewriting傳遞session identifier。
 
4)、crossContext : 如果想在應用內呼叫ServletContext.getContext()來返回在該虛擬主機上執行的其他web application的request dispatcher,此值設為true。在安全性很重要的環境中,設為false,使得getContext()總是返回null。預設值為false。

5)、docBase : 該web應用的文件基準目錄(Document Base,也稱為Context Root),或者是WAR檔案的路徑。可以使用絕對路徑,也可以使用相對於context所屬的Host的appBase路徑。
 
6)、override :如果想利用該Context元素中的設定覆蓋DefaultContext中相應的設定,設為true。預設情況下使用DefaultContext中的設定。

7)、privileged :設為true,允許context使用container servlets,比如manager servlet。
 
8)、path :web應用的context路徑。catalina將每個URL的起始和context path進行比較,選擇合適的web應用處理該請求。特定Host下的context path必須是惟一的。如果context path為空字串(""),這個context是所屬Host的預設web應用,用來處理不能匹配任何context path的請求。
 
9)、reloadable :如果希望Catalina監視/WEB-INF/classes/和/WEB-INF/lib下面的類是否發生變化,在發生變化的時候自動過載web application,設為true。這個特徵在開發階段很有用,但也大大增加了伺服器的開銷。因此,在釋出以後,不推薦使用。但是,你可以使用Manager應用在必要的時候觸發應用的過載。 

10)、wrapperClass :org.apache.catalina.Wrapper實現類的名稱,用於該Context管理的servlets。如果沒有指定,使用標準的預設值。

2、標準實現 

Context的標準實現是org.apache.catalina.core.StandardContext.它還支援如下的附加屬性:

1)、debug : 與此Engine關聯的Logger記錄的除錯資訊的詳細程度。數字越大,輸出越詳細。如果沒有指定,預設為0。
 

2)、swallowOutput :  如果該值為true,System.out和System.err的輸出被重定向到web應用的logger。如果沒有指定,預設值為false。

3)、useNaming : 如果希望Catalina為該web應用使能一個JNDI InitialContext物件,設為true。該InitialialContext符合J2EE平臺的約定,預設值為true。

4)、workDir : Context提供的臨時目錄的路徑,用於servlet的臨時讀/寫。利用javax.servlet.context.tempdir屬性,servlet可以訪問該目錄。如果沒有指定,使用
$CATALINA_HOME/work下一個合適的目錄。
 

3、巢狀元件 

下列元素可以巢狀在Context元素中,但每個元素至多隻能巢狀一次。

1)、Loader :配置該web應用用來載入servlet和javabean的類載入器。正常情況下,使用預設的類載入器就足夠。

2)、Logger :配置用來接收和處理所有日誌訊息的logger,包括呼叫ServletContext.log()函式記錄的所有訊息。

3)、Manager -配置用於建立,銷燬,維持HTTP session的session manager.正常情況下,使用預設的session manager配置就足夠。

4)、Realm :配置Realm,該Realm的使用者資料庫以及相關的角色僅用於這個特定的web應用中。如果沒有指定,該web應用使用所屬的Host或Engine的Realm。 

5)、Resources :配置用於訪問與這個web應用相關聯的靜態資源。正常情況下,使用預設的resource manager就足夠。

4、專有特徵 

1)、訪問日誌 
正常情況下,執行web伺服器會生成訪問日誌。訪問日誌以標準格式為每個請求輸出一行資訊。Catalina包含一個可選的Valve實現,可以用標準格式生成日誌,還可以使用任意定製的格式。
通過在Engine,Host或者Context中巢狀一個Valve元素,Catalina會為該容器處理的所有請求建立訪問日誌,如下所示:
<Context path="/examples" ...> 
... 
<Valve className="org.apache.catalina.valves.AccessLogValve" 
prefix="localhost_access_log" suffix=".txt" 
pattern="common"/> 
... 

</Context>

2)、Context的自動配置 

如果使用標準的Context實現,當Catalina啟動,或者過載web應用的時候,如下的配置步驟會自動發生,不需要特殊的配置來使用這些特徵。

如果沒有定義自己的Loader元素,將會配置一個標準的web應用class loader; 
如果沒有定義自己的Manager元素,會配置一個標準的session manager; 

如果沒有定義自己的Resources元素,使用標準的resource manager。

在conf/web.xml中列出的web應用的屬性會當做該web應用的預設的屬性。這被用於建立預設的對映(比如將.jsp對映成對應的JSP servlet),以及其他的標準屬性。

3)、在/WEB-INF/web.xml資源中的屬性被處理(如果資源存在)
如果web應用指定了安全限制,並且可能需要對使用者進行認證,Catalina會配置選定的Authenticator,該Authenticator實現了login方法。

Context引數 

可以在Context中元素中巢狀<Parameter>元素,配置帶有名稱的值,這些值作為servletcontext初始化引數,對整個web應用可見。比如,你可以像這樣建立初始化引數
<Context ...>
... 
<Parameter name="companyName" value="My Company, Incorporated" 
override="false"/> 
... 
</Context> 
與在/WEB-INF/web.xml中包含如下元素相等:
<context-param> 
<param-name>companyName</param-name> 
<param-value>My Company, Incorporated</param-value> 
</context-param>

區別是,前者不需要修改deployment descriptor來定製這個值。

<Parameter>元素的有效屬性值如下:
description : 關於該context初始化引數的文字描述(可選)要建立的context初始化引數的名稱。
override :如果不希望/WEB-INF/web.xml中具有相同引數名稱的<context-param>覆蓋這裡指定的值,設為false。預設值為true。

value :呼叫ServletContext.getInitParameter()時,返回給應用的引數值。

環境條目 
可以在Context中巢狀<Environment>元素,這些值作為環境條目資源(Environment Entry Resource),對整個web應用可見。比如,可以按照如下方法建立一個環境條目:
<Context ...> 
... 
<Environment name="maxExemptions" value="10" 
type="java.lang.Integer" override="false"/> 
... 
</Context>
與在/WEB-INF/web.xml中包含如下元素是等價的:
<env-entry> 
<env-entry-name>maxExemptions</env-entry-name> 
<env-entry-value>10</env-entry-value> 
<env-entry-type>java.lang.Integer</env-entry-type> 
</env-entry>
區別是,前者不需要修改deployment descriptor來定製這個值。

<Environment>元素的有效屬性所如下:

description :環境條目的文字描述(可選)
name :環境條目的名稱,相對於java:comp/env context。
override :如果不希望/WEB-INF/web.xml中具有相同名稱的<env-entry>覆蓋這裡指定的值,設為false。預設值為true。
type :環境條目的Java類名的全稱.在/WEB-INF/web.xml中,<env-entry-type>必須是如下的值:java.lang.Boolean, java.lang.Byte, java.lang.Character, java.lang.Double,
java.lang.Float, java.lang.Integer, java.lang.Long, java.lang.Short,  java.lang.String。
value :通過JNDI context請求時,返回給應用的引數值。這個值必須轉換成type屬性定義的Java型別。

4)、生命期Listeners

如果一個Java物件需要知道Context什麼時候啟動,什麼時候停止,可以在這個物件中巢狀一個Listener元素。該Listener元素必須實現org.apache.catalina.LifecycleListener介面,在發生對應的生命期事件的時候,通知該Listener。

按照如下的格式配置Listener:

<Context path="/examples" ...> 
... 
<Listener className="com.mycompany.mypackage.MyListener" ... > 
... 
</Context>

注意,一個listener可以具有任意多的附加屬性。屬性名與JavaBean的屬性名相對應,使用標準的屬性命名方法。

5)、請求過濾器(Request Filters) 
對每個傳送到Engine,Host或者Context的請求,可以要求Catalina檢查IP地址或主機名稱。Catalina使用一系列配置好的“接受”或者“拒絕”過濾器對客戶端的地址或者主機名

進行檢查,過濾器是按照正則表示式語法定義的,不被接受的請求會返回一個HTTP“Forbidden”錯誤。

下面是過濾器的定義:

<Context path="/examples" ...> 
... 
<Valve className="org.apache.catalina.valves.RemoteHostValve" 
allow="*.mycompany.com,www.yourcompany.com"/> 
<Valve className="org.apache.catalina.valves.RemoteAddrValve" 
deny="192.168.1.*"/> 
... 
</Context>

6)、資源定義(Resource Definitions) 
在/WEB-INF/web.xml中定義資源的特性。使用JNDI查詢<resource-ref>和<resource-env-ref>元素時,這些特性被返回。對同一資源名稱,還必須定義資源引數(見下面“資
源引數”小節),這些引數用來配置物件工廠(object factory)以及物件工廠的屬性。
可以按照如下方式建立資源定義:
<Context ...> 
... 
<Resource name="jdbc/EmployeeDB" auth="Container" 
type="javax.sql.DataSource" 
description="Employees Database for HR Applications"/> 
... 
</Context>
等價於在/WEB-INF/web.xml中包含如下元素:
<resource-ref> 
<description>Employees Database for HR Applications</description> 
<res-ref-name>jdbc/EmployeeDB</res-ref-name> 
<res-ref-type>javax.sql.DataSource</res-ref-type> 
<res-auth>Container</res-auth> 
</resource-ref>

區別是,前者不需要修改deployment descriptor來定製這個值。

<Resource>元素的有效屬性如下:
auth :指定時web應用程式碼本身sign on到對應的resource mananger,還是由container代表web應用sign on到resource manager。該屬性的值必須是Application或Container。如果在web application deployment descriptor中使用<resource-ref>,這個屬性是必需的,如果使用<resource-env-ref>,這個屬性是可選的。
description :資源的文字描述(可選)。
name :資源的名稱,相對於java:comp/env context。
scope :指定通過這個resource manager得到的連線是否共享。該屬性的值必須是Shareable或者Unshareable。預設情況下,假定連線是共享的。 

type :當web應用在該資源連線上進行查詢時,返回的Java類名的全稱。

7)、資源引數 
資源引數用來配置資源管理器(resource manager)或物件工廠(object factory)。在做JNDI查詢時,資源管理器返回查詢的物件。在資源可以被訪問之前,對<Context>或
<DefaultContext>元素的每個<Resource>元素,或者/WEB-INF/web.xml中定義的每個<resource-ref>或<resource-env-ref>元素,都必須定義資源引數。
資源引數是用名稱定義的,使用的資源管理器(或者object factory)不同,引數名稱的集合也不一樣。這些引數名和工廠類的JavaBeans屬性相對應。JNDI實現通過呼叫對應的JavaBeans屬性設定函式來配置特定的工廠類,然後通過lookup()呼叫使得該例項可見。
JDBC資料來源的資源引數可以按照如下方式定義:
<Context ...> 
... 
<ResourceParams name="jdbc/EmployeeDB"> 
<parameter> 
<name>driverClassName</name> 
<value>org.hsql.jdbcDriver</value> 
</parameter> 
<parameter> 
<name>url</name> 
<value>jdbc:HypersonicSQL:database</value> 
</parameter> 
<parameter> 
<name>user</name> 
<value>dbusername</value> 
</parameter> 
<parameter> 
<name>password</name> 
<value>dbpassword</value> 
</parameter> 
</ResourceParams> 
... 
</Context>

如果你需要為某個特定的資源型別指定工廠內的Java類名,在<ResourceParams>元素中巢狀一個叫做factory的<parameter>條目。

<Resourceparams>元素的有效屬性如下:
name :配置的資源名稱,相對於java:comp/env context。這個名稱必須與$CATALINA_HOME/conf/server.xml中某個<Resource>元素定義的資源名稱匹配,或者在/WEB-INF/web.xml中通過<resource-ref>或者<resource-env-ref>元素應用。


8)、資源連線(Resource Links) 
資源連線用於建立到全域性JNDI資源的連線。在連線名稱上進行JNDI查詢會返回被連線的global 資源。 
可以按照如下方法建立一個資源連線:
<Context ...> 
... 
<ResourceLink name="linkToGlobalResource" 
global="simpleValue" 
type="java.lang.Integer" 
... 
</Context>

<ResourceLink>元素的有效屬性如下:
global :被連線的全域性資源的名稱。
name :建立的資源連線的名稱,相對於java:comp/env context。
type :當web應用在該資源連線上進行查詢時,返回的Java類名的全稱。