Варианты использования для @WebInitParam

#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. В этом случае прикладной программист должен уметь настраивать сервлет.