一、Listener生命周期
listener是web三大组件之一,是servlet监听器,用来监听请求,监听服务端的操作。
listener分为:(都是接口类,必须实现相应方法)
1.生命周期监听器(3个)
-
-
- ServletContextListener
- requestInitialized 在容器启动时被调用(在servlet被实例化前执行)
- requestDestroyed 在容器销毁时调用(在servlet被销毁后执行)
- HttpSessionListener
- sessionCreated 在HttpSession创建后调用
- sessionDestroyed 在HttpSession销毁前调用(执行session.invalidate();方法)
- ServletRequestListener
- requestDestroyed 在request对象创建后调用(发起请求)
- requestInitialized 在request对象销毁前调用(请求结束)
- ServletContextListener
-
2.属性变化监听器(3个)
-
-
-
- attributeAdded(ServletContextAttributeEvent event) 向appliction中添加属性时调用
- attributeRemoved(ServletContextAttributeEvent event) 从appliction中删除属性时调用
- attributeReplaced(ServletContextAttributeEvent event) 替换application中的属性时调用
- HttpSessionAttributeListener
- attributeAdded(HttpSessionBindingEvent event)
- attributeRemoved(HttpSessionBindingEvent event)
- attributeReplaced(HttpSessionBindingEvent event)
- ServletRequestAttributeListener
- attributeAdded(ServletRequestAttributeEvent event)
- attributeRemoved(ServletRequestAttributeEvent event)
- attributeReplaced(ServletRequestAttributeEvent event)
-
-
以上监听器接口除了传参不同,方法名都是一样的。分别监听application,session,request对象的属性变化。
3.session中指定类属性变化监听器(2)
-
-
- HttpSessionBindingListener
- valueBound(HttpSessionBindingEvent event) 当该类实例设置进session域中时调用
- valueUnbound(HttpSessionBindingEvent event) 当该类的实例从session域中移除时调用
- HttpSessionActivationListener
- sessionWillPassivate(HttpSessionEvent se) 当对象session被序列化(钝化)后调用
- sessionDidActivate(HttpSessionEvent se) 当对象session被反序列化(活化)后调用
- HttpSessionBindingListener
-
二、测试范例
1.生命周期监听:
ServletContentAttribute_Listener.java
public class ServletContentAttribute_Listener implements ServletContextListener {
/**
* ServletContextListener实现方法
* @param sce
*/
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContextListener初始化");
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContextListener销毁");
}
}
其他两个监听器类似,不在重复贴出。
在web.xml中配置
<!-- 监听器 -->
<!-- servlet监听器 -->
<listener>
<listener-class>study.myListener.ServletContentAttribute_Listener</listener-class>
</listener>
<!-- session监听器 -->
<listener>
<listener-class>study.myListener.HttpSessionAttribute_Listener</listener-class>
</listener>
<!-- request监听器-->
<listener>
<listener-class>study.myListener.ServletRequestAttribute_Listener</listener-class>
</listener>
运行结果:
2.属性监听:
ServletContentAttribute_Listener.java
public class ServletContentAttribute_Listener implements ServletContextAttributeListener{
/**
* ServletContextAttributeListener实现方法
* @param event
*/
public void attributeAdded(ServletContextAttributeEvent event) {
String meg = MessageFormat.format("ServletContent添加属性:{0},属性值:{1}",event.getName(),event.getValue());
System.out.println(meg);
}
public void attributeRemoved(ServletContextAttributeEvent event) {
String meg = MessageFormat.format("ServletContent删除属性:{0},属性值:{1}",event.getName(),event.getValue());
System.out.println(meg);
}
public void attributeReplaced(ServletContextAttributeEvent event) {
String meg = MessageFormat.format("ServletContent替换属性:{0},属性值:{1}",event.getName(),event.getValue());
System.out.println(meg);
}
}
另外两个监听器类似,不在赘诉。接下来用jsp页面测试
listenerDemo.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2017/10/17
Time: 15:28
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>监听器设置</title>
</head>
<body>
<%
/**
* servlet监听
*/
application.setAttribute("name","changxiang");
application.setAttribute("name","小Cai先森");
application.removeAttribute("name");
/**
* session监听
*/
session.setAttribute("sessionName","changxiang");
session.setAttribute("sessionName","小Cai先森");
session.removeAttribute("sessionName");
session.invalidate();
/**
* request监听
*/
request.setAttribute("requestName","changxiang");
request.setAttribute("requestName","小Cai先森");
request.removeAttribute("requestName");
%>
</body>
</html>
执行结果如下:
原作者:博客园小Cai先森,可以学习转载