Servlet Life Cycle



Servlet Life Cycle

The life cycle of a servlet is controlled by the container in which the servlet has been deployed. When a request is mapped to a servlet, the container performs the following steps.

  1. If an instance of the servlet does not exist, the Web container:

    1. Loads the servlet class

    2. Creates an instance of the servlet class

    3. Initializes the servlet instance by calling the init method. Initialization is covered in Initializing a Servlet (page 377).

  2. Invokes the service method, passing a request and response object. Service methods are discussed in Writing Service Methods (page 377).

If the container needs to remove the servlet, it finalizes the servlet by calling the servlet's destroy method. Finalization is discussed in Finalizing a Servlet (page 396).

1 Handling Servlet Life Cycle Events

You can monitor and react to events in a servlet's life cycle by defining listener objects whose methods get invoked when life cycle events occur. To use these listener objects you must

  • Define the listener class

  • Specify the listener class

Defining The Listener Class

You define a listener class as an implementation of a listener interface. Figure lists the events that can be monitored and the corresponding interface that must be implemented. When a listener method is invoked it is passed an event that contains information appropriate to the event. For example, the methods in the HttpSessionListener interface are passed an HttpSessionEvent, which contains an HttpSession.

The listeners.ContextListener class creates and removes the database helper and counter objects used in the Duke's Bookstore application. The methods retrieve the Web context object from ServletContextEvent and then store (and remove) the objects as servlet context attributes.


import database.BookDB; 
import javax.servlet.*; 
import util.Counter; 

public final class ContextListener 
    implements ServletContextListener {
    private ServletContext context = null; 
    public void contextInitialized(ServletContextEvent event) {
        context = event.getServletContext(); 
        try {
            BookDB bookDB = new BookDB(); 
            context.setAttribute("bookDB", bookDB);

Servlet Life Cycle Events

Object

Event

Listener Interface and Event Class

Web context (See Accessing the Web Context (page 392))

Initialization and destruction

javax.servlet.ServletContextListener and

ServletContextEvent

Attribute added, removed, or replaced

javax.servlet.ServletContextAttributeListener and

ServletContextAttributeEvent

Session (See Maintaining Client State (page 393))

Creation, invalidation, and timeout

javax.servlet.http.HttpSessionListener and

HttpSessionEvent

Attribute added, removed, or replaced

javax.servlet.http.HttpSessionAttributeListener and

HttpSessionBindingEvent


        } catch (Exception ex) {
            System.out.println(
                "Couldn't create database: " 
                + ex.getMessage()); 
        } 
        Counter counter = new Counter(); 
        context.setAttribute("hitCounter", counter); 
        context.log("Created hitCounter" 
            + counter.getCounter()); 
        counter = new Counter(); 
        context.setAttribute("orderCounter", counter); 
        context.log("Created orderCounter" 
             + counter.getCounter()); 
    } 

    public void contextDestroyed(ServletContextEvent event) {
        context = event.getServletContext(); 
        BookDB bookDB = context.getAttribute(
            "bookDB"); 
        bookDB.remove(); 
        context.removeAttribute("bookDB"); 
        context.removeAttribute("hitCounter"); 
        context.removeAttribute("orderCounter"); 
    } 
}
Specifying Event Listener Classes

To specify an event listener class, you add a listener element to the Web application deployment descriptor. Here is the listener element for the Duke's Bookstore application:


<listener> 
    <listener-class>listeners.ContextListener</listener-class> 
</listener>

2 Handling Errors

Any number of exceptions can occur when a servlet is executed. The Web container will generate a default page containing the message A Servlet Exception Has Occurredwhen an exception occurs, but you can also specify that the container should return a specific error page for a given exception. To specify such a page, you add an error-page element to the Web application deployment descriptor. These elements map the exceptions returned by the Duke's Bookstore application to errorpage.html:


<error-page> 
    <exception-type>exception.BookNotFoundException</exception-type> 
    <location>/errorpage.html</location> 
</error-page> 
<error-page> 
    <exception-type>exception.BooksNotFoundException</exception-
type> 
    <location>/errorpage.html</location> 
</error-page> 
<error-page> 
    <exception-type>exception.OrderException</exception-type> 
    <location>/errorpage.html</location> 
</error-page>