2010-05-22 163 views
99

我只是想知道什麼時候/爲什麼要在你的web.xml文件中定義一個resource-ref元素?什麼是web.xml中的資源引用?

我本以爲它會在您的web/app服務器中使用JNDI進行定義,然後在您的Java代碼中查找JNDI引用?

resource-ref的定義對我來說似乎有點多餘,我想不出它何時可能有用。例如:

<resource-ref> 
    <description>Primary database</description> 
    <res-ref-name>jdbc/primaryDB</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>CONTAINER</res-auth> 
</resource-ref> 

回答

137

您可以隨時通過自己的JNDI名稱是指資源在你的應用程序直接在容器的配置,但如果這樣做,實際上你是接線容器特定的名字進入你的代碼。這有一些缺點,例如,如果以後由於某種原因想要更改名稱,則需要更新所有應用程序中的所有引用,然後重新生成並重新部署它們。

<resource-ref>引入了一個間接的另一層:您指定要在web.xml中使用的名稱,並根據容器上,提供了在集裝箱專用配置文件綁定。

所以這裏是發生了什麼:假設你想查找java:comp/env/jdbc/primaryDB的名字。容器發現web.xml中jdbc/primaryDB一個<resource-ref>元素,所以它會尋找到特定容器的配置,包含類似於下面的內容:

<resource-ref> 
    <res-ref-name>jdbc/primaryDB</res-ref-name> 
    <jndi-name>jdbc/PrimaryDBInTheContainer</jndi-name> 
</resource-ref> 

最後,它返回的對象以jdbc/PrimaryDBInTheContainer的名義註冊。

的想法是,在web.xml中指定資源具有分離從部署作用開發商作用的優勢。換句話說,作爲開發人員,您不必知道生產中實際需要的資源是什麼,而作爲部署該應用程序的人員,您將擁有一個名稱映射到實際資源的好列表。

+6

恕我直言,它超越了分離角色。這個想法是,你不能假定在服務器上有一個jndi名字,所以你需要一種方法來將你的應用程序中使用的名稱映射到部署者選擇的「真實」JNDI名稱上。 – 2010-05-22 16:21:43

+2

這是必須的,因爲我找不到它,但是如果我想查找「java:comp/env/jdbc/primaryDB」,那麼爲什麼res-ref-name是「jdbc/primaryDB」? – Torben 2012-08-23 07:29:40

+2

@Torben看看這個答案:http://stackoverflow.com/a/4099163/152061 – 2013-04-24 18:30:12