Dateipfad zur Ressource in unserem Ordner war / WEB-INF?

95

Ich habe eine Datei in meinem War / WEB-INF-Ordner meines App Engine-Projekts. Ich habe in den FAQs gelesen, dass Sie von dort aus eine Datei in einem Servlet-Kontext lesen können. Ich weiß jedoch nicht, wie ich den Pfad zur Ressource bilden soll:

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

Wie würde ich meinen Pfad zu dieser Ressource erstellen, um sie mit File () zu verwenden, so wie es oben aussieht?

Vielen Dank

user291701
quelle

Antworten:

138

Es gibt verschiedene Möglichkeiten, dies zu tun. Solange die WAR-Datei erweitert ist (eine Reihe von Dateien anstelle einer .war-Datei), können Sie diese API verwenden:

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)

Dadurch erhalten Sie den vollständigen Systempfad zu der Ressource, nach der Sie suchen. Dies funktioniert jedoch nicht, wenn der Servlet-Container die WAR-Datei niemals erweitert (wie Tomcat). Was funktioniert, ist die Verwendung der ServletContext- getResourceMethoden.

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

oder alternativ, wenn Sie nur den Eingabestream möchten:

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)

Der letztere Ansatz funktioniert unabhängig davon, welchen Servlet-Container Sie verwenden und wo die Anwendung installiert ist. Der erstere Ansatz funktioniert nur, wenn die WAR-Datei vor der Bereitstellung entpackt wurde.

EDIT: Die Methode getContext () ist offensichtlich etwas, das Sie implementieren müssten. JSP-Seiten stellen es als contextFeld zur Verfügung. In einem Servlet erhalten Sie es von Ihrem, ServletConfigdas an die Servlet- init()Methode übergeben wird. Wenn Sie es zu diesem Zeitpunkt speichern, können Sie Ihren ServletContext jederzeit abrufen.

Berin Loritsch
quelle
3
Es ist erwähnenswert, dass ich eine Initiale / in den Pfad einfügen musste, damit dies funktioniert: context.getResourceAsStream ("/ WEB-INF / test / foo.txt");
Mick Sear
1
Funktioniert bei Appengine nicht so einfach, da die Frage markiert ist.
Renascienza
2
Es wurde vor 6 Jahren als die richtige Antwort markiert. Entweder hat Google die App Engine-API geändert oder es liegt ein Fehler in Ihrer Bereitstellung vor. Wenn Sie ein Standard-Servlet ausführen, sollten Sie die context.getResourceAsStream()Variante verwenden können.
Berin Loritsch
2
Das scheint gut zu sein, aber ich verwende Java 1.8 und getContext () existiert standardmäßig nicht. Welche JAR-Datei wird benötigt, um es zu verwenden?
F1wade
3
ServletContext ist Teil des javax.servletPakets Ihrer J2EE-Bibliotheken. Sie erhalten einen Verweis darauf von der Servlet-Klasse (dh was erweitert wird java.servlet.GenericServlet). Übrigens hat GenericServlet jetzt eine Methode zu getServletContext() docs.oracle.com/javaee/6/api/javax/servlet/…
Berin Loritsch
1

Ich weiß, dass dies spät ist, aber so mache ich es normalerweise,

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
sausen
quelle