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 getResource
metod 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 context
pole. W serwlecie otrzymujesz go ze swojego, ServletConfig
któ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.
context.getResourceAsStream()
odmiany.javax.servlet
pakietu twoich bibliotek J2EE. Odniesienie do niego uzyskujesz z klasy serwletu (tj. Co rozszerzajava.servlet.GenericServlet
). BTW, GenericServlet ma teraz metodę dogetServletContext()
docs.oracle.com/javaee/6/api/javax/servlet/ ...Teraz dzięki Java EE 7 możesz łatwiej znaleźć zasoby za pomocą
InputStream resource = getServletContext().getResourceAsStream("/WEB-INF/my.json");
https://docs.oracle.com/javaee/7/api/javax/servlet/GenericServlet.html#getServletContext--
źródło
getServletContext()
bierze?Wiem, że to późno, ale normalnie to robię
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
źródło