2012-10-14 9 views
14

Mam zwykłą klasę java w aplikacji internetowej i chcę odczytać plik konfiguracyjny pod folderem WEB-INF. Znam sposób dostępu do pliku, jeśli znajduje się on w ścieżce classpath (folder WEB-INF/classes). Ponieważ folder WEB-INF/classes jest przeznaczony dla plików .class, chcę zachować mój plik konfiguracyjny tylko pod folderem WEB-INF.Jak uzyskać dostęp do pliku w folderze WEB-INF w klasie java

Czy ktoś może mi powiedzieć, w jaki sposób mogę uzyskać do niego dostęp z mojej klasy Java?

+1

Jeśli plik konfiguracyjny jest dla klas Java, dlaczego umieścić go w 'WEB -INF' folder ... dlaczego nie w folderze 'src/main/resources' i uzyskać do niego dostęp? –

+0

Powiedziałbym, że 'getResourceAsStream' powinien działać – SJuan76

+1

Konfiguracja powinna znajdować się w katalogu src/main/resources i będzie wbudowana w folder klasy po wdrożeniu aplikacji internetowej. Dlaczego musisz umieścić plik konfiguracyjny w folderze WEB-INF? – Thinhbk

Odpowiedz

2

Możesz uzyskać bezwzględną ścieżkę serwletu za pomocą metody getRealPath() z ServletContext, a następnie dołączyć WEB-INF do ścieżki, którą otrzymujesz. Myślę, że jest to bardzo podstawowe, ale mogą istnieć również inne odpowiedzi.

+1

Wiem, jak to zrobić za pomocą 'ServletContext'. Ale to, czego szukam, to zrobić w zwykłej klasie java. – Newbie

14

ServletContext.getResourceAsStream() załaduje plik z określonej ścieżki względem katalogu głównego pliku WAR. Coś jak:

ServletContext ctx; 
InputStream configStream = ctx.getResourceAsStream("/WEB-INF/config.properties"); 

Głównym problemem jest to, że potrzebujesz dostępu do kontekstu serwletu, aby móc to zrobić. Masz to w serwlecie lub filtrze, ale nie w niesieciowym komponencie z powrotem w aplikacji. Masz kilka opcji:

  • udostępniają kontekstu serwletu z warstwy internetowej do warstwy usług, za pośrednictwem zmiennej aplikacji o zasięgu lub wstrzyknięcie, lub jakiś inny sposób
  • umieścić kod zasobów ładowania w warstwa sieci Web i narazić na warstwie usług
  • obciążenia konfigurację w warstwie internetowej i przenieść go na warstwie usług
+0

Nie ma bezpośredniego sposobu robienia tego w składniku innym niż web, takim jak zwykła klasa java? – Newbie

+1

Nie wiem. Prosta klasa Java nie ma pojęcia, że ​​jest częścią aplikacji internetowej, więc nie ma możliwości, aby mógł uzyskać dostęp do dowolnego interfejsu API w celu robienia rzeczy specyficznych dla aplikacji internetowych! –

0

hey you all care for context related file loading like application context , web.xml ,config and property file

Oto jak załadować plik Java dowolnego pliku pod WEB-INF ale przechowywane na innym stucture jak podkatalogu reportFile pliku lub podkatalogu ponownie report01 -

fullpath is = /WEB-INF/reportFile/report01/report.xml, próbowałem wiele możliwości, aby załadować i przeczytaj ten plik xml ... żaden z powyższych nie działał dla mnie, ale tutaj jest podstęp do przyszłego użytku ...

In Action or inservice class you know interface implementation class no imports to także dobra część.

zadeklarować swój obiekt pliku

File myClass = new File(getClass().getProtectionDomain().getCodeSource().getLocation().getFile()); 
System.out.println("Finding calss path first then remove classes from the path " + myClass.getCanonicalPath().replaceFirst("classes", "")+"reportFIle/report01/reports.xml") 

2.Load ścieżka usuwając classes z powyższym oraz dodać swoją specyficzna ścieżka

File f = new File(myClass.getCanonicalPath().replaceFirst("classes", "")+"reportFile/report01/reports.xml") 

Następnie

można nawet przetworzyć go za pomocą XML analizator składni lub cokolwiek zrobić:

document = docBuilder.parse(new File(myClass.getCanonicalPath().replaceFirst("classes", "")+"reportFile/report01/reports.xml")); 

Pozdrawiam !!

1

"nowy FileInputStream ( Utility.class.getClassLoader(). GetResource (keyFileName) .getPath() )" pracował dla mnie.

Here „Utility” jest moja nazwa klasy, gdzie kod jest wywołaniem tej linii „keyFileName” jest plik muszę otworzyć

Powiązane problemy