#java #jakarta-ee #servlets #annotations
#java #джакарта-ee #сервлеты #аннотации
Вопрос:
Начиная со спецификации Servlet 3.0 существует возможность объявления метаданных отображения сервлета в качестве аннотации к классу servlet:
@WebServlet(name="appInfoServlet", urlPatterns ="/appInfo", initParams = @WebInitParam(name="ocwd.deployer.email", value="admin@example.com"))
public class AppInfoServlet extends HttpServlet {
}
Чего я не понимаю, так это варианта использования для сохранения параметров инициализации в том же классе, что и сервлет. Насколько я понимаю, эти параметры должны храниться отдельно от класса и помещаться в дескриптор развертывания.
Какие существуют варианты использования для указания параметров инициализации в @WebServlet
аннотации?
Ответ №1:
Аннотации используются для присвоения значений по умолчанию.
В JavaEE свойства развертывания также могут быть предоставлены с помощью аннотаций. Учитывая значения для аннотаций, дескриптора развертывания, т.е. web.xml все еще может использоваться для переопределения значений по умолчанию, предоставляемых аннотациями.
В приведенном выше примере init-param
может быть переопределен путем настройки servlet
с соответствующим именем в web.xml
:
<servlet>
<servlet-name>appInfoServlet</servlet-name>
<init-param>
<param-name>ocwd.deployer.email</param-name>
<param-value>noreply@example.com</param-value>
</init-param>
</servlet>
Комментарии:
1. Спасибо за ответ. Я добавил пример того, как работает переопределение в вашем ответе.
Ответ №2:
Я могу придумать один из них, исходя из моей головы: укажите значение по умолчанию (т. Е. разработчиком классов).
Если пользователя этого класса устраивает значение по умолчанию, ему не нужно ничего добавлять и он просто использует его. Если это не так — он может изменить это с помощью DD.
Ответ №3:
Я думаю, что этот вариант использования похож на другие варианты использования для других аннотаций в различных фреймворках, где мы использовали отдельный XML перед аннотациями.
То же самое можно сказать и об аннотациях JAXB. Действительно, вы можете реализовать один класс и использовать несколько стратегий его отображения в XML. Но как только вы переходите к аннотациям, вы создаете своего рода тесную связь между классом и метаданными. То же самое относится и к аннотациям Spring. И т.д.
На практике мы редко развертываем один и тот же сервлет дважды, используя разную конфигурацию, или дважды используем один и тот же EJB, или сопоставляем класс с разными схемами XML. Но в этом случае очень удобно хранить метаданные вместе с кодом. Эта проблема решается на java с помощью аннотаций.
Итог: используйте это определение в конкретном приложении, где каждый сервлет обладает определенной функциональностью и ролью и по определению не может быть повторно использован и тесно связан со своим отображением URL и конфигурацией. Не используйте это, если вы создаете среду, подобную Struts или Spring controller. В этом случае прикладной программист должен уметь настраивать сервлет.