Listener监听器
监听器介绍
1. 什么是监听器
Javaweb中的监听器是用于监听web常见对象HttpServletRequest,HttpSession,ServletContext
2.监听器的作用
1) 监听web对象创建与销毁.
2) 监听web对象的属性变化
3) 监听session绑定javaBean操作.
3.监听机制相关概念
1.事件----一件事情
2.事件源---产生这件事情的源头
3.注册监听---将监听器与事件绑定,当事件产生时,监听器可以知道,并进行处理。
4.监听器---对某件事情进行处理监听的一个对象
web监听器介绍
1.javaweb监听器介绍
1.监听web对象创建与销毁的监听器
ServletContextListener
HttpSessionListener
ServletRequestListener
2.监听web对象属性变化
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener
3.监听session绑定javaBean
HttpSessionBindingListener
HttpSessionActivationListener
2. javaweb监听器创建步骤
Ø 创建一个类,实现指定的监听器接口
Ø 重写接口中的方法.
Ø 在web.xml文件中配置监听
演示监听对象创建与销毁
1.ServletContext对象的创建与销毁监听
Ø ServletContext对象的创建与销毁分析
ServletContext对象是服务器开启时创建。服务器关闭时销毁。
Ø 监听ServletContext对象的创建与销毁
2.HttpSession对象的创建与销毁监听
Ø 1.HttpSession对象的创建与销毁分析
session对象创建:取决于请求中是否有jsessinid,如果有,可能会获取一个已经存在的session对象。如果没有,会创建一个新的session对象.
销毁session:
1.默认超时 30分钟
2.关闭服务器
3.invalidate()方法
4.setMaxInactiveInterval(intinterval) 可以设置超时时间
Ø 2.监听HttpSession对象的创建与销毁
3.HttpServletRequest对象的创建与销毁监听
Ø 1.HttpServletRequest对象的创建与销毁分析
request对象是发送请求时创建,当响应产生时,销毁.
Ø 2.监听HttpServletRequest对象的创建与销毁
演示监听属性变化
1.javaweb中监听属性变化API介绍
ServletContextAttributeListener(下面是常用三个方法,void为返回值)
void attributeAdded(ServletContextAttributeEventscab)
void attributeRemoved(ServletContextAttributeEventscab)
void attributeReplaced(ServletContextAttributeEvent scab)
HttpSessionAttributeListener
void attributeAdded(HttpSessionBingdingEventse)
void attributeRemoved(HttpSessionBingdingEventse)
void attributeReplaced(HttpSessionBingdingEvent se)
ServletRequestAttributeListener
void attributeAdded(ServletRequestAttributeEventsrae)
void attributeRemoved(ServletRequestAttributeEventsrae)
void attributeReplaced(ServletRequestAttributeEvent srae)
3. 演示监听session中属性变化
演示监听session绑定javaBean(未讲到)
1.HttpSessionBindingListener监听器功能介绍
使javaBean对象在被绑定到会话或从会话中取消对它的绑定时得到通知
2.HttpSessionActivationListener监听器功能介绍
绑定到会话的对象可以侦听通知它们会话将被钝化和会话将被激活的容器事件
3.注意事项
这两个监听器比较特殊,它是由javaBean来实现的,并且不需要在web.xml文件中注册监听.
javaBean必须是序列化的.
4.演示HttpSessionBindingListener功能
javaBean自动感知绑定到session中以及从session中移除.
public voidvalueBound(HttpSessionBindingEvent event) {
System.out.println("绑定了user对象到了session");
}
public voidvalueUnbound(HttpSessionBindingEvent event) {
System.out.println("从session中移除了user对象");
}
5.演示HttpSessionActivationListener功能
1.bean1.jsp中向session存储一个user对象
2.bean2.jsp中从session中获取user对象的name属性
3.User类实现接口HttpSessionActivationListener,可以监听到活化与钝化操作
4.做一个配置文件,来设定当活化与钝化操作时文件的位置.
在meta-inf目录下创建一个context.xml文件
<Context>
<ManagerclassName="org.apache.catalina.session.PersistentManager"maxIdleSwap="1">
<StoreclassName="org.apache.catalina.session.FileStore"directory="it315"/>
</Manager>
</Context>
监听器案例--定时销毁过期session分析
1.功能描述
案例:如果session对象超过15秒没有使用就销毁。
public class MyListener3 implements ServletContextListener ,HttpSessionListener{
@Override
public void contextInitialized(ServletContextEventservletContextEvent) {
//创建一个存放session的集合
List<HttpSession> sessions = new ArrayList<>();
//利用Context全局参数设置一个sessions属性
servletContextEvent.getServletContext().setAttribute("sessions",sessions);
//创建一个定时器
Timer timer = new Timer();
//给定时器添加一个定时操作和延迟时间,及每隔多少时间执行一次
timer.schedule(new TimerTask() {
@Override
public void run() {
Iterator<HttpSession> iterator = sessions.iterator();
while (iterator.hasNext()){
HttpSession session =iterator.next();
long lastAccessedTime= session.getLastAccessedTime();
long timeMillis =System.currentTimeMillis();
//判断session创建后的时间到目前为止是否超过了15秒
boolean flag =(timeMillis-lastAccessedTime)>15000;
if(flag){
//session的创建超过15秒就销毁session
iterator.remove();
session.invalidate();
}else{
System.out.println("先放过你...");
}
}
}
},15000,15000);
}
@Override
public void contextDestroyed(ServletContextEventservletContextEvent) {
}
@Override
public void sessionCreated(HttpSessionEventhttpSessionEvent) {
System.out.println("MyListener3.sessionCreated 创建了,不过只能存活15秒");
//当察觉创建了一个新的session的时候,获取到这个session
HttpSession sessionNew= httpSessionEvent.getSession();
ServletContext servletContext =sessionNew.getServletContext();
//将Context中的sessions全局数据重新获取一遍
List<HttpSession> sessions =(List<HttpSession>); servletContext.getAttribute("sessions");
//将新的session放入到sessions中
sessions.add(sessionNew);
servletContext.setAttribute("sessions",sessions);
}
@Override
public void sessionDestroyed(HttpSessionEventhttpSessionEvent) {
System.out.println("MyListener3.sessionDestroyed 因为15秒没用 所以销毁喽");
}
}