Разрешение корня веб-приложения из getResource

У меня есть структура файла, как это в моем веб-приложении:

webapp/
├── META-INF
└── WEB-INF
    ├── reports
    │   └── info.txt
    └── web.xml

3 directories, 2 files

мне нужно получить /WEB-INF/reports/info.txt из класса вот так:

this.getClass().getResource("/WEB-INF/reports/info.txt");

Это решит? Я собираюсь проверить это, но я не уверен, как загрузчик классов Tomcat решает проблемы. Если это не работает, как я могу получить файл?

2 ответа

Решение

Ну, во-первых, this.getClass().getResource не должно работать (хотя я не пытался). Это не путь к классам, это ServletContext, поэтому вам нужно использовать ServletContext.getResource,

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

Мы используем служебный класс Spring, который обрабатывает оба файла (через ServletContext.getResourcePaths если доступно) и WARS (через ServletContext.getResource). Если вы используете Spring, это может быть лучшим способом. Если вы этого не сделаете, вам, вероятно, придется заново реализовать решение.

Кроме того, вы можете просто использовать ServletContext.getResourceAsStream- ему все равно, где именно хранится ресурс. Так что, пока вам нужно его содержание, а не путь, у вас все будет хорошо.

Нет, это не решит. Class.getResource загружает ресурсы из пути к классам, а корневой каталог веб-приложения сам по себе не находится в пути к классам.

Чтобы получить доступ к этому ресурсу, вам нужно ServletContext, по которому можно потом позвонить ServletContext.getResource("/WEB-INF/reports/info.txt"), Это должно работать.

Вы можете получить ServletContext с помощью Servlet.getServletConfig().getServletContext(),

Или переместите reports каталог под /WEB-INF/classes каталог (который находится на пути к классам). Затем вы можете получить свой файл, используя

getClass().getResource("reports/info.txt");
Другие вопросы по тегам