目录
一、监听器概述
监听器的分类
按监听的对象划分
按监听的事件划分
二、监听器的六个主要接口
1.application监听器
2.session域监听器
3.request域监听器
三、session域的两个特殊监听器
1.session绑定监听器
2.钝化活化监听器
什么是钝化活化
如何配置钝化与活化
编辑
如何监听钝化活化?
我们都会逐渐发现努力不一定有结果,但有时你还是得向前走,
都说要找方向,可你不去碰壁怎么知道在哪个路口应该转弯,大多坚持和努力都会被浪费,
或许绕了一个圈后发现当初只要自己坚持向前一步就能做好这件事,但你不绕这么一大圈就不会明白这些,
没什么好抱怨的,就像很多你突然明白的道理都有伏笔,只要你不放弃前行就行
—— 24.10.13
一、监听器概述
监听器:专门用于对域对象身上发生的事件或状态改变进行监听和相应处理的对象
监听器是GOF设计模式中,观察者模式的典型案例;
监听器使用的感受类似于JavaScript中的事件,被观察的对象发生某些情况时,自动触发代码的执行;
监听器并不监听web项目中的所有组件,仅仅是对三大域对象做相关的事件监听;
监听器的分类
web中定义八个监听器接口作为监听器的规范,这八个接口按照不同的标准可以形成不同的分类
按监听的对象划分
① application域监听器
ServletContextListener
ServletContextAttributeListener
② session域监听器
ServletContextListener
ServletContextAttributeListener
③ reguest域监听器
ServletRequestListener
ServletRequestAttributeListener
按监听的事件划分
① 域对象的创建和销毁监听器
ServletContextListener
HttpSessionListener
ServletRequestListener
② 域对象数据增删改事件监听器
ServletContextAtributeListener
HttpSessionAttributeListener
ServletRequestAtributeListener
③ 其他监听器
HttpSessionBindingListener
HttpSessionActivationListener
二、监听器的六个主要接口
1.application监听器
ServletContextListener:监听ServletContext对象的创建与销毁
contextInitialized(ServletContextEvent sce) ServletContext创建时调用
contextDestroyed(ServletContextEvent sce) ServletContext销毁时调用
ServletContextEvent对象代表ServletContext对象上捕获到的事件,通过这个时间对象我们可以 获取到ServletContext对象
ServletContextAttributeListener: ServletContext中属性的添加、移除和修改
attributeAdded(ServletContextAttributeEvent scab) 向ServletContext中添加属性时调用 attributeRemoved(ServletContextAttributeEvent scab) 从ServletContext中移除属性时调用 attributeReplaced(ServletContextAttributeEvent scab) 当ServletContext中的属性被修改时调用
ServletContextAttributeEvent对象代表属性变化事件
getName() 获取修改或添加的属性名
getValue() 获取被修改或添加的属性值
getServletContext() 获取ServletContext对象
2.session域监听器
HttpSessionListener:监听HttpSession对象的创建与销毁
sessionCreated(HttpSessionEvent hse) HttpSession对象创建时调用
sessionDestroyed(HttpSessionEvent hse) HttpSession对象销毁时调用
HttpSessionEvent对象代表从HttpSession对象上捕获到的事件,通过这个事件对象我们可以获取到触发事件的HttpSession对象
HttpSessionAttributeListener:监听HttpSession中属性的添加、移除和修改:
attributeAdded(HttpSessionBindingEvent se) 向HttpSession中添加属性时调用 attributeRemoved(HttpSessionBindingEvent se) 从HttpSession中移除属性时调用 attributeReplaced(HttpSessionBindingEvent se) 当HttpSession中的属性被修改时调用
HttpSessionBindingEvent对象代表属性变化事件
getName() 获取修改或添加的属性名
getValue() 获取被修改或添加的属性值
getSession() 获取触发事件的HttpSession对象
3.request域监听器
ServletRequestListener监听ServletRequest对象的创建与销毁:
requestInitialized(ServletRequestEvent sre) ServletRequest对象创建时调用
requestDestroyed(ServletRequestEvent sre) ServletRequest对象销毁时调用
ServletRequestAttributeListener 监听 ServletRequest中属性的添加、移除和修改:
attributeAdded(ServletRequestAttributeEvent srae) 向ServletRequest中添加属性时调用
attributeRemoved(ServletRequestAttributeEvent srae) 从ServletRequest中移除属性时调用
attributeReplaced(ServletRequestAttributeEvent srae) 当ServletRequest中属性修改时调用
ServletRequestAttributeEvent对象代表属性变化事件
getName() 获取修改或添加的属性名
getValue() 获取被修改或添加的属性值
getServletRequest() 获取触发事件的ServletRequest对象
三、session域的两个特殊监听器
1.session绑定监听器
HttpSessionBindingListener 监听当前监听器对象在Session域中的增加与移除
valueBound(HttpSessionBindingEvent event) 该类的实例被放到Session域中时调用
valueUnbound(HttpSessionBindingEvent event) 该类的实例从Session中移除时调用
HttpSessionBindingEvent对象代表属性变化事件
getName() 获取当前事件涉及的属性名
getValue() 获取当前事件涉及的属性值
getServletRequest() 获取触发事件的HttpSession对象
2.钝化活化监听器
HttpSessionActivationListener 监听某个对象在Session中的序列化与反序列化
sessionWillPassivate(HttpSessionEvent se) 该类实例和Session一起钝化到硬盘时调用
sessionDidActivate(HttpSessionEvent se) 该类实例和Session一起活化到内存时调用
什么是钝化活化
钝化与活化,本质上是session对象的序列化和反序列化
session对象在服务端是以对象的形式存储于内存的,session过多,服务器的内存不足;
一旦服务器发生重启,所有的session对象都将被清除,也就意味着session中存储的不同客户端的登录状态丢失;
为了分摊内存压力并且为了保证session重启不丢失,我们可以设置将session进行钝化处理;
在关闭服务器前或者到达了设定时间时,对session进行序列化到磁盘,这种情况叫做session的钝化
在服务器启动后或者再次获取某个session时,将磁盘上的session进行反序列化到内存,这种情况叫做session的活化:
如何配置钝化与活化
1.在web目录下,添加META-INF下创建Context.xml
2.文件中配置钝化
<?xml version="1.0" encoding="UTF-8" >
<Context>
<Manager className="org.apache.catalina.session.PersistentManager"
maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore"
directory="d:\mysession"></Store>
</Manager>
</Context>
3.请求servletA,获得session,并存入数据,然后重启服务器
@WebServlet(urlPatterns = "/servletA",name = "servletA ame")
public class ServletA extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
HttpSession session = req.getSession();
// 添加数据
session.setAttribute("k1","v1");
}
}
4.请求servletB获取session,获取重启前存入的数据
@WebServlet(urlPatterns = "/servletB", name = "servletBName")
public class ServletB extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
HttpSession session = req.getSession();
Object v1 = session.getAttribute("k1");
System.out.println(v1);
}
}
如何监听钝化活化?
1.定义监听器
import akarta.servlet.http.HttpSession;
import akarta.servlet.http.HttpSessionActivationListener;
import akarta.servlet.http.HttpSessionEvent;
import ava.io.Serializable;
public class ActivationListener implements HttpSessionActivationListener,
Serializable {
// 监听钝化
@Override
public void session illPassivate(HttpSessionEvent se) {
HttpSession session = se.getSession();
System.out.println("session with JSESSIO ID "+ session.getId()+" will
passivate");
}
// 监听活化
@Override
public void sessionDidActivate(HttpSessionEvent se) {
HttpSession session = se.getSession();
System.out.println("session with JSESSIONID "+ session.getId()+" did
activate");
}
}
2.定义触发监听器的代码
@WebServlet(urlPatterns = "/servletA",name = "servletAName")
public class ServletA extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
HttpSession session = re .getSession();
// 添加数据
session.setAttribute("k1","v1");
// 添加钝化活化监听器
session.setAttribute("activationListener",new ActivationListener());
}
}