Путь к ресурсу в нашей папке war/WEB-INF?

У меня есть файл в моей папке war/WEB-INF моего проекта движка приложения. Я читал в часто задаваемых вопросах, которые вы можете прочитать оттуда в контексте сервлета. Я не знаю, как сформировать путь к ресурсу, хотя:

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

Как мне создать свой путь к этому ресурсу для использования с File(), как он выглядит выше?

Спасибо

Ответ 1

Есть несколько способов сделать это. Пока файл WAR расширяется (набор файлов вместо одного .war файла), вы можете использовать этот 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)

Это даст вам полный системный путь к ресурсу, который вы ищете. Однако это не будет работать, если контейнер Servlet никогда не расширит WAR файл (например, Tomcat). Что будет работать с использованием методов ServletContext getResource.

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

или, альтернативно, если вы просто хотите входной поток:

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)

Последний подход будет работать независимо от того, какой сервлет-контейнер вы используете и где приложение установлено. Первый подход будет работать, только если файл WAR распакуется перед развертыванием.

EDIT: Метод getContext(), очевидно, должен быть реализован. Страницы JSP делают его доступным как поле context. В сервлете вы получите его из вашего ServletConfig, который передается в метод сервлета init(). Если вы сохраните его в это время, вы можете получить свой ServletContext в любое время после этого.

Ответ 3

Я знаю, что уже поздно, но так я обычно делаю,

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