Path file ke sumber daya di folder war / WEB-INF kita?

95

Saya punya file di folder war / WEB-INF saya dari proyek mesin aplikasi saya. Saya membaca di FAQ bahwa Anda dapat membaca file dari sana dalam konteks servlet. Saya tidak tahu bagaimana membentuk jalur ke sumber daya:

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

Bagaimana saya membangun jalur saya ke sumber daya tersebut untuk digunakan dengan File (), seperti yang terlihat di atas?

Terima kasih

pengguna291701
sumber

Jawaban:

138

Ada beberapa cara untuk melakukan ini. Selama file WAR diperluas (satu set file, bukan satu file .war), Anda dapat menggunakan API ini:

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)

Itu akan memberi Anda jalur sistem lengkap ke sumber daya yang Anda cari. Namun, itu tidak akan berhasil jika Servlet Container tidak pernah memperluas file WAR (seperti Tomcat). Apa yang akan berhasil adalah menggunakan metode ServletContext getResource.

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

atau sebagai alternatif jika Anda hanya menginginkan aliran input:

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)

Pendekatan terakhir akan bekerja tidak peduli apa Servlet Container yang Anda gunakan dan di mana aplikasi diinstal. Pendekatan sebelumnya hanya akan berfungsi jika file WAR dibuka ritsletingnya sebelum penerapan.

EDIT: Metode getContext () jelas merupakan sesuatu yang harus Anda terapkan. Halaman JSP membuatnya tersedia sebagai contextlapangan. Dalam servlet Anda mendapatkannya dari Anda ServletConfigyang diteruskan ke metode servlet init(). Jika Anda menyimpannya pada waktu itu, Anda bisa mendapatkan ServletContext kapan pun Anda mau setelah itu.

Berin Loritsch
sumber
3
Perlu diperhatikan bahwa saya perlu meletakkan inisial / di jalur agar ini berfungsi, seperti ini: context.getResourceAsStream ("/ WEB-INF / test / foo.txt");
Mick Sear
1
Tidak bekerja sesederhana di appengine, karena pertanyaannya diberi tag.
Renascienza
2
Itu ditandai sebagai jawaban yang benar 6 tahun lalu. Entah Google mengubah API mesin aplikasi atau ada bug dalam penerapan Anda. Jika Anda menjalankan Servlet standar, Anda harus dapat menggunakan context.getResourceAsStream()variasinya.
Berin Loritsch
2
ini sepertinya bagus, tetapi saya menggunakan java 1.8 dan getContext () tidak ada secara default, file jar mana yang diperlukan untuk menggunakannya?
f1wade
3
ServletContext adalah bagian dari javax.servletpaket perpustakaan J2EE Anda. Anda mendapatkan referensi untuk itu dari kelas servlet (yaitu yang meluas java.servlet.GenericServlet). BTW, GenericServlet sekarang memiliki metode ke getServletContext() docs.oracle.com/javaee/6/api/javax/servlet/…
Berin Loritsch
1

Saya tahu ini terlambat, tapi begitulah biasanya saya melakukannya,

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