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 theServletContext
is initialized (before the web application starts serving requests).contextDestroyed()
: This method is triggered when theServletContext
is 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
ServletContext
object 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
@WebListener
annotation for easy configuration or declare the listener inweb.xml
for 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>