什么是监听器
监听器是指对整个Web环境的监听,当被监听的对象发生变化时,立即调用相应的方法进行处理(类似于js事件的触发)
监听器相关概念
- 事件源:被监听的对象 —– 三个域对象request session servletContext
- 监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器 —– 6+2
- 注册监听器:将监听器与事件源进行绑定
- 响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码 —– 程序员编写的代码
监听器分类
- 按监听对象:
- ServletRequest域
- HttpSession域
- ServletContext域
- 按监听内容:
- 监听器对象的创建与销毁
- 监听域对象的属性变化
根据1与2进行组合 »> 推出共有6种
| ServletContext域 | HttpSession域 | ServletRequest域 | |
|---|---|---|---|
| 域对象的创建与销毁 | ServletContextListener | HttpSessionListener | ServletRequestListener |
| 域对象属性的变化 | ServletContextAttributeListener | HttpSessionAttributeListener | ServletRequestAttributeListener |
监听器的编写流程
- 编写监听器实现类,需要实现指定的接口
- 在web.xml文件配置监听器(部分监听不需要配置)
域对象的创建和销毁监听器
ServletContext域的创建与销毁
ServletContext域的生命周期
- 创建:服务器启动创建
- 销毁:服务器关闭销毁
监听器的编写步骤(重点)
- 编写一个监听器类去实现监听器接口
- 覆盖监听器的方法
- 需要在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();
主要作用
- 初始化工作(初始化对象、初始化数据) —- 加载数据库驱动 连接池的初始化
- 任务调度 —- 定时器 (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())
使用方式
- 编写JavaBean对象并且实现HttpSessionBindingListener接口
- 为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");
}
}