sessionlistener.java

来自「JAVA Servlet2.3外文书籍源码」· Java 代码 · 共 143 行

JAVA
143
字号
package persistence.requester;

import java.sql.*;
import java.util.*;
import javax.naming.InitialContext;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.sql.DataSource;

public class SessionListener implements HttpSessionListener,
  ServletContextListener, HttpSessionAttributeListener {

  /** The DataSource object */
  private DataSource ds;

  /** The servlet context with which we are associated */
  private ServletContext context;

  /** A hash table that stores reference to Requester objects */
  private Hashtable sessions;

  public void attributeAdded(HttpSessionBindingEvent event) {
    if (event.getValue() instanceof Requester &&
        event.getName().equals(Requester.KEY)) {
      sessions.put(event.getSession().getId(), event.getValue());
    }
  }

  public void attributeRemoved(HttpSessionBindingEvent event) {}

  public void attributeReplaced(HttpSessionBindingEvent event) {}

  public void contextInitialized(ServletContextEvent event) {
    context = event.getServletContext();
    sessions = new Hashtable();
  }

  public void contextDestroyed(ServletContextEvent event) {
    context = null;
    sessions = null;
  }

  public void sessionCreated(HttpSessionEvent event) {
    // Obtain a data source, if one has
    // not already been obtained.
    if (ds == null) {
      ServletContext context = event.getSession().getServletContext();
      try {
        InitialContext ctx = new InitialContext();
        ds = (DataSource) ctx.lookup(context.getInitParameter("DataSourceConfig"));
      } catch (Throwable t) {
        log(t);
      }
    }
  }

  public void sessionDestroyed(HttpSessionEvent event) {

    System.out.println("sessionDestroyed()");

    Connection conn = null;
    PreparedStatement pstmt_requesters = null;
    Statement stm = null;
    PreparedStatement pstmt_requests = null;
    
    //CallableStatement cstmt = null;

    String sessionID = event.getSession().getId();
    Requester req = (Requester) sessions.get(sessionID);
    if (req != null) {
      try {
        System.out.println("Initialize database resources.");
        conn = ds.getConnection();

        pstmt_requesters = conn.prepareStatement("INSERT INTO requesters (" +
                                       "remote_host, user_agent) " + 
                                       "VALUES (?,?)");

        pstmt_requesters.setString(1, req.getRemoteHost());
        pstmt_requesters.setString(2, req.getUserAgent());
        pstmt_requesters.execute();

        System.out.println("Get the ID of the last entry");

        stm = conn.createStatement();
        ResultSet rset = stm.executeQuery("SELECT requester_id FROM requesters ORDER BY requester_id DESC");
        rset.first();
        int lastID = rset.getInt(1);
        System.out.println("LAST ID: " + lastID);
        
        pstmt_requests = conn.prepareStatement("INSERT into requests (" + 
                                       "requester_id, hitdate, uri) " + 
                                       "VALUES (?,?,?)");

        for (Enumeration e = req.getRequests(); e.hasMoreElements(); ) {
            System.out.println("request...");
            pstmt_requests.setInt(1, lastID);
            pstmt_requests.setDate(2, (new java.sql.Date((new java.util.Date()).getTime())));
            pstmt_requests.setString(3, (String) e.nextElement());
            pstmt_requests.execute();
        }

      } catch (Throwable t) {
        if (conn != null) {
          try {
            conn.rollback();
          } catch (SQLException ignored) {}
        }
        
        log(t);

      // Make sure all resources are shut down.
      } finally {
        if (conn != null) {
          try {
            conn.close();
          } catch (SQLException ignored) {}
        }
        /*if (pstmt != null) {
          try {
            pstmt.close();
          } catch (SQLException ignored) {}
        }*/
        /*if (cstmt != null) {
          try {
            cstmt.close();
          } catch (SQLException ignored) {}
        }*/
      }
    }

    // Remove the Requester object.
    sessions.remove(sessionID);
  }

  private void log(Throwable t) {
    if (context != null) {
      context.log("SessionListener", t);
    } else {
      t.printStackTrace(System.out);
    }
  }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?