Ścieżka pliku do zasobu w naszym folderze war / WEB-INF?

95

Mam plik w folderze war / WEB-INF projektu silnika aplikacji. Przeczytałem w FAQ, że możesz odczytać plik stamtąd w kontekście serwletu. Nie wiem jednak, jak utworzyć ścieżkę do zasobu:

/war/WEB-INF/test/foo.txt

Jak skonstruować ścieżkę do tego zasobu, aby używać jej z funkcją File (), tak jak wygląda powyżej?

Dzięki

user291701
źródło

Odpowiedzi:

138

Można to zrobić na kilka sposobów. Dopóki plik WAR jest rozszerzony (zestaw plików zamiast jednego pliku .war), możesz użyć tego API:

ServletContext context = getContext();
String fullPath = context.getRealPath("/WEB-INF/test/foo.txt");

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getRealPath(java.lang.String)

Dzięki temu uzyskasz pełną ścieżkę systemową do poszukiwanego zasobu. Jednak to nie zadziała, jeśli kontener serwletów nigdy nie rozwinie pliku WAR (jak Tomcat). To, co zadziała, to użycie getResourcemetod ServletContext .

ServletContext context = getContext();
URL resourceUrl = context.getResource("/WEB-INF/test/foo.txt");

lub alternatywnie, jeśli chcesz tylko strumień wejściowy:

InputStream resourceContent = context.getResourceAsStream("/WEB-INF/test/foo.txt");

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getResource(java.lang.String)

To drugie podejście będzie działać niezależnie od używanego kontenera serwletów i miejsca zainstalowania aplikacji. To pierwsze podejście zadziała tylko wtedy, gdy plik WAR zostanie rozpakowany przed wdrożeniem.

EDYCJA: Metoda getContext () jest oczywiście czymś, co trzeba by zaimplementować. Strony JSP udostępniają je jako contextpole. W serwlecie otrzymujesz go ze swojego, ServletConfigktóry jest przekazywany do metody serwletu init(). Jeśli zapiszesz go w tym czasie, możesz uzyskać swój ServletContext w dowolnym momencie po tym.

Berin Loritsch
źródło
3
Warto zaznaczyć, że musiałem umieścić inicjał / w ścieżce, aby to zadziałało, na przykład: context.getResourceAsStream ("/ WEB-INF / test / foo.txt");
Mick Sear
1
Nie działa tak prosto w Appengine, jak to jest oznaczone tagiem.
Renascienza
2
Została oznaczona jako poprawna 6 lat temu. Google zmienił interfejs API silnika aplikacji lub wystąpił błąd w Twoim wdrożeniu. Jeśli używasz standardowego serwletu, powinieneś być w stanie użyć tej context.getResourceAsStream()odmiany.
Berin Loritsch
2
wydaje się to dobre, ale używam Java 1.8 i getContext () domyślnie nie istnieje. Który plik jar jest potrzebny, aby go użyć?
f1wade
3
ServletContext jest częścią javax.servletpakietu twoich bibliotek J2EE. Odniesienie do niego uzyskujesz z klasy serwletu (tj. Co rozszerza java.servlet.GenericServlet). BTW, GenericServlet ma teraz metodę do getServletContext() docs.oracle.com/javaee/6/api/javax/servlet/ ...
Berin Loritsch
1

Wiem, że to późno, ale normalnie to robię

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
świst
źródło