Я решил это по-разному.
Во-первых, непереносимым способом является то, что Glassfish (и я тоже верю в Tomcat) позволяет вам сопоставить внешний каталог с иерархией веб-приложений. Это работает очень хорошо и делает именно то, что вы хотите. Он позволяет вам хранить изображения во внешнем каталоге вне вашего веб-приложения, но при этом обслуживать их.
Однако эта техника не переносима.
Путь к тому, что я сделал это переносимо, - создание фильтра.
Вы устанавливаете фильтр где-то очевидно, скажем "/images".
Что делает фильтр:
проверяет изображение (или что-либо еще, работает с любым статическим ресурсом) в специальном каталоге в веб-приложении. Для нашего примера мы будем использовать URL "/webapp/images".
если файл НЕ существует, мы копируем файл из вашего внешнего местоположения в соответствующее место в веб-приложении. Итак, скажем, запрашиваемый URL-адрес "/images/banner.gif". И что ваши файлы хранятся на диске в «/ home / app / images». Итак, наш исходный файл - «/home/app/images/banner.gif». Затем мы копируем его туда, где мы хотим, в дереве веб-приложений. Для этого мы используем «ServletContext.getRealPath». Таким образом, местом назначения будет "ServletContext.get RealPath (" / webapp / images / banner.gif "). Просто скопируйте источник в место назначения.
- если файл уже существовал или существует, просто перейдите к реальному изображению по адресу /webapp/images/banner.gif.
По сути, у вас есть файловый кеш в дереве развертывания веб-приложений. Недостатком является то, что это кеш, поэтому его необходимо поддерживать (то есть вы должны проверить, является ли оригинал новее, чем ваш кеш, обязательно удалить, если источник удален и т. Д.). Кроме того, он дублирует ваши ресурсы, поэтому ваши образы будут, в конечном итоге, занимать вдвое больше дискового пространства. Наконец, есть начальная стоимость копирования при запуске.
Однако, он работает, и он не позволяет вам обслуживать статические ресурсы, используя ваш собственный код. (Что является третьим решением, сопоставьте фильтр / сервлет для перехвата URL-адресов и просто передайте его себе.)
Я бы посмотрел на конструкцию в Tomcat (предполагая, что она существует), чтобы сделать отображение для вас. Я знаю, что это существует в Glassfish. (Google поочередно докрутил Glassfish, чтобы посмотреть, как это работает.)