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


112

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

我以为可以在JNDI的Web /应用服务器中定义它,然后在Java代码中查找JNDI引用?

资源引用定义对我来说似乎有点多余,我想不出什么时候有用。例:

<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>

Answers:


156

您始终可以通过容器中配置的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中指定资源具有将开发者角色与部署者角色分开的优势。换句话说,作为开发人员,您不必知道在生产中实际需要什么资源,而在部署应用程序的人员中,您将有一个不错的名称列表以映射到实际资源。


6
恕我直言,这不仅仅是分离角色。这个想法是,您不能假定服务器上可以使用jndi名称,因此需要一种方法将应用程序中使用的名称映射到部署者选择的“真实” JNDI名称上。
Pascal Thivent

3
这必须是基本的,因为我无法在Google上找到它,但是如果我要查找“ java:comp / env / jdbc / primaryDB”,那么为什么res-ref-name是“ jdbc / primaryDB”?
Torben

4
据我所知,“ jndi-name”元素不是标准web.xml的一部分,而是特定供应商部署描述符的一部分。
拉蒙·基亚拉

2
@RaviParekh,他提到了“特定于容器的配置”,它可能是jboss-web.xml或weblogic.xml或任何其他特定于供应商的部署描述符文件
abhihello123

1
我们可以把它和tomcat联系起来吗?我的意思是在tomcat的context.xml中定义的数据源和在web.xml中的resource-ref
Atul,2017年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.