War / WEB-INF klasörümüzde kaynağa giden dosya yolu?


95

Uygulama motoru projemin war / WEB-INF klasöründe bir dosyam var. Oradan bir sunucu uygulaması bağlamında bir dosyayı okuyabileceğinizi SSS'de okudum. Yine de kaynağa giden yolu nasıl oluşturacağımı bilmiyorum:

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

Yukarıda göründüğü gibi File () ile kullanmak için o kaynağa giden yolumu nasıl oluşturabilirim?

Teşekkürler

Yanıtlar:


138

Bunu yapmanın birkaç yolu var. WAR dosyası genişletildiği sürece (bir .war dosyası yerine bir dizi dosya), bu API'yi kullanabilirsiniz:

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)

Bu, aradığınız kaynağa giden tam sistem yolunu size verecektir. Ancak, Servlet Container WAR dosyasını (Tomcat gibi) hiçbir zaman genişletmezse bu işe yaramaz. İşe yarayacak olan şey ServletContext'in getResourceyöntemlerini kullanmaktır.

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

veya alternatif olarak, yalnızca giriş akışını istiyorsanız:

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)

İkinci yaklaşım, hangi Servlet Konteynırını kullanırsanız kullanın ve uygulamanın nereye kurulduğundan bağımsız olarak çalışacaktır. Önceki yaklaşım yalnızca, WAR dosyası konuşlandırılmadan önce sıkıştırılmışsa işe yarar.

DÜZENLEME: getContext () yöntemi açıkça uygulamanız gereken bir şeydir. JSP sayfaları, contextalan olarak kullanılabilir hale getirir . Bir sunucu uygulamasında, onu ServletConfigsunucu uygulamasının init()yöntemine geçirilen sizden alırsınız . O anda saklarsanız, ServletContext'inizi bundan sonra istediğiniz zaman alabilirsiniz.


3
Bunun işe yaraması için yola bir ilk / koymam gerektiğine dikkat çekmek gerekir, örneğin: context.getResourceAsStream ("/ WEB-INF / test / foo.txt");
Mick Sear

1
Appengine üzerinde soru etiketlendiği kadar basit çalışmıyor.
Renascienza

2
6 yıl önce doğru cevap olarak işaretlendi. Google, uygulama motoru API'sini değiştirdi veya dağıtımınızda bir hata var. Standart bir Servlet çalıştırıyorsanız, context.getResourceAsStream()varyasyonu kullanabilmelisiniz .
Berin Loritsch

2
bu iyi görünüyor, ancak java 1.8 kullanıyorum ve getContext () varsayılan olarak mevcut değil, onu kullanmak için hangi jar dosyası gerekiyor?
f1wade

3
ServletContext, javax.servletJ2EE kitaplıklarınızın paketinin bir parçasıdır . Servlet sınıfından ona bir referans alırsınız (yani ne genişler java.servlet.GenericServlet). BTW, GenericServlet'in artık getServletContext() docs.oracle.com/javaee/6/api/javax/servlet/…
Berin Loritsch


2

Geç olduğunu biliyorum, ama normalde böyle yapıyorum.

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.