Listener
1、作用
监听某一个事件的发生。 状态的改变。
2、监听器的内部机制
其实就是接口回调.
2.1、监听机制举例
A在执行循环,当循环到5的时候, 通知B。
事先先把一个对象传递给 A , 当A 执行到5的时候,通过这个对象,来调用B中的方法。 但是注意,不是直接传递B的实例,而是传递一个接口的实例过去。
3、小总结
总共有8个 划分成三种类型
使用监听器的步骤:3.1、定义一个类,实现接口。3.2、注册 | 配置监听器
4、第一类监听器
4.1、作用:监听三个作用域创建和销毁
4.2、request ---httpServletRequest
4.2.1、实现类
package com.web.listener01;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("servletrequest 销毁了");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("servletrequest 初始化了");
}
}
4.2.2、web.xml
<listener>
<listener-class>com.web.listener01.MyRequestListener</listener-class>
</listener>
4.2.3、request的创建和销毁
request创建:
访问服务器上的任意资源都会有请求出现。
访问 html: 会
访问 jsp: 会
访问 servlet : 会
request销毁:
服务器已经对这次请求作出了响应。
4.3、session ---httpSession
4.3.1、实现类
package com.web.listener01;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("创建session了");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁session了");
}
}
4.3.2、web.xml
<listener>
<listener-class>com.web.listener01.MySessionListener</listener-class>
</listener>
4.3.3、session的创建和销毁
session的创建
只要调用getSession
html: 不会
jsp: 会 getSession();
servlet: 会
session的销毁
超时 30分钟
非正常关闭 销毁
正常关闭服务器(序列化)
4.4、aapplication --- ServletContext
4.4.1、实现类
package com.web.listener01;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
//初始化的时候调用
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("servletContext 初始化了...");
}
//销毁的时候调用
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("servletContext 销毁了...");
}
}
4.4.2、web.xml
<listener>
<listener-class>com.web.listener01.MyServletContextListener</listener-class>
</listener>
4.4.3、servlet的创建和销毁
servletcontext创建:
1. 启动服务器的时候
servletContext销毁:
1. 关闭服务器. 从服务器移除项目
5、第二类监听器
5.1、作用:监听三个作用域属性状态变更,即可以监听在作用域中值 添加 | 替换 | 移除的动作。
在这里只举一个例子,因为这一类中的三个是极其类似的
5.2、session --- HttpSessionAttributeListener
5.2.1、实现类
package com.web.listener02;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class MyHttpSession02 implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("属性被添加进来了");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("属性被移除了");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("属性被替换了");
}
}
5.2.2、web.xml
<listener>
<listener-class> com.web.listener02.MyHttpSession02</listener-class>
</listener>
5.3.3、用jsp简单测试下
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
session.setAttribute("name", "aobama");
session.setAttribute("name", "zhangsan");
session.removeAttribute("name");
%>
</body>
</html>
5.4、小结
5.4.1、servletContext --- ServletContextAttributeListener
5.4.2、request --- ServletRequestAttributeListener
5.4.3、session --- HttpSessionAttributeListener
6、第三类监听器(转载)
6.1、作用:监听httpSession里面存值的状态变更
这一类监听器不用注册。
-
HttpSessionBindingListener
监听对象与session 绑定和解除绑定 的动作
1. 让javaBean 实现该接口即可 @Override public void valueBound(HttpSessionBindingEvent event) { System.out.println("对象被绑定进来了"); } @Override public void valueUnbound(HttpSessionBindingEvent event) { System.out.println("对象被解除绑定"); }
-
HttpSessionActivationListener
用于监听现在session的值 是 钝化 (序列化)还是活化 (反序列化)的动作
-
钝化 (序列化)
把内存中的数据 存储到硬盘上
-
活化 (反序列化)
把硬盘中的数据读取到内存中。
-
session的钝化活化的用意何在
session中的值可能会很多, 并且我们有很长一段时间不使用这个内存中的值, 那么可以考虑把session的值可以存储到硬盘上【钝化】,等下一次在使用的时候,在从硬盘上提取出来。 【活化】
-
如何让session的在一定时间内钝化.
做配置即可
1. 在tomcat里面 conf/context.xml 里面配置 对所有的运行在这个服务器的项目生效 2. 在conf/Catalina/localhost/context.xml 配置 对 localhost生效。 localhost:8080 3. 在自己的web工程项目中的 META-INF/context.xml 只对当前的工程生效。 maxIdleSwap : 1分钟不用就钝化 directory : 钝化后的那个文件存放的目录位置。 D:\tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\ListenerDemo\itheima <Context> <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"> <Store className="org.apache.catalina.session.FileStore" directory="itheima"/> </Manager> </Context>