Home | Download | PDF | API | FAQ | Search | Feedback | History

> ## 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.
> 2. Invokes the `service` method, passing request and response objects. Service methods are discussed in Writing Service Methods.

> 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.

> ### 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 and specify the listener class.

> #### Defining the Listener Class

> You define a listener class as an implementation of a listener interface. Table 3-2 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`.

> Table 3-2 Servlet Life-Cycle Events
> Object | Event | Listener Interface and Event Class
> --- | --- | ---
> Web context (see Accessing the Web Context) | Initialization and destruction | `javax.servlet. ServletContextListener` and `ServletContextEvent`
> Attribute added, removed, or replaced | `javax.servlet. ServletContextAttributeListener` and `ServletContextAttributeEvent`
> Session (See Maintaining Client State) | Creation, invalidation, activation, passivation, and timeout | `javax.servlet.http. HttpSessionListener`, `javax.servlet.http. HttpSessionActivationListener`, and `HttpSessionEvent`
> Attribute added, removed, or replaced | `javax.servlet.http. HttpSessionAttributeListener` and `HttpSessionBindingEvent`
> Request | A servlet request has started being processed by web components | `javax.servlet. ServletRequestListener` and `ServletRequestEvent`
> Attribute added, removed, or replaced | `javax.servlet. ServletRequestAttributeListener` and `ServletRequestAttributeEvent`

> The `listeners.ContextListener` class creates and removes the database access 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.BookDBAO;
>     import javax.servlet.*;
>     import util.Counter;

>     import javax.ejb.*;
>     import javax.persistence.*;

>     public final class ContextListener
>       implements ServletContextListener {
>       private ServletContext context = null;

>       @PersistenceUnit
>       EntityManagerFactory emf;

>       public void contextInitialized(ServletContextEvent event) {
>         context = event.getServletContext();
>         try {
>           BookDBAO bookDB = new BookDBAO(emf);
>           context.setAttribute("bookDB", bookDB);
>         } catch (Exception ex) {
>           System.out.println(
>             "Couldn't create database: " + ex.getMessage());
>         }
>         Counter counter = new Counter();
>         context.setAttribute("hitCounter", counter);
>         counter = new Counter();
>         context.setAttribute("orderCounter", counter);
>       }

>       public void contextDestroyed(ServletContextEvent event) {
>         context = event.getServletContext();
>         BookDBAO bookDB = context.getAttribute("bookDB");
>         bookDB.remove();
>         context.removeAttribute("bookDB");
>         context.removeAttribute("hitCounter");
>         context.removeAttribute("orderCounter");
>       }
>     }

> #### Specifying Event Listener Classes

> You specify an event listener class using the listener element of the deployment descriptor. Review The Example Servlets for information on how to specify the `ContextListener` listener class.

> ### Handling Errors

> Any number of exceptions can occur when a servlet is executed. When an exception occurs, the web container will generate a default page containing the message

>     A Servlet Exception Has Occurred

> But you can also specify that the container should return a specific error page for a given exception. Review the deployment descriptor file included with the example to learn how to map the exceptions `exception.BookNotFound`, `exception.BooksNotFound`, and `exception.OrderException` returned by the Duke's Bookstore application to `errorpage.html`.