Путь к файлу к ресурсу в нашей папке 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");