Использование специального сервлета автоматического запуска для инициализации при запуске и обмена данными приложения.

StackOverflow https://stackoverflow.com/questions/3468150

Вопрос

Мне нужно получить некоторую конфигурацию, где-то подключиться к внешним ресурсам/объектам/системам и сохранить ее в области приложения.

Я вижу два способа настройки моего приложения:

  • Переопределение init() в существующих сервлетах и ​​требуемом коде и сохраняя все созданные объекты внутри этого же сервлета.
  • Имея какой-то сервлет инициализации и используя его init() сделать работу.Затем сохранение созданных объектов в ServletContext чтобы поделиться им с другими моими сервлетами.

Какой из вышеперечисленных подходов лучше?Есть ли лучший способ совместного использования объектов между сервлетами?Звонить им напрямую друг от друга или около того...?

Это было полезно?

Решение

Ни один из обоих подходов не является лучшим.Сервлеты предназначены для прослушивания событий HTTP (HTTP-запросов), а не событий развертывания (запуск/завершение работы).


CDI/JSF/EJB недоступен?Использовать ServletContextListener

@WebListener
public class Config implements ServletContextListener {

    public void contextInitialized(ServletContextEvent event) {
        // Do stuff during webapp's startup.
    }

    public void contextDestroyed(ServletContextEvent event) {
        // Do stuff during webapp's shutdown.
    }

}

Если вы еще не используете Servlet 3.0 и не можете выполнить обновление и, следовательно, не можете использовать @WebListener аннотацию, то вам необходимо вручную прописать ее в /WEB-INF/web.xml как показано ниже:

<listener>
    <listener-class>com.example.Config</listener-class>
</listener>

Чтобы хранить и получать объекты в области приложения (чтобы все сервлеты могли получить к ним доступ), используйте ServletContext#setAttribute() и #getAttribute().

Вот пример, который позволяет прослушивателю сохранять себя в области приложения:

    public void contextInitialized(ServletContextEvent event) {
        event.getServletContext().setAttribute("config", this);
        // ...
    }

а затем получить его в сервлете:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        Config config = (Config) getServletContext().getAttribute("config");
        // ...
    }

Он также доступен в JSP EL от ${config}.Таким образом, вы также можете сделать это простым бобом.


CDI доступен?Использовать @Observes на ApplicationScoped.class

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class Config {

    public void init(@Observes @Initialized(ApplicationScoped.class) ServletContext context) {
        // Do stuff during webapp's startup.
    }

    public void destroy(@Observes @Destroyed(ApplicationScoped.class) ServletContext context) {
        // Do stuff during webapp's shutdown.
    }
}

Это доступно в сервлете через @Inject.Сделайте это также при необходимости @Named так что это доступно через #{config} в ЭЛ тоже.

Следует отметить, что это нововведение со времен CDI 1.1.Если вы все еще используете CDI 1.0 и не можете обновиться, выберите другой подход.


JSF доступен?Использовать @ManagedBean(eager=true)

import javax.faces.bean.ManagedBean
import javax.faces.bean.ApplicationScoped;

@ManagedBean(eager=true)
@ApplicationScoped
public class Config {

    @PostConstruct
    public void init() {
        // Do stuff during webapp's startup.
    }

    @PreDestroy
    public void destroy() {
        // Do stuff during webapp's shutdown.
    }
}

Это доступно через #{config} в ЭЛ тоже.


EJB доступен?Учитывать @Startup@Singleton

@Startup
@Singleton
public class Config {

    @PostConstruct
    public void init() {
        // Do stuff during webapp's startup.
    }

    @PreDestroy
    public void destroy() {
        // Do stuff during webapp's shutdown.
    }
}

Это доступно в сервлете через @EJB.Я говорю «рассмотрите», потому что не следует злоупотреблять EJB ради привязки к запуску.Более того, @Singleton по умолчанию заблокировано чтение/запись и в первую очередь предназначено для транзакционных задач, таких как планирование фоновых заданий.

Смотрите также:

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top