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

JMM*_*JMM 109 java web.xml resource-ref

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

我原本以为它会在您的web/app服务器中使用JNDI定义,然后在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>
Run Code Online (Sandbox Code Playgroud)

can*_*iru 150

您始终可以通过容器中配置的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>
Run Code Online (Sandbox Code Playgroud)

最后,它返回以名称注册的对象jdbc/PrimaryDBInTheContainer.

我们的想法是,在web.xml中指定资源具有将开发人员角色与部署者角色分开的优势.换句话说,作为开发人员,您不必知道在生产中实际调用了所需的资源,并且作为部署应用程序的人员,您将拥有一个很好的名称列表以映射到实际资源.

  • 恕我直言,它超越了分离角色.这个想法是你不能假设服务器上有一个jndi名称,所以你需要一种方法来将你的应用程序中使用的名称映射到部署者选择的"真正的"JNDI名称. (6认同)
  • 这必须是基本的,因为我找不到谷歌,但如果我想查找"java:comp/env/jdbc/primaryDB",那么为什么res-ref-name"jdbc/primaryDB"? (3认同)
  • 据我所知,"jndi-name"元素不是标准web.xml的一部分,而是特定供应商部署描述符的一部分. (3认同)
  • @Torben看看这个答案:http://stackoverflow.com/a/4099163/152061 (2认同)
  • @RaviParekh,他提到了"特定于容器的配置",它可能是jboss-web.xml或weblogic.xml或任何其他供应商特定的部署描述符文件 (2认同)
  • 如果某些容器使用“jndi-name”来映射间接,但这不是标准,那么标准是什么?[Tomcat 似乎要求两个名称匹配](https://tomcat.apache.org/tomcat-9.0-doc/jndi-resources-howto.html#Generic_JavaBean_Resources:~:text=To%20configure%20Tomcat's%20resource%20factory% 2C%20add%20an%20element%20like%20this%20to%20the%20%3CContext%3E%20element%20for%20this,in%20the%20web%20application%20deployment%20descriptor) 这让我们回到了最初的问题:什么是重点是? (2认同)