监听器Listener(一)

什么是监听器

监听器是指对整个Web环境的监听,当被监听的对象发生变化时,立即调用相应的方法进行处理(类似于js事件的触发)

监听器相关概念

  • 事件源:被监听的对象 —– 三个域对象request session servletContext
  • 监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器 —– 6+2
  • 注册监听器:将监听器与事件源进行绑定
  • 响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码 —– 程序员编写的代码

监听器分类

  1. 按监听对象:
    • ServletRequest域
    • HttpSession域
    • ServletContext域
  2. 按监听内容:
    • 监听器对象的创建与销毁
    • 监听域对象的属性变化

根据1与2进行组合 »> 推出共有6种

  ServletContext域 HttpSession域 ServletRequest域
域对象的创建与销毁 ServletContextListener HttpSessionListener ServletRequestListener
域对象属性的变化 ServletContextAttributeListener HttpSessionAttributeListener ServletRequestAttributeListener

监听器的编写流程

  1. 编写监听器实现类,需要实现指定的接口
  2. 在web.xml文件配置监听器(部分监听不需要配置)

域对象的创建和销毁监听器

ServletContext域的创建与销毁

ServletContext域的生命周期

  • 创建:服务器启动创建
  • 销毁:服务器关闭销毁

监听器的编写步骤(重点)

  1. 编写一个监听器类去实现监听器接口
  2. 覆盖监听器的方法
  3. 需要在web.xml中进行配置

注意:在servlet3.0(tomcat7.0以上支持)中无需在web.xml里面配置,在Java文件头添加Annotation

监听的方法

  • 实现监听器接口ServletContextListener
  • 创建时调用contextInitialized(ServletContextEvent sce)方法
  • 摧毁时调用contextDestoryed(ServletContextEvent sce)方法
  • 参数sce:事件源对象»»被监听的对象 sce具有的方法:
    //获取被监听的对象(具体)
    ServletContext servletContext = sce.getServletContext();
    //获取被监听的对象(通用)----可强转为ServletContext
    Object source = sce.getSource();
    ServletContext source = (ServletContext) sce.getSource();
    

主要作用

  1. 初始化工作(初始化对象、初始化数据) —- 加载数据库驱动 连接池的初始化
  2. 任务调度 —- 定时器 (Timer/TimerTask)
public void contextInitialized(ServletContextEvent sce) {
  /* This method is called when the servlet context is
	 initialized(when the Web application is deployed). 
	 You can initialize servlet context related data here.
  */

  //        使用定时器调度进行计息案例(当到达给定时间,每一分钟记一次息)
	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
	Date date = null;
	try {
		date = dateFormat.parse("2018-04-22 17-01-01");
	} catch (ParseException e) {
		e.printStackTrace();
	}
	Timer timer = new Timer();
	timer.schedule(new TimerTask() {
		@Override
		public void run() {
			System.out.println("开始计息");
		}
	}, date,2000);
}

HttpSession域的创建与销毁

生命周期

  • 创建:第一次调用reqeust.getSession
  • 销毁:服务器关闭销毁、session过期、手动销毁 注意:访问Jsp文件若不设置session属性默认调用getSession方法获取session

监听的方法

  • 实现监听器接口HttpSessionListener
  • 创建时调用sessionCreated(HttpSessionEvent sce)方法
  • 摧毁时调用sessionDestroyed(HttpSessionEvent sce)方法
  • 参数sce:事件源对象»»被监听的对象
public void sessionCreated(HttpSessionEvent se) {
	/* Session is created. */
	HttpSession session = se.getSession();
	session.setAttribute("demo","demo");
	System.out.println("Session is created..." + se.getSession().getId());
}

public void sessionDestroyed(HttpSessionEvent se) {
	/* Session is destroyed. */
	System.out.println("Session is destroyed..." + se.getSession().getAttribute("demo"));
}

ServletRequest域的创建与销毁

域对象的属性变化监听器

域对象通用方法

触发添加以及修改属性的监听器方法

setAttribute(name,value)
getAttribute(name)

触发删除属性的监听器方法

removeAttribute(name)

HttpSessionAttributeListener

// -------------------------------------------------------
// HttpSessionAttributeListener implementation
// -------------------------------------------------------

public void attributeAdded(HttpSessionBindingEvent sbe) {
  /* This method is called when an attribute 
	 is added to a session.
  */
}

public void attributeRemoved(HttpSessionBindingEvent sbe) {
  /* This method is called when an attribute
	 is removed from a session.
  */
}

public void attributeReplaced(HttpSessionBindingEvent sbe) {
  /* This method is invoked when an attibute
	 is replaced in a session.
  */
}

ServletContextAttributeListener

与HttpSessionAttributeListener一致

HttpRequestAttributeListener

与HttpRequestAttributeListener一致

JavaBean绑定监听器(HttpSessionBindingListener)

配置以及如何触发

配置

不需要进行web.xml或者Annotation注解配置,其余6个监听器需要配置

触发

当JavaBean对象从Session域中设置获取移除(setAttribute(),removeAttribute())

使用方式

  1. 编写JavaBean对象并且实现HttpSessionBindingListener接口
  2. 为JavaBean对象添加绑定或者解绑的方法

示例

JavaBean

package domain;

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

public class Person implements HttpSessionBindingListener{
    @Override
    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("I have bounded...");
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("I have unbounded...");
    }
}

Servlet

import domain.Person;
import javax.servlet.ServletException;
import java.io.IOException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


@WebServlet(name = "ServletContextListen", urlPatterns = "/ServletContextListen")
public class ServletContextServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        session.setAttribute("demo",new Person());
        session.removeAttribute("demo");
    }
}