Java 从Web文档根目录访问文件

Java 从Web文档根目录访问文件,java,spring,tomcat,spring-mvc,Java,Spring,Tomcat,Spring Mvc,我正在使用SpringMVC3.0和Tomcat 我有一个bean,它有一个属性,该属性的值应该是从web文档根目录派生的路径。例如,我将在Spring配置文件中指定它的值,如下所示 <bean id="myBean" class="com.stackoverflow.Bean"> <property name="path" value="/WEB-INF/foo.xml" /> </bean> 我将该值带到何处以便读取文件?Spring/Spr

我正在使用SpringMVC3.0和Tomcat

我有一个bean,它有一个属性,该属性的值应该是从web文档根目录派生的路径。例如,我将在Spring配置文件中指定它的值,如下所示

<bean id="myBean" class="com.stackoverflow.Bean">
    <property name="path" value="/WEB-INF/foo.xml" />
</bean>


我将该值带到何处以便读取文件?Spring/Spring MVC是否提供了一种透明的方式来访问文档根目录中的资源?

我假设您有一个很好的理由不将foo.xml放在WEB-INF/classes中。只需从该目录的类路径加载资源


也许可以使用“file:WEB-INF/foo.xml”命名来获得资源。我假设您有充分的理由不将foo.xml放在WEB-INF/classes中。只需从该目录的类路径加载资源


也许可以使用“file:WEB-INF/foo.xml”名称获得资源。

为了获得资源的真实路径,您需要访问
ServletContext

实现这一点的一种方法是使您的
com.stackoverflow.Bean实现ServletContextAware
接口。重新启动后,服务器应该将ServletContext的一个实例移交给这个bean(您必须包含以下代码)


最后,使用
ctx.getRealPath(path)
获取资源的真实路径。

为了获取资源的真实路径,您需要访问
ServletContext

实现这一点的一种方法是使您的
com.stackoverflow.Bean实现ServletContextAware
接口。重新启动后,服务器应该将ServletContext的一个实例移交给这个bean(您必须包含以下代码)


最后,使用
ctx.getRealPath(path)
获取资源的实际路径。

如果您不介意在POJO中直接使用Spring类,可以将path属性作为对象注入。Spring将为您处理从java.lang.String到org.springframework.core.io.Resource的转换。因此,它应该与您在问题中发布的XML配合使用

package com.stackoverflow;

import org.springframework.core.io.Resource;

public class Bean {

    private Resource resource;

    public void setPath(final Resource resource) {
        this.resource = resource;
    }

    public void doSomething() {
         // Use resource.getFile() to get java.io.File
         // or resource.getInputStream() to get java.io.InputStream
    }
}

有关资源的更多信息,请参阅。

如果您不介意在POJO中直接使用Spring类,可以将path属性作为对象注入。Spring将为您处理从java.lang.String到org.springframework.core.io.Resource的转换。因此,它应该与您在问题中发布的XML配合使用

package com.stackoverflow;

import org.springframework.core.io.Resource;

public class Bean {

    private Resource resource;

    public void setPath(final Resource resource) {
        this.resource = resource;
    }

    public void doSomething() {
         // Use resource.getFile() to get java.io.File
         // or resource.getInputStream() to get java.io.InputStream
    }
}

有关资源的更多信息,请参阅。

您可以看到所有Spring配置文件、Apache Tiles文件和Struts配置文件是如何位于/WEB-INF中的吗?我的档案性质相似。我只想始终如一。“愚蠢的始终如一是小头脑的妖怪”-拉尔夫·沃尔多·爱默生。首先让它工作;然后担心一致性。它已经运行了很长时间,我正在重构它。使用分散在各地的配置文件会很有趣。当我们有一个名叫达菲莫的天才时,谁还需要Apache项目和Spring遵循的约定?。你和你的答案一样聪明。你试过我给你的资源建议了吗?bmathews在我发布我的文件三小时后附议了它,但他的文件被否决了。“分散在各处”-在我看来,将所有非配置文件从/WEB-INF移动到/WEB-INF/classes并不值得。Spring要求您将*-servlet.xml放在/WEB-INF中,但所有其他文件都可以使用ContextLoaderListener从您选择的任何目录加载。我不知道你为什么这么不高兴或者认为这是一个大问题。你知道所有的Spring配置文件、Apache Tiles文件和Struts配置文件是如何位于/WEB-INF中的吗?我的档案性质相似。我只想始终如一。“愚蠢的始终如一是小头脑的妖怪”-拉尔夫·沃尔多·爱默生。首先让它工作;然后担心一致性。它已经运行了很长时间,我正在重构它。使用分散在各地的配置文件会很有趣。当我们有一个名叫达菲莫的天才时,谁还需要Apache项目和Spring遵循的约定?。你和你的答案一样聪明。你试过我给你的资源建议了吗?bmathews在我发布我的文件三小时后附议了它,但他的文件被否决了。“分散在各处”-在我看来,将所有非配置文件从/WEB-INF移动到/WEB-INF/classes并不值得。Spring要求您将*-servlet.xml放在/WEB-INF中,但所有其他文件都可以使用ContextLoaderListener从您选择的任何目录加载。我不知道你为什么这么不高兴或者认为这是个大问题。