web項目打包後在代碼中獲取資源文件

在web項目裏面,有時代碼裏面須要引用一些自定義的配置文件,這些配置文件若是放在類路徑下,項目通過打包後使用的相對路徑也會發生變化,因此如下給出了三種解決方案。
1、properties下配置web

在類路徑下定義config.properties,內容爲:spring

name=zhangsan

在xml配置server.propertiesapp

<util:properties id="config" location="classpath:conf/config.properties"/>

在service類裏注入:eclipse

@Value("#{config['name']}")
private String name;

二:在properties下配置webapp

在類路徑classpath下定義config.propertiesthis

name=zhangsan

在xml裏配置spa

<!-- 引入配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:config/*.properties" />
</bean>
<bean id = "config" class = "com.util.Config">
    <property name="name" value = "${name}" />
</bean>

com.util.Config裏內容code

import org.springframework.core.io.Resource;

public class Config {
    private Resource resource;

    public Resource getResource() {
        return resource;
    }

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

調用方法:server

//此處name爲自定義bean的id
@Resource(name = "config")
protected  Config config;

protected String configPath; 

protected String getConfigPath() {
    if (StringUtils.isEmpty(name)) {
        try {
            name = config.getResource().getFile().getAbsolutePath();
            return configPath;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return configPath;
}

3、經常使用的方式xml

ClassLoader 提供了兩個方法用於從裝載的類路徑中取得資源:

public URL getResource (String name);  
  public InputStream  getResourceAsStream (String name);

這裏name是資源的類路徑,它是相對與"/"根路徑下的位置。getResource獲得的是一個URL對象來定位資源,而getResourceAsStream取得該資源輸入流的引用保證程序能夠從正確的位置抽取數據。可是真正使用的不是ClassLoader的這兩個方法,而是Class的getResource和getResourceAsStream方法,由於Class對象能夠從你的類獲得(如YourClass.class或 YourClass.getClass()),而ClassLoader則須要再調用一次YourClass.getClassLoader()方法,根據JDK文檔的說法,Class對象的這兩個方法實際上是「委託」(delegate)給裝載它的ClassLoader來作的,因此只須要使用 Class對象的這兩個方法就能夠了。所以,直接調用this.getClass().getResourceAsStream(String name);獲取流,靜態化方法中則使用ClassLoader.getSystemResourceAsStream(String name)

下面是一些獲得classpath和當前類的絕對路徑的一些方法。你可能須要使用其中的一些方法來獲得你須要的資源的絕對路徑。

1.this.getClass().getResource("")

獲得的是當前類class文件的URI目錄。不包括本身!
如:file:/D:/workspace/jbpmtest3/bin/com/test/

2.this.getClass().getResource("/")

獲得的是當前的classpath的絕對URI路徑 。
如:file:/D:/workspace/jbpmtest3/bin/

3.this.getClass() .getClassLoader().getResource("")

獲得的也是當前ClassPath的絕對URI路徑 。
如:file:/D:/workspace/jbpmtest3/bin/

4.ClassLoader.getSystemResource("")

獲得的也是當前ClassPath的絕對URI路徑 。
如:file:/D:/workspace/jbpmtest3/bin/

5.Thread.currentThread().getContextClassLoader ().getResource("")

獲得的也是當前ClassPath的絕對URI路徑 。
如:file:/D:/workspace/jbpmtest3/bin/

6.ServletActionContext.getServletContext().getRealPath(「/」)

Web應用程序 中,獲得Web應用程序的根目錄的絕對路徑。這樣,咱們只須要提供相對於Web應用程序根目錄的路徑,就能夠構建出定位資源的絕對路徑。 如:file:/D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/WebProject

相關文章
相關標籤/搜索