二、HttpSessionListener

一、HttpSessionListener

在WEB应用中,当一个session被创建或者销毁时启用这个监听器。
关键点:
1、sessionCreated(HttpSessionEvent event):客户端第一次和服务器交互的时候触发
2、sessionDestroyed(HttpSessionEvent event):销毁会话的时候触发
3、必须在web.xml中配置监听器
4、监听范围:设置一次就可以监听所有session

二、实例:获取当前在线人数

实体类User:

package cn.kgc.pojo;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;


public class User{
    private int id;
    private String userName;
    private String password;
    private String email;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    
    

}

监听器:

package cn.kgc.web.listener;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

// 监听当前页面访问人数的监听器
public class UserCountListener implements HttpSessionListener {

    // 当浏览器访问服务器的时候,会话开启时会自动进入
    public void sessionCreated(HttpSessionEvent event) {
        // 获取ServletContext对象,类似于之前的application
        // 是一个所有用户共享的数据,访问人数(userCount)可以放到这里面
        ServletContext ctx = event.getSession().getServletContext();
        Integer userCount = (Integer) ctx.getAttribute("userCount");
        if (userCount == null) {
            userCount = 1;
        } else {
            userCount++;
        }
        // 将最新的用户访问人数重新放回到ServletContext里面
        ctx.setAttribute("userCount", userCount);
        System.out.println("******session创建,进入sessionCreated*********");
    }

    // 当session销毁时自动进入
    public void sessionDestroyed(HttpSessionEvent event) {
        // 获取ServletContext对象,类似于之前的application
        // 是一个所有用户共享的数据,访问人数(userCount)可以放到这里面
        ServletContext ctx = event.getSession().getServletContext();
        Integer userCount = (Integer) ctx.getAttribute("userCount");
        if (userCount == null) {
            userCount = 0;
        } else {
            userCount--;
        }
        // 将最新的用户访问人数重新放回到ServletContext里面
        ctx.setAttribute("userCount", userCount);
        System.out.println("******session销毁,启动sessionDestroyed*********");
    }

}

web.xml配置:



   
  
    index.jsp
  
  
    cn.kgc.web.listener.UserCountListener
  

前台页面代码:
登录页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>



  
    
    
    My JSP 'login.jsp' starting page
    
    
    
        
    
    
    

  
  
  
    
用户名:

登录数据处理页面:

<%@page import="cn.kgc.pojo.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>



  
    
    
    My JSP 'doLogin.jsp' starting page
    
    
    
        
    
    
    

  
  
  
   <%
        String userName = request.getParameter("userName");
        if (userName == null || userName.equals("")) {
            response.sendRedirect("login.jsp");
        } else {
            User user = new User();
            user.setUserName(userName);
            // 走到这一步的时候监听器就会启动了
            session.setAttribute("user", user);
            response.sendRedirect("online.jsp");
        }
    %>
  

online页面:

<%@page import="cn.kgc.pojo.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>



  
    
    
    My JSP 'online.jsp' starting page
    
    
    
        
    
    
    

  
  
  
  <%
      User user = null;
      if (session.getAttribute("user") == null) {
        response.sendRedirect("login.jsp");
      } else {
       user = (User)session.getAttribute("user");
   %>
          欢迎你,<%=user.getUserName() %>
          <%Object userCount = session.getServletContext().getAttribute("userCount"); %>
          当前在线人数为:<%=userCount.toString() %>
          离开
    <%} %>
  

退出页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>



  
    
    
    My JSP 'loginout.jsp' starting page
    
    
    
        
    
    
    

  
  
  
    <%
        // 离开、注销
        session.invalidate();
     %>
  

注:
1、这个项目是在上一节的项目的基础上进行修改。
2、这里用来记录当前在线人数的变量是公共变量,即所有会话都能访问的变量,但是这里并不是application,而是ServletContext 对象。
3、在监听器类里面,监听的方法的执行时机是用户开始访问登录界面的时候:即只要用户打开登录界面,sessionCreated方法就会启动。

三、小结

HttpSessionBindingListener与HttpSessionListener的不同之处:
1、第一个监听器不需要设置配置文件,并且监听的一定是实现了这个接口的对象。而第二种首先要配置xml文件,监听的范围是可以监听所有session。
2、感觉第二个的监听范围比第一个大,第二个是session一创建就被监听,第一个是只有当使用了user对象的时候才被监听。

你可能感兴趣的:(二、HttpSessionListener)