Разрешение корня веб-приложения из 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");