一.监听器定义




二.web监听器的用途

三.创建监听器
- 创建一个实现监听器接口类(
实现的是ServletContextListener -javax.servlet接口
)
package lxf.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class FirstListener implements ServletContextListener {
@Override
//web服务器关闭时候执行销毁方法
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("contextDestroyed");
}
@Override
//web服务器启动时候执行创建初始化方法
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
System.out.println("contextInitialized");
}
}
- 注意:ServletContext是上下文对象,当web应用服务器启动时创建,当web应用服务器关闭时销毁;
- 配置web.xml进行注册
<listener>
<listener-class>lxf.listener.FirstListener</listener-class>
</listener>
四.监听器的启动顺序
- 当web.xml中注册多个监听器,会按着注册的先后顺序启动
- 当web.xml中注册监听器/servlet/过滤器,优先级: 监听器>过滤器>Servlet

五.监听器的分类
-
按着监听对象划分
Paste_Image.png
-
按着监听事件划分
Paste_Image.png
ServletContext
实现的是ServletContextListener -javax.servlet接口
具体代码请查看https://github.com/liangxifeng833/my_program/blob/master/java/jsp/firstListener/src/lxf/listener/ContextListener.java

HttpSession
实现的是HttpSessionListener -javax.servlet接口
具体代码请查看https://github.com/liangxifeng833/my_program/blob/master/java/jsp/firstListener/src/lxf/listener/MyHttpSessionListener.java

ServletRequest监听
实现的是ServletRequestListener -javax.servlet接口
具体代码请查看https://github.com/liangxifeng833/my_program/blob/master/java/jsp/firstListener/src/lxf/listener/MyServletRequestListener.java


具体代码请查看
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener

session钝化是指将内存数据存到硬盘(内存->硬盘)
session活化是指从数据从( 硬盘->内存 )

tomcat中两种sesssion钝化管理器



因为是监听绑定到HttpSession域中的某个对象状态,所以要在具体的实体类中去实现HttpSessionBindingListener和HttpSessionActivationListener,所以也就不需要在web.xml中注册了,以下是对象绑定/解除绑定到session中,以及钝化活化的例子
1.在lxf.entity包下创建User实体类
package lxf.entity;
/*
* 练习监听User对象绑定到HttpSession域中的事件状态
*/
import java.io.Serializable;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent;
//session要活化必须实现Serializable接口
public class User implements HttpSessionBindingListener, HttpSessionActivationListener, Serializable{
private String uName;
private String passWord;
public String getuName() {
return uName;
}
public void setuName(String uName) {
this.uName = uName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
@Override
//将本类实例化后getSession().setAttibute()时触发
public void valueBound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("User对象被绑定session中,key="+arg0.getName());
}
@Override
//将本类实例化后getSession().removeAttibute()时触发
public void valueUnbound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("User对象在session中被解除绑定,key="+arg0.getName());
}
@Override
//session钝化触发(也就是数据从内存 -> 硬盘),也就是session中已setAttribute值后,关闭tomcat会触发
//输出:session钝化org.apache.catalina.session.StandardSessionFacade@58443af6
//同时会在/usr/local/tomcat/work/Catalina/localhost/firstListener中生成SESSION.ser文件
public void sessionWillPassivate(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("session钝化"+arg0.getSource());
}
@Override
//session活化触发(也就是数据从硬盘 ->内存 ),以上关闭tomcat后再启动tomcat会触发,
//输出:session活化org.apache.catalina.session.StandardSessionFacade@689ac6da
//同时/usr/local/tomcat/work/Catalina/localhost/firstListener/SESSION.ser文件销毁
public void sessionDidActivate(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("session活化"+arg0.getSource());
}
}
session钝化活化总结:
1.session钝化(数据从内存 -> 硬盘),也就是session中已setAttribute值后,关闭tomcat后,tomcat会在/usr/local/tomcat/work/Catalina/localhost/firstListener/生成SESSION.ser文件,用服务器系统文件来保存session信息;
2.session活化(数据从硬盘 ->内存 ),以上关闭tomcat后再启动tomcat会,数据从硬盘系统文件/usr/local/tomcat/work/Catalina/localhost/firstListener/SESSION.ser,恢复到内存,并删除该文件;
六.servler3.0下监听器的使用
-
使用servler3.0的前提条件
Paste_Image.png
-
servler3.0下监听器的使用( @WebListener注解的使用,就不需要注册web.xml文件 )
Paste_Image.png
Paste_Image.png
比如:
@WebListener("This is My Servlet 3.0 Lisener")
public class Servlet3WebListener implements ServletContextListener {
网友评论