чтение статических файлов из каталога сервлета

#java #tomcat #servlets #netbeans

#java #tomcat #сервлеты #netbeans

Вопрос:

я хочу сказать своему java-сервлету игнорировать вызовы для статических файлов, например, если файл существует — просто верните фактический файл без фактической загрузки сервлета.

в моем примере у меня есть MyServlet в netbeans, и в каталоге «веб-страницы» я разместил image.jpg .

затем я сгенерировал файл .war и поместил его в tomcat / webapps

когда я пытаюсь сделать запрос на localhost:8080/MyServlet/image.jpg — файл не загружается, вместо него выполняется сервлет.

я хочу, чтобы, если файл существует, он вернул его, в противном случае будет запущен сервлет.

есть ли быстрый способ его реализации?

Комментарии:

1. Вы смешиваете сервлеты и веб-приложения. В общем случае статическое содержимое обслуживается стандартным (зависящим от контейнера) сервлетом и работает без каких-либо изменений. Как выглядит ваше сопоставление сервлетов (я полагаю, это что-то вроде /* )?

Ответ №1:

Сопоставление вашего сервлета с / or /* не является стандартным способом реализации сервлетов. В общем случае вы сопоставляете глобальные (контроллерные) сервлеты с таким путем, как /myServlet/* . Сервлет Tomcat по умолчанию уже доступен для обслуживания вашего статического содержимого. Он настроен в <tomcat>/conf/web.xml . Извлечение из встроенной документации:

   <!-- The default servlet for all web applications, that serves static     -->
  <!-- resources.  It processes all requests that are not mapped to other   -->
  <!-- servlets with servlet mappings (defined either here or in your own   -->
 

Если вы будете следовать вышеупомянутому подходу, URL-адреса в вашем приложении могут выглядеть следующим образом:

Статический ресурс: http://myserver/myWAR/images/image.gif

URL-адреса вашего сервлета: http://myserver/myWAR/myServlet/* (* := подстановочный знак)

Конечно, доступны более сложные опции, такие как выгрузка статического содержимого на внешний веб-сервер. Вы также можете переопределить стандартную конфигурацию, но в большинстве ситуаций в этом нет необходимости (по крайней мере, по моему опыту).

Ответ №2:

Обычно вы справляетесь с этим с помощью сопоставления сервлетов или путем удаления статических ресурсов из сопоставления сервлетов.

В противном случае, если запрос сопоставляется с вашим сервлетом, вам нужно либо (а) проверить наличие файла в сервлете и перенаправить на реальное имя файла, либо передать изображение обратно самостоятельно, либо (б) написать фильтр, который достаточно знает о структуре вашего веб-приложения, чтобы определить, следует ли запрособрабатывается вашим сервлетом или контейнером.

Если бы вы описали свой вариант использования, было бы проще быть более полезным.

Комментарии:

1. для моего сопоставления сервлетов установлен URL-шаблон / , прямо сейчас кажется, что потоковая передача файла является решением

Ответ №3:

Для статических файлов вам, скорее всего, нужно просто использовать http://localhost:8080/image.jpg (т.е. без части MyServlet в URL-адресе)

Комментарии:

1. Вы уверены, что разместили image.jpg в папке , которая web.xml указывает, является ли веб-корень?