java - 简化 Tomcat 7 中的 web.xml 配置

标签 java tomcat web.xml

我需要一些关于如何使用 Tomcat 7 简化 Web 应用程序配置的想法。

我有一个 Web 应用程序,它使用 Tomcat 的 context.xml 配置文件中定义的两个资源:邮件 session 和 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 文件中两次(一次用于参数,另一次用于 ref)。复制配置就是复制某人犯错的机会,我想尽量减少错误配置的机会。

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

=== 分辨率 ===

按照 Brett 指出的行,这是我为避免重复配置所做的:

首先,将资源配置从 Tomcat 的 context.xml 移出到 Tomcat 的 server.xml,在 GlobalNamingResources 区域内,使用通用名称:

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

然后,我在 app 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 中引用资源。

最后,在应用程序源代码中,我更改了查找部分以使用 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。

现在还挺简单的,以前做的很烂

最佳答案

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 体系结构中,应用程序拥有资源引用 名称,系统管理员必须确保满足资源引用。如果应用程序需要名为 mail/MailService 的资源引用, 那么它应该通过 <res-ref-name> 声明引用名称或 @Resource .然后,管理员必须通过将其链接到资源来确保具有该名称的资源引用得到满足。在 Tomcat 中,您可以直接 declare the resource使用资源引用名称,或者您可以使用任何名称声明一个全局资源,然后 link the resource reference到全局资源(在其他应用程序服务器中,这种“链接”通常称为“绑定(bind)”)。

关于java - 简化 Tomcat 7 中的 web.xml 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39583049/

相关文章:

spring-mvc - HTTP 状态 405 - 请求方法 'GET' 不支持 MVCspring

java - 使用 Jetty 加载 WAR 文件时忽略 web.xml

java - 使用 Java 获取远程计算机(桌面或服务器)系统配置和使用参数

java - 如何拆分包?根据功能将子类移动到不同的包或在 soma 包中组织?

java - xpath 不能在 java 中工作

web-services - 我应该使用 Tomcat 还是完整的 Java EE 容器?

java - 转发到 JSP 页面的基本 Struts1.2 应用程序

java.lang.NoSuchMethodError 错误

java - 为什么在开始时尝试没有 "/"的 servlet 映射时会出现异常

java - 根据路径检索值的查找库