我需要一些关于如何使用Tomcat 7简化Web应用程序配置的想法。
我有一个Web应用程序,它使用Tomcat的context.xml配置文件中定义的两个资源:一个邮件会话和一个JDBC数据源。
<Resource name="mail/MailService" ...
<Resource name="jdbc/JDBCDatasource" ...
为了在Web应用程序中使用它们,我必须在web.xml部署描述符中声明两个引用,指定相同的名称:
<resource-ref>
<res-ref-name>mail/MailService</res-ref-name>
...
<resource-ref>
<res-ref-name>jdbc/JDBCDatasource</res-ref-name>
....
然后,在应用程序代码中,我必须再次使用其名称查找资源:
Context ctx = new InitialContext();
Session sn = (Session) ctx.lookup("java:comp/env/mail/MailService");
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/JDBCDatasource");
问题是sysadmins可能会改变资源的名称;所以,我无法硬编码资源的名称。我可以使用context-param或类似的东西来允许sysadmins为每个资源指定所选的名称,但考虑到我必须使用resource-ref部分,我不想指定相同的名称web.xml文件中有两次(一个用于param,另一个用于ref)。复制配置有点重复某人犯错的可能性,我想尽量减少错误配置的机会..
我在网上搜索了web.xml中的变量之类的内容,但我没有找到任何内容..有人对此有一些想法吗?
=== RESOLUTION ===
按照Brett指出的方针,我这样做是为了避免重复配置:
首先,使用通用名称将资源配置从Tomcat的context.xml移出到GlobalNamingResources区域内的Tomcat的server.xml:
<GlobalNamingResources>
...
<Resource name="mail/MailService1" ...
<Resource name="jdbc/JDBCDatasource1" ...
...
然后,我在app context.xml文件中创建了两个ResourceLink(注意不是Tomcat文件),其中每个链接都具有应用程序使用的确切名称,并通过global属性指向资源: / p>
<ResourceLink name="jdbc/MyAppJDBCService" global="jdbc/JDBCDatasource1" type="javax.sql.DataSource"/>
<ResourceLink name="mail/MyAppMailService" global="mail/MailService1" type="javax.mail.Session"
/>
这样就不再需要在app的web.xml中引用资源。
最后,在app源代码中,我更改了查找部分以使用context.xml中指定的名称(而不是server.xml中使用的名称):
Context ctx = new InitialContext();
Session sn = (Session) ctx.lookup("java:comp/env/mail/MyAppMailService");
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyAppJDBCService");
使用此设置,管理员负责使用他/她想要的名称配置Tomcat的server.xml文件中的资源,并且部署者只需将这些名称映射到应用程序只是修改应用程序的context.xml。
现在很简单,但之前我做得很糟糕。
答案 0 :(得分:1)
问题是sysadmins可能会改变资源的名称;所以,我不能硬编码资源的名称
这是错误的或使用了错误的术语。在Java EE体系结构中,应用程序拥有资源 reference 名称,系统管理员必须确保满足资源引用。如果应用程序需要名为mail/MailService
的资源引用,则应通过<res-ref-name>
或@Resource
声明引用名称。然后,管理员必须通过将其链接到资源来确保满足具有该名称的资源引用。在Tomcat中,您可以使用资源引用名称直接declare the resource,也可以使用任何名称声明全局资源,然后link the resource reference到全局资源(在其他应用程序服务器中,此“链接”是通常被称为“绑定”)。