文章目录
监听器 Listener
1. 监听器简述
在实际生活着,我们很多商场有摄像头,监视着客户的一举一动。如果客户有违法行为,商场可以采取相应的措施。同样,在我们的java程序中,有时也需要监视某些事情,一旦被监视的对象发生相应的变化,我们应该采取相应的操作。这就需要用到java中的监听器。
web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如:ServletContext,HttpSession,ServletRequest的创建和销毁等。可以在某些动作前后增加处理,实现监控。
2.监听器创建
2.1 方法1:新建Listener
2.2 方法2:新建class,实现需要的监听器接口,并实现方法。手动添加@WebListener注解
3. 常用监听器
3.1 第一类:监听 “域对象” 创建 和 销毁
3.1.1 ServletContextListener
监听ServletContext域对象的创建和销毁:
创建:服务器开启
销毁:服务器关闭
@WebListener
public class MyServletContextListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent sce) {
// contextServlet域对象 销毁
System.out.println("ContextServlet对象销毁了。。。");
}
public void contextInitialized(ServletContextEvent sce) {
// contextServlet域对象 初始化
System.out.println("ContextServlet对象初始化。。。");
}
}
3.1.2 HttpSessionListener
监听HttpSession域对象的创建和销毁
创建:第一次执行req.getSession()
销毁: 执行 session.invalidate();或过期后自动销毁。
@WebListener
public class MyHttpSessionListener implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("某个Session对象被创建了。。。");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("某个Session对象销毁了。。。");
}
}
测试:servlet代码:
HttpSession session = request.getSession();
session.invalidate();
3.1.3 ServletRequestListener
监听HttpServeltRequest的创建和销毁:
创建:请求过来时
销毁:响应结束后
@WebListener
public class MyRequestListener implements ServletRequestListener {
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("request对象被销毁了");
}
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request对象被创建了");
}
}
3.2 第二类:监听 “域对象属性” 创建、修改、删除
3.2.1 ServletContextAttributeListener
监听ServletContext域对象中的属性变更
@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener{
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("ServletContext域对象中属性 添加");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println("ServletContext域对象中属性 删除");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println("ServletContext域对象中属性 修改");
}
}
测试:servlet代码:
ServletContext context = req.getServletContext();
context.setAttribute("NAME", "jack");// context添加属性
context.setAttribute("NAME", "tom");// context修改属性
context.removeAttribute("NAME");// context删除属性
3.2.2 HttpSessionAttributeListener
监听HttpSession域对象中的属性变更
@WebListener
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("HttpSession属性 添加");
}
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("HttpSession属性 删除");
}
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("HttpSession属性 修改");
}
}
测试:Servlet代码
HttpSession session = req.getSession();// 创建
session.setAttribute("NAME", "jack");// session添加属性
session.setAttribute("NAME", "tom");// session修改属性
session.removeAttribute("NAME");// session删除属性
session.invalidate();//销毁
3.2.3 ServletRequestAttributeListener
监听HttpServletRequest域对象中的属性变更
@WebListener
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {
public void attributeRemoved(ServletRequestAttributeEvent srae) {
System.out.println("HttpServletRequest域对象属性 -删除");
}
public void attributeAdded(ServletRequestAttributeEvent srae) {
System.out.println("HttpServletRequest域对象属性 -添加");
}
public void attributeReplaced(ServletRequestAttributeEvent srae) {
System.out.println("HttpServletRequest域对象属性 -修改");
}
}
测试:servlet代码
req.setAttribute("NAME", "jack");
req.setAttribute("NAME", "tom");
req.removeAttribute("NAME");
3.3 第三类:监听session中的特殊javaBean状态的改变
注意:这类监听器:在JavaBean中实现监听器接口,并实现方法。不需要@WebListener
注解
3.3.1 HttpSessionBindingListener
监听Session域对象属性中 JavaBean的绑定和解绑。
- 绑定:将JavaBean对象添加到Session域对象属性中
- 解绑:将绑定JavaBean的域对象属性,修改成非本Bean数据,或删除该属性。
public class Person implements HttpSessionBindingListener{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("Person对象被【绑定】到了Session域对象属性中");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("Person对象从Session域对象属性中 【解绑】");
}
}
测试:servlet代码
HttpSession session = req.getSession();// 创建
session.setAttribute("Person", new Person());// session添加属性
session.setAttribute("Person", "tom");// session修改属性; 修改和删除都算解绑
session.removeAttribute("Person");// session删除属性
session.invalidate();//销毁
3.3.2 HttpSessionActivationListener
监听Session域中JavaBean的活化和钝化
前提:必须将JavaBean保存到Session域对象属性中。且JavaBean必须实现可序列化接口Serializable
-
钝化:序列化(将内存中的数据保存在硬盘上):将session对象序列化到tomcat/work目录中 的SESSION.ser文件。正常关闭服务器。
-
活化:反序列化(将硬盘上的数据加载到内存中):将SESSION.ser文件反序列化成Session对象。开启服务器,且session没过期
public class Dog implements Serializable,HttpSessionActivationListener{
private String dname;
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("Dog对象钝化了:"+getDname());
}
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("Dog对象活化了:"+getDname());
}
}
测试:servlet代码。然后关闭服务器,再开启,看日志
HttpSession session = req.getSession();// 创建
Dog dog = new Dog();
dog.setDname("小白");
session.setAttribute("dog", dog);