Разрешение корня веб-приложения из getResource - PullRequest
2 голосов
/ 06 января 2012

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

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 ]

7 голосов
/ 06 января 2012

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

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

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

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

getClass().getResource("reports/info.txt");
3 голосов
/ 06 января 2012

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

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

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

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

...