web.xml中的resource-ref用于什么?

124

我想知道何时/为什么要在web.xml文件中定义<resource-ref>元素?

我原本认为它应该在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>
1个回答

163

您可以通过在应用程序中直接使用容器中配置的JNDI名称来引用资源,但是这样做实际上将容器特定的名称与您的代码进行了绑定。这样做有一些缺点,例如,如果您以后想出于某种原因更改名称,则需要更新所有应用程序中的所有引用,然后重新构建和部署它们。

<resource-ref>引入了另一层间接性:您在web.xml中指定要使用的名称,并根据容器提供容器特定的配置文件中的绑定。

因此,发生的情况如下: 假设您想查找名称为java:comp/env/jdbc/primaryDB的资源。容器会发现web.xml中有一个<resource-ref>元素,它对应jdbc/primaryDB,所以容器将查找包含以下内容的容器特定配置:

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

最后,它返回以jdbc/PrimaryDBInTheContainer命名的对象。

思路是在web.xml中指定资源有将开发人员角色与部署人员角色分离的优点。换句话说,作为开发者,您不必知道生产环境中所需资源的实际名称,而作为应用程序的部署者,您将拥有一份漂亮的名称列表来映射到实际资源。


7
依我看,这超出了角色分离的范畴。想法是你不能假设服务器上存在JNDI名称,因此需要一种方法来映射应用程序中使用的名称到部署者选择的“真实”JNDI名称。 - Pascal Thivent
5
这应该很基础,因为我在谷歌上找不到它,但如果我想查找 "java:comp/env/jdbc/primaryDB",那么为什么 res-ref-name 是 "jdbc/primaryDB"? - Torben
7
据我所知,“jndi-name”元素不是标准web.xml的一部分,而是特定供应商部署描述符的一部分。 - Ramon Chiara
2
@RaviParekh提到了“容器特定配置”,可能是jboss-web.xml或weblogic.xml或任何其他供应商特定的部署描述符文件。 - abhihello123
2
如果一些容器使用jndi-name来映射间接引用,但这不是标准的,那么什么是标准的呢?Tomcat似乎需要两个名称匹配,这让我们回到最初的问题:这有什么意义呢? - fabmlk
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接