Есть несколько способов сделать это. Пока файл 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 в любое время после этого.
context.getResourceAsStream()
вариант.javax.servlet
пакета ваших J2EE-библиотек. Вы получаете ссылку на него из класса сервлета (то есть из того, что расширяетсяjava.servlet.GenericServlet
). Кстати, GenericServlet теперь имеет метод дляgetServletContext()
docs.oracle.com/javaee/6/api/javax/servlet/…Теперь с Java EE 7 вы можете легко найти ресурс с помощью
InputStream resource = getServletContext().getResourceAsStream("/WEB-INF/my.json");
https://docs.oracle.com/javaee/7/api/javax/servlet/GenericServlet.html#getServletContext--
источник
getServletContext()
взялось?Я знаю, что это поздно, но я обычно так делаю,
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
источник