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


95

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

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

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

Благодарность

Ответы:


138

Есть несколько способов сделать это. Пока файл 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)

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

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 разархивирован перед развертыванием.

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


3
Стоит отметить, что мне нужно было поставить начальную / в пути, чтобы заставить это работать, например: context.getResourceAsStream ("/ WEB-INF / test / foo.txt");
Mick Sear

1
На appengine не работает так просто, как вопрос помечен.
Renascienza

2
6 лет назад он был отмечен как правильный ответ. Либо Google изменил API движка приложения, либо в вашем развертывании есть ошибка. Если вы используете стандартный сервлет, вы сможете использовать этот context.getResourceAsStream()вариант.
Берин Лорич

2
это кажется хорошим, но я использую java 1.8, а getContext () не существует по умолчанию, какой файл jar необходим для его использования?
f1wade

3
ServletContext является частью javax.servletпакета ваших J2EE-библиотек. Вы получаете ссылку на него из класса сервлета (то есть из того, что расширяется java.servlet.GenericServlet). Кстати, GenericServlet теперь имеет метод для getServletContext() docs.oracle.com/javaee/6/api/javax/servlet/…
Берин Лорич

3

Теперь с Java EE 7 вы можете легко найти ресурс с помощью

InputStream resource = getServletContext().getResourceAsStream("/WEB-INF/my.json");

https://docs.oracle.com/javaee/7/api/javax/servlet/GenericServlet.html#getServletContext--


Откуда getServletContext()взялось?
Адам Гурвиц

Адам, вы найдете его начиная с Java Servlet 3.1.
Даниэль Де Леон

1

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

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.