监听器
1)监听什么(对象)
PageContext Request sessionApplication
各自一个监听器
Request:ServletRequestListener
session:HttpSessionListener
Application:ServletContextListener
在servlet容器启动时自动创建
监听事件onClick()
2)监听对象的创建和销毁
http://localhost:8080/session.jsp
在浏览器输入网址,其中包括以下操作:
浏览器发出一次请求(创建request对象),服务端给每一个客户端创建一个session(保存客户的信息),没有请求转发或者重定向。request结束(销毁request)
监听ServletRequest,创建ServletRequest对象...javax.servlet.ServletRequestEvent[source=org.apache.catalina.core.ApplicationContextFacade@56fa318a]
监听HttpSession,创建HttpSession对象....javax.servlet.http.HttpSessionEvent[source=org.apache.catalina.session.StandardSessionFacade@3c39d611]
监听ServletRequest,销毁ServletRequest对象...javax.servlet.ServletRequestEvent[source=org.apache.catalina.core.ApplicationContextFacade@56fa318a]
当容器关闭时,销毁ServletContext
3)监听对象中属性的变更
实现以下三个接口
ServletRequestAttributeListener
HttpSessionAttributeListener
ServletContextAttributeListener
<%
//ServletContext的对象就是一个application
//增加一个属性
application.setAttribute("name","zhangsan");
//替换
application.setAttribute("name","lisi");
//删除
application.removeAttribute("name");
request.setAttribute("user","001");
request.setAttribute("user","666");
request.removeAttribute("user");
session.setAttribute("hobby","play basketball");
session.setAttribute("hobby","play football");
session.removeAttribute("hobby");
%>
4)监听session对象的状态(四种)
不需要配置web.xml
绑定
解绑
HttpSessionBindingListener
package student.listener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class BeanListener implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("绑定" + this + ",sessionId:" + httpSessionBindingEvent.getSession().getId());
}
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
//this是解绑的对象
System.out.println("解绑"+this+"sessionId:"+httpSessionBindingEvent.getSession().getId());
}
}
钝化
活化
HttpSessionActivationListener
package student.listener;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import java.io.Serializable;
//监听该对象的钝化和活化
public class BeanListener2 implements HttpSessionActivationListener,Serializable {
//准备钝化和活化的数据
private int num;
private String user;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
//监听时刻:即将钝化之前
@Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
System.out.println("BeanListener2会随着session的钝化而钝化");
System.out.println("即将钝化之前");
}
//监听时刻:刚刚进行活化之后
@Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
System.out.println("BeanListener2会随着session的活化而活化");
System.out.println("活化之后(活化的对象是session)");
}
}
5)如何钝化,活化?
配置context.xml
钝化与活化的实际执行是通过tomcat安装目录中conf目录下conten.xml文件中的配置而实现的
PersistentManager:通过该类实现具体的钝化操作
maxIdelSwap:最大空闲时间
FileStore:通过该类实现具体的活化操作
directory:钝化到该文件,从该文件实现活化操作
<Manager className="org.apache.catalina.session.PersistentManager" maxIdelSwap="5">
<Store className="org.apache.catalina.session.FileStore" directory="D:\test_session"/>
</Manager>