context.xml 的解释

Posted

技术标签:

【中文标题】context.xml 的解释【英文标题】:Explanation of context.xml 【发布时间】:2014-06-02 14:12:51 【问题描述】:

在使用 Tomcat 时,我一直将 web.xml 视为一种 .htaccesshttpd.conf 等价物。可能需要某种方式来配置 Web 服务器,这似乎很自然。

但是,我不太明白context.xml 的用途。例如,在使用 JDBC 时,为什么我必须在 web.xml 中添加一个 resource-ref 以及在 context.xml 中添加更多信息的 Resource?我可以消除context.xml 文件并以某种方式在我的代码中实例化DataSource 吗?我之所以这么问,是因为像这样的假设性例子可以帮助我理解。

编辑:我试图了解在 /META-INF/context.xml 中这样的配置中发生了什么:

<Context>
<Resource name="jdbc/postgres" auth="Container" type="javax.sql.DataSource"
    driverClassName="org.postgresql.Driver" url="jdbc:postgresql://127.0.0.1:5432"
    username="postgres" password="yes" maxActive="20" maxIdle="10"
    maxWait="-1" />
</Context>

并且,在WEB-INF/web.xml

<resource-ref>
    <description>postgreSQL Datasource example</description>
    <res-ref-name>jdbc/postgres</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

为什么我必须把这两个都放在那里才能使用 JDBC?他们到底在做什么,除了在 Java 代码中,还有其他方法可以做同样的事情吗?就像我说的,不是因为我想这样做,而是因为我想了解他们在哪些方面做得更好。

【问题讨论】:

【参考方案1】:

我不太明白context.xml的目的

context.xml 是从 web.xml&lt;context-param&gt; 标记调用的。 当您创建应用程序时首先加载 web.xml,它将为其中配置的 contexts 创建引用

我不太明白context.xml的目的

所以,context.xml 的目的是添加代码分隔。你可以有不同的上下文用于不同的目的。例如对于数据库连接,使用其他框架等..,

我能否消除context.xml 文件并以某种方式在我的代码中实例化DataSource

是的,您可以通过在 web.xml 本身中配置 datasource 来做到这一点。

希望这会有所帮助!!

【讨论】:

感谢您的解释。您能否偶然发布一个示例,说明我如何消除 context.xml 并仅在代码本身中实例化 DataSource @tau 你可以使用properties文件 所以通常我会这样做:cxt = new InitialContext();ds = (DataSource) cxt.lookup("java:/comp/env/jdbc/postgres"); 如果没有 context.xml 文件,你将如何做同样的事情?谢谢! 没关系,找到了一些如何使用 tomcat 或其他连接池的示例。这是一个例子:tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html【参考方案2】:

对于您最初的问题:

我不太明白 context.xml 的用途

在 Tomcat 中,您会经常看到术语“Context”。当您看到它时,它只是指您的应用程序(即 Context == 您的 Web 应用程序)。因此 /META-INF/context.xml 是特定于您的应用程序的配置文件(实际上,它是配置文件之一,因为有others)。

例如,在使用 JDBC 时,为什么我必须在 web.xml 中添加资源引用以及在 context.xml 中添加包含更多信息的资源?

你没有。您无需向 web.xml 添加任何内容。如果您在 /META-INF/context.xml 中定义资源,Tomcat 将创建您的资源并通过 JNDI 公开它。然后,您可以像从 JNDI 中检索任何资源一样检索它。

我可以删除 context.xml 文件并以某种方式在我的代码中实例化 DataSource 吗?

可能。经常看到 Spring 用户在他们的 Spring bean 定义中创建一个 DataSource。如果你不使用 Spring,你仍然可以这样做,但它会做更多的工作。

无论您如何执行此操作,如果您在应用程序中设置 DataSource,您将失去一些灵活性。例如,您不能在多个应用程序之间共享 DataSource,并且您的应用程序必须知道如何设置 DataSource。如果您在服务器的配置中定义 DataSource(即使用 Resource 标签),那么您的应用程序不需要此信息。

对于 san krish 的回复:

因此,context.xml 的目的是添加代码分离。你可以有不同的上下文用于不同的目的。例如对于数据库连接,使用其他框架等..,

Context 标签的目的是配置上下文(即您的应用程序)。它可能使您能够将应用程序的某些方面(如数据源)从代码中提取到配置中,但这只是外部化配置的好处。这不是这个文件的目的。

是的,您可以通过在 web.xml 本身中配置数据源来做到这一点。

不,对于 Tomcat,您不能严格通过 web.xml 配置数据源。只是不可能在 web.xml 中提供创建数据源所需的所有信息。因此,您需要为您的 DataSource 定义一个 Resource 标签,并且在 web.xml 中指定您的 DataSource 是多余的。

【讨论】:

以上是关于context.xml 的解释的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat下server.xml中context介绍

spring-context.xml 的位置

更改 Context.xml 后的 Tomcat Manager App 404

如何为带有注释的 spring 设置 context.xml?

在 spring-context.xml 和 persistence.xml 中加载 .properties

xml 的context.xml