2010-05-22 105 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