In Jakarta EE (formerly Java EE), you can use listeners like ServletContextListener to manage the lifecycle of a web application’s ServletContext. It provides hooks to execute logic during the initialization and destruction stages of the application. This can be useful for resource initialization, cleanup, or logging purposes.
Here’s how you can use ServletContextListener:
1. Implementing ServletContextListener
Create a class that implements the ServletContextListener interface. There are two main methods you can override:
contextInitialized(): This method is triggered when theServletContextis initialized (before the web application starts serving requests).contextDestroyed(): This method is triggered when theServletContextis about to be destroyed (e.g., when the server shuts down or the application is undeployed).
Example
package org.kodejava.servlet; import jakarta.servlet.ServletContextEvent; import jakarta.servlet.ServletContextListener; import jakarta.servlet.annotation.WebListener; @WebListener public class AppLifecycleListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { // Code to execute during application startup System.out.println("Web application starting up..."); // Example: Initialize resources, setup logging, load configuration, etc. } @Override public void contextDestroyed(ServletContextEvent sce) { // Code to execute during application shutdown System.out.println("Web application shutting down..."); // Example: Release resources, close connections, etc. } } 2. Registering the Listener
There are two ways to associate the listener with your web application:
a) Using the @WebListener Annotation
The simplest way is to annotate the class with @WebListener. This automatically registers the listener in your application without requiring any additional configuration.
@WebListener public class AppLifecycleListener implements ServletContextListener { // Implementation as shown previously } b) Declaring in web.xml
Alternatively, you can declare the listener in the web.xml deployment descriptor:
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" version="6.0"> <listener> <listener-class>com.example.AppLifecycleListener</listener-class> </listener> </web-app> 3. Common Use Cases
Here are a few common scenarios where you might use ServletContextListener:
- Loading Configuration Files: Load configuration settings from a file or database when the application starts.
@Override public void contextInitialized(ServletContextEvent sce) { ServletContext context = sce.getServletContext(); context.setAttribute("config", "some config value or object"); } - Resource Initialization and Cleanup: Initialize shared resources (e.g., database connections, thread pools) in
contextInitialized()and close them incontextDestroyed().@Override public void contextInitialized(ServletContextEvent sce) { System.out.println("Initializing database connection..."); // Initialize DB connection pool } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("Closing database connection..."); // Close DB connection pool } - Setting Context Attributes: Use
ServletContextobject to set attributes accessible by the entire application.sce.getServletContext().setAttribute("appName", "My Application"); - Third-Party Integrations: Initialize third-party libraries or services during startup and dispose of them during shutdown.
Key Points to Remember
- The
contextInitialized()method is invoked before the application starts serving requests. - The
contextDestroyed()method ensures proper cleanup when the application is shutting down. - Use the
@WebListenerannotation for easy configuration or declare the listener inweb.xmlfor manual control. - Avoid long-running or blocking operations inside lifecycle methods as it might delay the application startup or shutdown process.
By efficiently using ServletContextListener, you can centralize important application lifecycle tasks and manage resources effectively.
Maven dependencies
<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.1.0</version> <scope>provided</scope> </dependency> 