2016-09-19 85 views
1

我需要了解如何簡化和Tomcat 7簡化web.xml配置Tomcat中7

我有一個使用Tomcat的context.xml中的配置文件定義的兩個資源一個web應用程序的web應用程序配置一些想法:一郵件會話和JDBC數據源。

<Resource name="mail/MailService" ... 
<Resource name="jdbc/JDBCDatasource" ... 

爲了在Web應用程序我在web.xml部署描述符來聲明兩個引用,指定相同的名稱使用它們:

<resource-ref> 
    <res-ref-name>mail/MailService</res-ref-name> 
    ... 
<resource-ref> 
    <res-ref-name>jdbc/JDBCDatasource</res-ref-name> 
    .... 

然後,在應用程序代碼中,我有他們的名字來查找資源,再次:

Context ctx = new InitialContext(); 
Session sn = (Session) ctx.lookup("java:comp/env/mail/MailService"); 
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/JDBCDatasource"); 

的事情是,資源的名稱可以由系統管理員進行更改;所以,我無法硬編碼資源的名稱。我可以使用上下文參數或類似的東西來允許系統管理員爲每個資源指定所選的名稱,但考慮到我必須使用resource-ref部分,我不想指定相同的名稱在web.xml文件中兩次(一個用於param,另一個用於ref)。複製配置有點複製出錯的機會,我想盡量減少配置錯誤的機會。

我在網上搜索了web.xml中的變量,但是我沒有找到任何東西..有人對此有一些想法?

===解決方案===

繼線所指出的佈雷特,這就是我所做的,以避免重複配置:

首先,搬出了從Tomcat的上下文中的資源配置。 XML到Tomcat的server.xml中,GlobalNamingResources區域內,使用通用名稱:

<GlobalNamingResources> 
    ... 
    <Resource name="mail/MailService1" ... 
    <Resource name="jdbc/JDBCDatasource1" ... 
    ... 

然後,我在應用context.xml文件創建了兩個ResourceLink(注意不是Tomcat的一個) ,其中每個環節都有由應用程序使用的確切名稱,並點,通過全球屬性,以資源:

<ResourceLink name="jdbc/MyAppJDBCService" global="jdbc/JDBCDatasource1" type="javax.sql.DataSource"/> 
<ResourceLink name="mail/MyAppMailService" global="mail/MailService1" type="javax.mail.Session" 
    /> 

就這樣,在應用程序的web.xml中的資源引用沒有必要了。

最後,在應用程序的源代碼我改變查找部分使用(在server.xml使用,並且不是那些)在context.xml中指定的名稱:

Context ctx = new InitialContext(); 
Session sn = (Session) ctx.lookup("java:comp/env/mail/MyAppMailService"); 
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyAppJDBCService"); 

採用這種設置,管理員可以使用他/她想要的名稱來配置Tomcat的server.xml文件中的資源,並且部署者只需將該名稱映射到應用程序使用的名稱,只需修改應用程序的context.xml即可。

現在很簡單,但我之前做得很糟糕。

回答

1

問題是,系統管理員可能會更改資源的名稱;所以我不能硬編碼資源的名稱

這是錯誤的或者使用了錯誤的術語。在Java EE體系結構中,應用程序擁有資源參考名稱,並且系統管理員必須確保滿足資源引用。如果應用程序需要名爲mail/MailService的資源引用,則應通過<res-ref-name>@Resource聲明引用名稱。然後,管理員必須通過將資源引用鏈接到資源來確保具有該名稱的資源引用。在Tomcat中,您可以使用資源引用名稱直接declare the resource,也可以使用任何名稱聲明全局資源,然後使用link the resource reference來聲明全局資源(在其他應用程序服務器中,此「鏈接」通常稱爲「綁定」) 。

+1

好吧,我想我明白了。我嘗試了第二種選擇。我做了以下幾件事:首先,我將資源配置放在server.xml的GlobalNamingResources部分中,並帶有一些「通用」名稱文件,並將其從Tomcat的context.xml中移除;然後,在應用程序的context.xml(在META-INF中)中,我創建了兩個ResourceLink,每個資源都指向它們,名稱屬性包含應用程序使用的確切名稱來抓取它們,並使用全局名稱包含在server.xml中聲明的資源名稱。謝謝。 –