监听器

mac2022-06-30  92

监听器listener在servlet2.5中配置到web.xml中,servlet3.0就可以配置到注解中。

监听器顾名思义,就是监控被监控者的一系列变化。在web应用中监听的就是对象的初始化、销毁、增加、修改、删除值等。 Web监听器是servle规范定义的一种特殊的类,用于监听ServletContext、HttpSession、ServletRequest等域对象的创建和销毁事件。用于监听域对象的属性增加、删除等事件。用于监听各种事件的发生,可以在这些事件发生前后做一些必要的处理。   监听器的启动顺序:     按照web.xml中配置的先后顺序启动,   监听器、过滤器、servlet的启动顺序优先级:listener>filter>servlet。   监听器的划分:     按照监听的对象划分:           1.监听应用程序环境对象(servletContext)的事件监听器,对应application,需要实现 javax.servlet.ServletContextListener 接口。          2.监听用户会话对象(HttpSession)的事件监听器,对应session,需要实现 javax.servlet.http.HttpSessionListener 接口。          3. 监听用户消息请求对象(ServletRequest)的事件监听器,对应request,需要实现 javax.servlet.ServletContextListener 接口。           javax.servlet.ServletContextListener           javax.servlet.http.HttpSessionListener      javax.servlet.ServletContextListener     这三个接口提供了 contextInitialized()和 contextDestroyed()函数,来监听request、session、application的创建和销毁。     按照监听的事件类型划分:          1.监听域对象自身的创建和销毁的事件监听器          2.监听域对象中属性的创建和销毁的事件监听器           监听request域对象属性需要实现 javax.servlet.ServletRequestAttributeListener接口      监听session域对象属性需要实现 javax.servlet. HttpSessionAttributeListener 接口      监听application域对象属性需要实现 javax.servlet. ServletContextAttributeListener 接口     这三个接口提供了 attributeAdded()、 attributeRemoved()、 attributeReplaced() 函数,来监听 属性添加、 属性移除、 属性替换函数。          3.监听绑定到HttpSession域中的某个对象的状态的事件监听器          保存在session中的对象有多重状态:绑定(session.setAttribute("bean",Object))到session中,从session中解除绑定(session.removeAttribute("bean"));          随session持久化到设备中,随session从存储设备中恢复。          servlet规范中定义了两个特殊的监听器接口   HttpSessionBindingListener和HttpSessionActivationListener 来帮助javabean来了解自己在session域中的状态,实现这两个接口无需再web.xml中配置。         属性绑定/解绑到session中:           实现了HttpSessionBindingListener接口的 JavaBean对象可以感知自己被绑定到 Session中和从Session中删除的事件 当对象被绑定到 HttpSession 对象中时,web 服务器调用该对象的 void valueBound(HttpSessionBindingEvent event) 方法 当对象从 HttpSession 对象中解除绑定时,web 服务器调用该对象的 void valueUnbound(HttpSessionBindingEvent event)方法          javax.servlet.http.HttpSessionBindingListener接口:主要包含两个函数: valueBound()和 valueUnbound()。 当自身被绑定到session属性中(session.setAttribute("bean",Object))调用 valueBound()方法;    当对象从session中解绑(sesssion.removeAttribute("bean"))的时候调用 valueUnbound()函数。         session钝化/激活:     实现了HttpSessionActivationListener接口的 JavaBean 对象可以感知自己被活化和钝化的事件 活化:javabean对象和Session一起被反序列化(活化)到内存中。 钝化:javabean对象存在Session中,当服务器把session序列化到硬盘上时,如果Session中的javabean对象实现了Serializable接口 那么服务器会把session中的javabean对象一起序列化到硬盘上,javabean对象和Session一起被序列化到硬盘中的这个操作称之为钝化 如果Session中的javabean对象没有实现Serializable接口,那么服务器会先把Session中没有实现Serializable接口的javabean对象移除 然后再把Session序列化(钝化)到硬盘中 当绑定到 HttpSession对象中的javabean对象将要随 HttpSession对象被钝化之前, web服务器调用该javabean对象对象的 void sessionWillPassivate(HttpSessionEvent event)方法 这样javabean对象就可以知道自己将要和 HttpSession对象一起被序列化(钝化)到硬盘中 当绑定到HttpSession对象中的javabean对象将要随 HttpSession对象被活化之后, web服务器调用该javabean对象的 void sessionDidActive(HttpSessionEvent event)方法 这样javabean对象就可以知道自己将要和 HttpSession对象一起被反序列化(活化)回到内存中      MyHttpSessionActivationListener接口:主要包含两个函数 sessionDidActivate()和 sessionWillPassivate()。     当session超时,会调用 sessionWillPassivate()函数,将保存session中的此对象和session一起钝化到硬盘中。     当再次请求页面,会调用 sessionDidActivate()函数,将session和session中保存的对象从硬盘活化到内存中。       测试钝化目录:E:\lunaWorkSpace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\ListenerTest\gacl             

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/douJiangYouTiao888/p/6473939.html

最新回复(0)