Java-Web三大件之监听器Listener
一丶本质:
用于特定用途的servlet,作用是观察变化
二丶功能:
●监听容器事件
●某个web应用上下文的创建销毁
●会话对象的创建销毁
●会话属性信息增减
●通过监听,可以在事件前后进行一些必要的准备和善后工作
●在线人数统计
●定时发送邮件
三丶Listener监听:
四丶Servlet中提供了8个监听器:
1.监听三个域对象的创建和销毁的监听器
对象类型 | 对应的监听器 |
---|---|
ServletContext | ServletContextListener |
HttpSession | HttpSessionListener |
HttpServletRequest | ServletRequestListener |
2.监听三个域对象的属性变更的监听器.(属性添加,属性移除,属性替换)
对象类型 | 对应的监听器 |
---|---|
ServletContext | ServletContextAttributeListener |
HttpServletRequest | ServletRequestAttributeListener |
HttpSession | HttpSessionAttributeListener |
3.监听HttpSession对象中的JavaBean的状态的改变.(绑定,解除绑定,钝化和活化)2个
对象类型 | 对应的监听器 |
---|---|
HttpSession | HttpSessionBindingListener(绑定,解除绑定) |
HttpSession | HttpSessionActivationListener(钝化和活化) |
五丶三类监听接口:
Servlet三个数据域对象:ServletContext,HttpSession,ServletRequest
1.按监听对象分:
- ServletContext对象的监听器
- HttpSession对象的监听器
- ServletRequest对象的监听器
2.按监听事件分:
- 对象自身的创建和销毁的监听器
- 对象中属性的创建和消除的监听器
- session中的某个对象的状态变化的监听器
六丶ServletContext监听:
1.ServletContextListener(监听创建销毁):
方法:
contextInitialized(ServletContextEvent sce) 监听创建contextDestroyed(ServletContextEvent sce) 监听销毁
①在服务器启动时,对一些对象进行初始化,并将对象保存到ServletContext数据范围中; — 全局数据
②对框架进行初始化 ,如Spring框架;
③实现任务调度(通过定时器 Timer、TimerTask 实现)
2.ServletContextAttributeListener(监听属性变更):
每种监听属性变更都有3个方法:
①attributeAdded 监听属性添加:
当数据范围对象没有该属性,第一次添加时调用执行 setAttribute(name,value);
②attributeRemoved 监听属性移除:
从一个数据范围对象删除一个已经存在属性时执行 removeAttribute(name);
③attributeReplaced 监听属性替换:
当一个数据范围已经存在一个属性,向数据范围添加相同名称的属性时,触发替换方法 — setAttribute(name,value);
七丶Session Listeners:
1.HttpSessionListener(监听创建销毁):
对HttpSession 数据对象创建和销毁的监听;
方法:
①sessionCreated(HttpSessionEvent se) 监听Session对象创建
②sessionDestroyed(HttpSessionEvent se) 监听Session对象销毁
Session 何时创建 : request.getSession()
Session 何时销毁(三种方式) :
关闭服务器、Session过期(默认30分钟,可通过web.xml配置)、session.invalidate
2.HttpSessionAttributeListener(监听属性变化):
每种监听属性变更都有3个方法:
①attributeAdded 监听属性添加:
当数据范围对象没有该属性,第一次添加时调用执行 setAttribute(name,value);
②attributeRemoved 监听属性移除:
从一个数据范围对象删除一个已经存在属性时执行 removeAttribute(name);
③attributeReplaced 监听属性替换:
当一个数据范围已经存在一个属性,向数据范围添加相同名称的属性时,触发替换方法 — setAttribute(name,value);
3.Session中数据对象本身状态监听器(Binding,Activation):
部分监听器不需要在 web.xml 中进行配置,因为状态监听器是由保存到session数据域中的对象本身去实现的,即由保存到session数据域中的对象的java类去实现监听器接口。
对象的四种状态:绑定/解除绑定; 钝化/活化
监听器接口:
①HttpSessionBindingListener:
valueBound(HttpSessionBindingEvent event) 绑定对象方法
valueUnbound(HttpSessionBindingEvent event) 解除绑定方法
②HttpSessionActivationListener:
sessionDidActivate(HttpSessionEvent se) 感知对象被活化
sessionWillPassivate(HttpSessionEvent se) 感知对象被钝化
八丶Servlet Request Listeners:
1.ServletRequestListener(监听创建销毁):
监听HttpServletRequest 对象的创建和销毁
方法:
①requestInitialized(ServletRequestEvent sre) 监听request对象创建
②requestDestroyed(ServletRequestEvent sre) 监听request对象销毁
2.ServletRequestAttributeListener(监听属性变更):
每种监听属性变更都有3个方法:
①attributeAdded 监听属性添加:
当数据范围对象没有该属性,第一次添加时调用执行 setAttribute(name,value);
②attributeRemoved 监听属性移除:
从一个数据范围对象删除一个已经存在属性时执行 removeAttribute(name);
③attributeReplaced 监听属性替换:
当一个数据范围已经存在一个属性,向数据范围添加相同名称的属性时,触发替换方法 — setAttribute(name,value);
九丶配置监听器
1.web.xml:
<!--对ServletContextListener监听器进行注册实例-->
<!--因为监听器执行不由用户访问,因此不用配置url路径-->
<listener>
<!--listener-class中路径为:包路径.类名-->
<listener-class>servlet.listener.MyServletContextListener</listener-class>
</listener>
2.注释:
@WebListener
public class SessionListener implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("创建了session对象:"+se.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁了session对象:"+se.getSession().getId());
}