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

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

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

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

Спасибо

2 ответа

Решение

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

Это даст вам полный системный путь к ресурсу, который вы ищете. Однако это не сработает, если контейнер сервлетов никогда не развернет файл 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

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

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

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

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

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

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

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
Другие вопросы по тегам