2012-01-05 28 views
2

解決web應用程序的根我有這樣一個文件結構中我的web應用程序:從的getResource

webapp/ 
├── META-INF 
└── WEB-INF 
    ├── reports 
    │   └── info.txt 
    └── web.xml 

3 directories, 2 files 

我需要從一個類獲得/WEB-INF/reports/info.txt像這樣:

this.getClass().getResource("/WEB-INF/reports/info.txt"); 

請問這個決心?我要測試它,但我不確定Tomcat的類加載器如何解決問題。如果這不起作用,我該如何獲取文件?

回答

3

那麼,首先,this.getClass().getResource不應該工作(儘管我沒有嘗試)。它不是類路徑,它是一個ServletContext,所以你需要使用ServletContext.getResource

問題是,它不是必需的文件:它可以是WAR檔案中的條目。所以,根據你知道的情況,答案可能會有所不同。

我們使用一個Spring實用程序類來處理這兩個文件(通過ServletContext.getResourcePaths,如果有的話)和WAR(通過ServletContext.getResource)。如果你使用Spring,那可能是最好的方法。如果您不這樣做,您可能需要重新實施解決方案。

或者,您可以簡單地使用ServletContext.getResourceAsStream-它不關心資源的存儲位置。所以只要你需要它的內容而不是路徑,你應該沒問題。

+0

是的,所以事情是我需要這個在servlet容器內部和外部工作。我需要一個非常標準的API來讓我得到一個給定的路徑,無論我是在Tomcat還是在Eclipse的jUnit類路徑中。你使用的是什麼API?我正在使用Spring 3. – 2012-01-05 21:58:24

+0

如果您在容器外部需要它,請將資源保存在類路徑中,並且不要觸摸Servlet API。 – alf 2012-01-05 22:00:12

+0

使用Spring的'ResourceLoader' /'ApplicationContext'來加載文件。 Awesomeness :) – 2012-01-06 15:46:57

5

不,它不會解決。 Class.getResource從類路徑加載資源,並且webapp的根目錄本身不在類路徑中。

爲了獲得該資源,您需要掌握ServletContext,然後您可以撥打ServletContext.getResource("/WEB-INF/reports/info.txt")。這應該工作。

您可以使用Servlet.getServletConfig().getServletContext()獲取ServletContext

或者,將您的reports目錄移動到/WEB-INF/classes目錄下(其中在類路徑中)。然後你可以使用你的文件

getClass().getResource("reports/info.txt");