监听器
Javaweb来说,Servlet、监听器、过滤器称之为Javaweb的三大组件。
监听器实现了特殊监听接口的类,用来监听作用域与session。
监听器(Listener)
三组:
第一组:监测ServletContxt、request、session的创建和销毁 3个
第二组:监测ServletContxt、request、session作用域值的变化 3个
第三组:监测session与类的关系 2个
第一组:ServletContxt创建与销毁
监听类
非注解配置
注解模式
监听结果:
启动Tomcat服务器时候
关闭Tomcat服务器(右键-stop)
作用:可以操作对应的作用域及相关信息。
第一组:reqeust创建与销毁
理解:request的创建是每次请求都创建。 请求完成就消失。
打印结果
第一组:session创建与销毁
理解:session为服务器对象,当使用的时候才创建。
servlet是通过request.getSession()创建
jsp 访问页面就创建,内置对象就有session。
无论是浏览器访问JSP创建还是直接经过后台创建都是会话对象,而且都具备会话功能。
关闭无法销毁是因为本身session存在超时才执行销毁
停止服务器不执行销毁是因为有活化与钝化操作。
正常销毁:30分钟后
第二组:监测ServletContxt值
第二组:监测request值
多了一个修改是因为默认初始化request 的时候给一个默认值是null;
第二组:监测session值
第三组:监听类是否在session中存在
第三组监听是比较特殊的,不需要单独的设定实现类。 所以直接与类绑定即可。
监听的时机:
只有将绑定的对象放进session或者从session中移除的时候才会进行监听。
重点:只需要在指定的类中实现绑定的监听,不需要使用web.xml配置或者注解标签。
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
/**
- 实体类
- @author IBM
*/
public class Student implements HttpSessionBindingListener{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
@Override
public void valueBound(HttpSessionBindingEvent httpsessionbindingevent) {
String n = httpsessionbindingevent.getName();
Object v = httpsessionbindingevent.getValue();
System.out.println("n :"+n + "v :"+ v);
System.out.println("绑定");
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public void valueUnbound(HttpSessionBindingEvent httpsessionbindingevent) {
System.out.println("解绑");
}
}
===== Servlet测试=====
运行效果
第三组:监听存到session中的类的活化与钝化操作
HttpSessionActivationListener
钝化:工业上讲钝化指的是凝固的意思,在IT中钝化指将活跃在内存中的session中对象持久化到本地叫做钝化。
活化:工业角度理解活化就是将凝固的物体变得松软,IT中指将本地存储的Session信息再次读取到内存中。
存在的意义: 防止意外发生导致内存中数据丢失。
使用方式也同样将这个接口在指定的类中实现,但是需要注意的是因为与本地操作时设计到IO所以必须多实现一个序列化接口。
钝化的条件:
将对象存到session并且停止个服务器。
钝化的路径:tomcat - work …
活化的条件:
钝化后再次启动服务器,tomcat会自动的将SESSIONS.ser文件中的内容读取到内存,并且删除钝化后的文件。
测试:钝化的时候存储一个数据。并且打印SessionID
活化后测试这个数据及SesionID变化。
import java.io.Serializable;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
/**
- 金库
- @author IBM
*/
public class GoldK implements HttpSessionActivationListener,Serializable{
private static final long serialVersionUID = 1L;
private Double money;
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
@Override
public String toString() {
return "GoldK [money=" + money + "]";
}
//活化
@Override
public void sessionDidActivate(HttpSessionEvent httpsessionevent) {
System.out.println("===== 活化到内存 =====");
}
//钝化
@Override
public void sessionWillPassivate(HttpSessionEvent httpsessionevent) {
System.out.println("===== 钝化到本地 =====");
}
}
Servet保存session的代码
第二个servlet测试的代码
测试的打印效果
结论:钝化前和活化后都是一个Session并且值不会发生变化。