#java #spring-boot #spring-mvc #jsp #war
#java #spring-boot #spring-mvc #jsp #Война
Вопрос:
Я пытаюсь преобразовать старое устаревшее приложение из JavaEE в spring-boot-2.
Как вы на самом деле обслуживаете простые старые JSP-страницы БЕЗ контроллера?
Я снова и снова гуглил это, и, как ни странно это звучит, я не могу понять это или найти простой пример, который действительно работает. Я просто продолжаю получать «404 Не найдено» при попытке доступа к JSP.
Я использую maven, упаковываю как файл WAR, и я нормально запускаю его как «взорванный» (что кажется лучшим выбором?), Но все еще не смог заставить его работать.
Я не понимаю, как это может быть так сложно, неужели это больше невозможно сделать в spring-boot-2?
Кто-нибудь может указать мне на рабочий пример? Или подробная инструкция, как это сделать?
РЕДАКТИРОВАТЬ: это то, что говорят документы Spring. Ограничения JSP:
«С Jetty и Tomcat это должно работать, если вы используете war-упаковку». Откуда:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle /
Но как именно? Это то, что я пытаюсь выяснить…
Комментарии:
1. В WAR где у вас есть файлы JSP.
2. На самом деле я перепробовал «все», что смог найти, но пока ничего не сработало. Что вы рекомендуете?
3. Страницы JSP компилируются в сервлеты с помощью движка сервлетов, поэтому вы хотите, чтобы Spring обслуживал ваши представления JSP со своих контроллеров, или вы хотите полностью обойти Spring и использовать JSP традиционным способом (который вы, кажется, спрашиваете, и который вообще не связан с Spring)?
4. @Kayaman — если код работает в контейнере JavaEE (или обычном старом Tomcat), но не при развертывании того же в Spring-Boot, я думаю, что проблема имеет какое-то отношение к Spring, не так ли? — смотрите правильный ответ ниже.
Ответ №1:
Проблема в том, что Spring Boot по умолчанию захватывает мир, т. Е. регистрирует DispatcherServlet
с отображением сервлета /
, тем самым ускоряя обработку *.jsp
файлов в контейнерах сервлетов.
Чтобы позволить контейнеру сервлета нормально обрабатывать JSP, нам нужно убедиться, что Spring DispatcherServlet
не перехватывает их, например, гарантируя, что он обрабатывает запросы только с определенными суффиксами или с определенными префиксами.
Например. если ни один путь JSP не начинается с /api/
, то мы можем использовать это для DispatcherServlet
, т. Е. Любой запрос на /api/*
будет обработан Spring Boot, а любой другой запрос будет обработан контейнером сервлета.
Для этого добавьте следующее в application.properties
файл:
spring.mvc.servlet.path = /api
Комментарии:
1. БИНГО!! Да, НАКОНЕЦ-ТО! ЭТО решило проблему!! СПАСИБО, Андреас, куда я могу отправить тебе пиво?!! 🙂
2. «Весенняя загрузка по умолчанию захватывает мир» — Хорошая строка, кстати. Это верно более чем в одном смысле! 🙂
Ответ №2:
вы где-нибудь объявили отображение сервлета? я считаю, что вам нужна точка входа, иначе это просто мертвый файл, указывающий в никуда
Комментарии:
1. Сопоставления сервлетов предназначены для сервлетов, afaik. — Простые старые страницы JSP, я бы максимально ожидал, что параметр конфигурации, указывающий на их местоположение, или что-то в этом роде.
2. извините, мое объяснение не удалось, я имел в виду, что в среде Spring вам нужно это настроить. Я не считаю свой ответ полностью неправильным, просто неполным