2016-09-19 71 views
1

我需要了解如何简化和Tomcat 7简化web.xml配置Tomcat中7

我有一个使用Tomcat的context.xml中的配置文件定义的两个资源一个web应用程序的web应用程序配置一些想法:一邮件会话和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"); 

的事情是,资源的名称可以由系统管理员进行更改;所以,我无法硬编码资源的名称。我可以使用上下文参数或类似的东西来允许系统管理员为每个资源指定所选的名称,但考虑到我必须使用resource-ref部分,我不想指定相同的名称在web.xml文件中两次(一个用于param,另一个用于ref)。复制配置有点复制出错的机会,我想尽量减少配置错误的机会。

我在网上搜索了web.xml中的变量,但是我没有找到任何东西..有人对此有一些想法?

===解决方案===

继线所指出的布雷特,这就是我所做的,以避免重复配置:

首先,搬出了从Tomcat的上下文中的资源配置。 XML到Tomcat的server.xml中,GlobalNamingResources区域内,使用通用名称:

<GlobalNamingResources> 
    ... 
    <Resource name="mail/MailService1" ... 
    <Resource name="jdbc/JDBCDatasource1" ... 
    ... 

然后,我在应用context.xml文件创建了两个ResourceLink(注意不是Tomcat的一个) ,其中每个环节都有由应用程序使用的确切名称,并点,通过全球属性,以资源:

<ResourceLink name="jdbc/MyAppJDBCService" global="jdbc/JDBCDatasource1" type="javax.sql.DataSource"/> 
<ResourceLink name="mail/MyAppMailService" global="mail/MailService1" type="javax.mail.Session" 
    /> 

就这样,在应用程序的web.xml中的资源引用没有必要了。

最后,在应用程序的源代码我改变查找部分使用(在server.xml使用,并且不是那些)在context.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即可。

现在很简单,但我之前做得很糟糕。

回答

1

问题是,系统管理员可能会更改资源的名称;所以我不能硬编码资源的名称

这是错误的或者使用了错误的术语。在Java EE体系结构中,应用程序拥有资源参考名称,并且系统管理员必须确保满足资源引用。如果应用程序需要名为mail/MailService的资源引用,则应通过<res-ref-name>@Resource声明引用名称。然后,管理员必须通过将资源引用链接到资源来确保具有该名称的资源引用。在Tomcat中,您可以使用资源引用名称直接declare the resource,也可以使用任何名称声明全局资源,然后使用link the resource reference来声明全局资源(在其他应用程序服务器中,此“链接”通常称为“绑定”) 。

+1

好吧,我想我明白了。我尝试了第二种选择。我做了以下几件事:首先,我将资源配置放在server.xml的GlobalNamingResources部分中,并带有一些“通用”名称文件,并将其从Tomcat的context.xml中移除;然后,在应用程序的context.xml(在META-INF中)中,我创建了两个ResourceLink,每个资源都指向它们,名称属性包含应用程序使用的确切名称来抓取它们,并使用全局名称包含在server.xml中声明的资源名称。谢谢。 –