Шлях файлу до ресурсу в нашій папці war / WEB-INF?


95

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

/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)

Останній підхід працюватиме незалежно від того, який контейнер Servlet ви використовуєте та де встановлено додаток. Колишній підхід працюватиме лише в тому випадку, якщо файл WAR перед розгортанням розпакується.

EDIT: Метод getContext (), очевидно, щось, що вам доведеться реалізувати. Сторінки JSP роблять це доступним як contextполе. У сервлеті ви отримуєте його від свого, ServletConfigякий передається init()методу сервлета . Якщо ви зберігаєте його в той час, ви можете отримати свій ServletContext в будь-який час після цього.


3
Варто зазначити, що мені потрібно було поставити початковий / у шлях, щоб змусити це працювати, як-от так: context.getResourceAsStream ("/ WEB-INF / test / foo.txt");
Мік Сір

1
Не працює на аппендині так просто, як це позначено тегом.
Ренасьєнза

2
Це було позначено як правильну відповідь 6 років тому. Або Google змінив API двигуна додатка, або є помилка у вашому розгортанні. Якщо ви використовуєте стандартний сервлет, ви повинні мати можливість використовувати context.getResourceAsStream()варіант.
Берін Лорич

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

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


1

Я знаю, що це пізно, але це я зазвичай роблю,

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