С API Servlet 3.x мы можем полностью устранить web.xml и перейти на Java Config. Я всегда находил web.xml как очень хорошую точку отладки, чтобы начать понимать веб-приложение. Я не понимаю, почему мы планируем перенести на Java-конфигурацию и полностью удалить web.xml. Я попытался найти подходящий ответ в Интернете, но не могу найти удовлетворительного объяснения. Любой может помочь мне понять это в практическом сценарии.В чем преимущество использования конфигурации на основе java вместо web.xml для сервлета 3.x
ответ
Это позволяет избежать повторения себя и совершать ошибки. Класс сервлета - это, например, com.foo.bar.SomeServlet
. Использование web.xml
, вы вынуждены повторно ввести этот класс в web.xml:
<servlet-class>com.foo.bar.Someservlet</servlet-class>
Но подождите, вы сделали опечатку, и вы обнаружите его только во время выполнения.
Или вы переименовываете класс сервлета, но вы также забыли переименовать его в web.xml, и вы обнаружите ошибку только во время развертывания.
Наконец, они облегчают нашу жизнь. Вы создаете сервлет, и вы, очевидно, хотите сопоставить его с некоторым URL-адресом. Поэтому вы просто добавляете аннотацию. Не нужно идти в другой файл, чтобы добавить сопоставление, а затем вернуться к классу, потому что вы забыли его точное имя, а затем снова вернитесь к файлу. Все, что касается сервлета, находится в классе сервлета. То же самое для фильтра, слушателя и т. Д.
Аннотации не имеют всех этих проблем.
Развертывание без дескрипторов является альтернативой конфигурационным файлам, но оно не предназначено для постоянной замены web.xml в каждом приложении и для каждого варианта использования. Если вам нужно изменить конфигурацию без повторной компиляции, вы должны придерживаться дескриптора развертывания, конечно. Иногда централизованное место, где все настраивается, может быть проще начать. Но он также может быть менее гибким, потому что вам нужно настроить все явно и вручную.
Одним из преимуществ автообнаругаемых аннотаций является то, что они отделяют ваши конечные точки и делают их независимыми. Например, если вы создаете веб-сервис JAX-RS, веб-приложение должно предоставить только путь приложения. Ему не нужно знать, какие ресурсы действительно доступны. Неважно, как называются классы ресурсов или в каком пакете они есть. Контейнер будет обрабатывать все. Поскольку все это соответствует стандарту сервлета, вы можете просто бросить военный архив только с аннотированными сервлетами или конечными точками ресурсов в контейнере сервлетов и запустить их. Или сделайте это wab-архив и разверните ту же самую вещь, что и osgi web bundle. Добавьте несколько DI, и все это позволяет создавать модульные веб-приложения и легко использовать независимые микросервисы.
На самом деле вы можете получить большинство этих преимуществ с помощью дескрипторов веб-фрагментов. С другой стороны, когда у вас есть десятки файлов web-fragment.xml
, разбросанных по всей системе, вы также потеряете преимущество четкой точки входа в приложение. На данный момент это зависит от ваших предпочтений, используете ли вы файлы или аннотации.