在 Tomcat 7 中简化 web.xml 配置
Simplifying web.xml configuration in Tomcat 7
我需要一些关于如何使用 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");
问题是系统管理员可能会更改资源的名称;所以,我不能硬编码资源的名称。我可以使用上下文参数或类似的东西来允许系统管理员为每个资源指定所选名称,但考虑到我必须使用资源引用部分,我不想指定相同的名称在 web.xml 文件中两次(一次用于参数,另一次用于参考)。复制配置就是复制某人犯错的机会,我想尽量减少错误配置的机会..
我在网上搜索 web.xml 中的变量之类的东西,但我没有找到任何东西。有人对此有什么想法吗?
=== 分辨率 ===
按照 Brett 指出的行,这是我为避免重复配置所做的:
首先,将资源配置从 Tomcat 的 context.xml 移出到 Tomcat 的 server.xml,在 GlobalNamingResources 区域中,使用通用名称:
<GlobalNamingResources>
...
<Resource name="mail/MailService1" ...
<Resource name="jdbc/JDBCDatasource1" ...
...
然后,我在app context.xml文件中创建了两个ResourceLink(注意不是Tomcat一个),其中每个链接都有app使用的确切名称,并指向,通过全局属性,给资源:
<ResourceLink name="jdbc/MyAppJDBCService" global="jdbc/JDBCDatasource1" type="javax.sql.DataSource"/>
<ResourceLink name="mail/MyAppMailService" global="mail/MailService1" type="javax.mail.Session"
/>
有了这个,对应用程序 web.xml 中的资源的引用就不再需要了。
最后,在应用程序源代码中,我更改了查找部分以使用 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 文件中的资源,使用 he/she 想要的名称,部署人员只需映射命名为应用程序使用的名称,只是修改应用程序的 context.xml.
现在还挺简单的,以前做的很烂
The thing is that the name of the resources may be changed by the sysadmins; so, I cannot hardcode the name of the resources
这要么是错误的,要么是使用了错误的术语。在 Java EE 架构中,应用程序拥有资源 reference 名称,系统管理员必须确保满足资源引用。如果应用程序需要一个名为 mail/MailService
的资源引用,那么它应该通过 <res-ref-name>
或 @Resource
声明引用名称。然后,管理员必须通过将其链接到资源来确保具有该名称的资源引用得到满足。在Tomcat中,你可以直接declare the resource using the resource reference name, or you can declare a global resource with whatever name and then link the resource reference到全局资源(在其他应用服务器中,这个"linking"通常被称为"binding")。
我需要一些关于如何使用 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");
问题是系统管理员可能会更改资源的名称;所以,我不能硬编码资源的名称。我可以使用上下文参数或类似的东西来允许系统管理员为每个资源指定所选名称,但考虑到我必须使用资源引用部分,我不想指定相同的名称在 web.xml 文件中两次(一次用于参数,另一次用于参考)。复制配置就是复制某人犯错的机会,我想尽量减少错误配置的机会..
我在网上搜索 web.xml 中的变量之类的东西,但我没有找到任何东西。有人对此有什么想法吗?
=== 分辨率 ===
按照 Brett 指出的行,这是我为避免重复配置所做的:
首先,将资源配置从 Tomcat 的 context.xml 移出到 Tomcat 的 server.xml,在 GlobalNamingResources 区域中,使用通用名称:
<GlobalNamingResources>
...
<Resource name="mail/MailService1" ...
<Resource name="jdbc/JDBCDatasource1" ...
...
然后,我在app context.xml文件中创建了两个ResourceLink(注意不是Tomcat一个),其中每个链接都有app使用的确切名称,并指向,通过全局属性,给资源:
<ResourceLink name="jdbc/MyAppJDBCService" global="jdbc/JDBCDatasource1" type="javax.sql.DataSource"/>
<ResourceLink name="mail/MyAppMailService" global="mail/MailService1" type="javax.mail.Session"
/>
有了这个,对应用程序 web.xml 中的资源的引用就不再需要了。
最后,在应用程序源代码中,我更改了查找部分以使用 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 文件中的资源,使用 he/she 想要的名称,部署人员只需映射命名为应用程序使用的名称,只是修改应用程序的 context.xml.
现在还挺简单的,以前做的很烂
The thing is that the name of the resources may be changed by the sysadmins; so, I cannot hardcode the name of the resources
这要么是错误的,要么是使用了错误的术语。在 Java EE 架构中,应用程序拥有资源 reference 名称,系统管理员必须确保满足资源引用。如果应用程序需要一个名为 mail/MailService
的资源引用,那么它应该通过 <res-ref-name>
或 @Resource
声明引用名称。然后,管理员必须通过将其链接到资源来确保具有该名称的资源引用得到满足。在Tomcat中,你可以直接declare the resource using the resource reference name, or you can declare a global resource with whatever name and then link the resource reference到全局资源(在其他应用服务器中,这个"linking"通常被称为"binding")。