16 Aralık 2021 Perşembe

Servlet ServletContextListener Arayüzü - Servlet İlk Defa Yüklenirken Çağrılır

Giriş
Eski kodlarda şu satırı dahil ederiz
import javax.servlet.ServletContextListener;
Açıklaması şöyle.
Interface for receiving notification events about ServletContext lifecycle changes.
In order to receive these notification events, the implementation class must be either declared in the deployment descriptor of the web application, annotated with WebListener, or registered via one of the addListener methods defined on ServletContext.
Bu sınıf servlet ilk defa yüklenirken çağrılır. İskeleti şöyle tanımlanır
public class ApplicationContext implements ServletContextListener {

  @Override
  public void contextInitialized(ServletContextEvent servletContextEvent) {
    ...
  }

  @Override
  public void contextDestroyed(ServletContextEvent servletContextEvent) {
    ...
  }
}
Çalışma sırası muhtemelen şöyle.
web.xml okunur -> Servlet Yüklenir -> ServletContextListener çağrılır
contextDestroyed metodu
Örnek
Şöyle yaparız
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class MyServletContextListener implements ServletContextListener {

  @Override
  public void contextInitialized(ServletContextEvent event) {
    System.out.println("context started on "+ event.getServletContext().getContextPath());
  }

  @Override
  public void contextDestroyed(ServletContextEvent event) {
    System.out.println("context destroyed");
  }
}
contextInitialized metodu
Açıklaması şöyle.
Receives notification that the web application initialization process is starting.
Örnek
Yükleme esnasında servlet context'ine nesne eklemek mümkün. Şöyle yaparız.
servletContextEvent.getServletContext().setAttribute("dao",new ClientDaoImpl();
Örnek
Bazı değerleri atamak için şöyle yaparız.
@Override
public void contextInitialized(final ServletContextEvent event)
{
  final String props = "/file.properties";
  final Properties propsFromFile = new Properties();
  try
  {
    propsFromFile.load(getClass().getResourceAsStream(props));
  }
  catch (final IOException e)
  {
    // can't get resource
  }
  for (String prop : propsFromFile.stringPropertyNames())
  {
    if (System.getProperty(prop) == null)
    {
      System.setProperty(prop, propsFromFile.getProperty(prop));
     }
    }
}
Diğer
web.xml Dosyasında Nasıl Tanımlanır?
Şöyle tanımlanır.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="..."
  xmlns:xsi="..."
  xsi:schemaLocation="..."
  version="3.1">

  ...
  <listener>
    <listener-class>com.taxi.service.utils.ApplicationContext</listener-class>
  </listener>
  ...
</web-app>
@WebListener Anotasyonu
Yeni Java Servlet'leri ile xml kullanmaya gerek yok. Sınıfın başına  @WebListener tag'i ekleyerek xml tanımından kurtulmak mümkün. Şöyle yaparız.
@WebListener
public class ReportingScheduler implements ServletContextListener {

  private ScheduledExecutorService scheduler;

  @Override
  public void contextInitialized(ServletContextEvent event) {

    scheduler = Executors.newSingleThreadScheduledExecutor();
    scheduler.scheduleAtFixedRate(new ReportingJob(), 0, 10, TimeUnit.MINUTES);
  }

  @Override
  public void contextDestroyed(ServletContextEvent event) {
    scheduler.shutdownNow();
  }
}


Hiç yorum yok:

Yorum Gönder

Bean Validation @GroupSequence Anotasyonu

Örnek Elimizde şöyle bir kod olsun public class SampleRequest {   @NotNull   LocalDate startDate;   @NotNull   LocalDate endDate;   @AssertT...