Where it Counts

Listing 3. Our page counter application contains two classes. The first, AppAttributeEventDemo, is a listener class.

import javax.servlet.ServletContext;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.
   ServletContextAttributeListener;
import javax.servlet.
   ServletContextAttributeEvent;
import java.io.*;

public class AppAttributeEventDemo 
   implements ServletContextListener, 
   ServletContextAttributeListener {
   
   int counter;
   // if you are working on a Linux/UNIX machine, 
   // change the path accordingly
   String counterFilePath = "C:\\counter.txt";

   public void contextInitialized(
      ServletContextEvent cse) {
      try {
         BufferedReader reader = new 
            BufferedReader(new FileReader(
            counterFilePath));
         counter = Integer.parseInt( 
            reader.readLine() );
         reader.close();
          System.out.println("Reading" + counter);
          
      }
      catch (Exception e) {
          System.out.println(e.toString());
      }

      ServletContext servletContext = 
         cse.getServletContext();

      servletContext.setAttribute("pageCounter", 
         Integer.toString(counter));
      System.out.println(
         "Application initialized");
   }

   public void contextDestroyed(      
      ServletContextEvent cse)    
   {
         System.out.println("Application shut down");
   }

   public void attributeAdded(
      ServletContextAttributeEvent scae) {
      System.out.println(
         "ServletContext attribute added");
   }

   public void attributeRemoved(
      ServletContextAttributeEvent scae) {
      System.out.println(
         "ServletContext attribute removed");
   }

      public void attributeReplaced(
      ServletContextAttributeEvent scae) {
      System.out.println(
         "ServletContext attribute replaced");
      writeCounter(scae);
   }

   synchronized void writeCounter(
      ServletContextAttributeEvent scae) {
      ServletContext servletContext = 
         scae.getServletContext();

      counter = Integer.parseInt((String)
         servletContext.getAttribute("pageCounter"));

      try {
         BufferedWriter writer = new 
            BufferedWriter(new FileWriter(
            counterFilePath));
         writer.write(Integer.toString(counter));
         writer.close();
          System.out.println("Writing");
      }
      catch (Exception e) {
          System.out.println(e.toString());
      }

   }
}