监听器在Java开发过程中发挥着重要作用,我们经常需要在系统刚一启动就要执行某些任务或进行某些操作,还有在统计当前在线用户数目时也需要使用监听器,因此有必要了解一下Java中监听器的使用过程和原理。
什么是Java监听器?
Java监听器就是一个程序,一个实现了特定接口的程序。
Java监听器的作用?
Java中监听器用于监听一个Java对象的方法调用或者属性的改变;当被监听的对象的某个方法被调用或者某个属性发生改变的时候,监听器中的某个方法就会被立即执行。
Java监听器简介
常用的监听器接口分为三类,分别是:
1.对Servlet上下文进行监听(Application级)
用于监听ServletContext对象的创建和删除以及属性的添加、删除、修改等操作,该监听器需要用到如下两个接口类:
(1)ServletContextAttributeListener
用于监听ServletContext(application)范围内属性的变化,实现该接口的监听器需要实现如下三个方法:
①attributeAdded(ServletContextAttributeEvent event):当程序把一个属性存入application范围时触发该方法;
②attributeRemoved(ServletContextAttributeEvent event):当程序把一个属性从application范围删除时触发该方法;
③attributeReplaced(ServletContextAttributeEvent event):当程序替换application范围内的属性时将触发该方法;
(2)ServletContextListener
当你需要在处理任何客户端请求之前进行某个操作,并且希望在整个应用过程中该操作一直可用,此时ServletContextListener接口将会起到作用,实现该接口的监听器需要实现的方法有:
①contextInitialized(ServletContextEvent event):当创建ServletContext时,激发该方法
②contextDestroyed(ServletContextEvent event):当销毁ServletContext时,激发该方法
2.对HTTP会话进行监听(Session级)
用于监听HTTP会话活动情况和HTTP会话中属性设置情况:包括session的创建和销毁,session中属性的增加、删除、修改等操作,也可以监听HTTP会话的active和passivate情况等,HTTP Session级的接口主要有:
(1)HttpSessionAttributeListener
该接口用于监听HttpSession(session)范围内属性的改变,实现该接口需要实现的方法有:
①attributeAdded(HttpSessionBindingEvent event):当在session中添加对象时触发此操作;
②attributeRemoved(HttpSessionBindingEvent event):当在session中删除对象时触发此操作;
③attributeReplaced(HttpSessionBindingEvent event):当在session中修改对象时触发此操作;
(2)HttpSessionListener
该接口用于监听session的创建和销毁过程,实现该接口的监听器需要实现的方法有:
①sessionCreated(HttpSessionEvent event):用户与服务器的会话开始、创建时时触发该方法 ;
②sessionDestroyed(HttpSessionEvent event):用户与服务器的会话断开、销毁时触发该方法 ;
(3)HttpSessionActivationListener
实现了HttpSessionActivationListener接口的JavaBean对象可以感知自己被活化和钝化的事件,主要方法有:
①sessionDidActive(HttpSessionBindingEvent event):当绑定到HttpSession对象中的对象将要随HttpSession对象被活化之后,web服务器调用该对象的此方法;
②sessionWillPassivate(HttpSessionBindingEvent event):当绑定到HttpSession对象中的对象将要随HttpSession对象被钝化之前,web服务器调用该对象的此方法;
(4)HttpSessionBindingListener
实现了HttpSessionBindingListener接口的JavaBean对象可以感知自己被绑定到Session中和从Session中删除的事件
①valueBound(HttpSessionBindingEvent event):当对象被绑定到HttpSession对象中时,web服务器调用该对象的此方法,从而对象被设置到session中;
②valueUnbound(HttpSessionBindingEvent event):当对象从HttpSession对象中解除绑定时,web服务器调用该对象的此方法,从而对象从session中被移除;
「说明」:一般情况下,HttpSessionActivationListener和HttpSessionBindingListener一起使用,这两个监听器比较特殊,实现这两个接口的类不需要在web.xml中进行注册,被钝化的JavaBean对象会被持久化到存储设备中,活化的JavaBean对象会被从存储设备中恢复,前提是该JavaBean对象实现了Serializable接口。
3.对客户端请求进行监听(request级)
用于监听用户的请求和request范围内属性的变化,该监听器需要实现的接口主要有:
(1)ServletRequestAttributeListener
用于监听request范围内属性的变化,实现该接口需要实现的方法有:
①attributeAdded(ServletRequestAttributeEvent event):当程序向request范围内添加属性时触发该方法
②attributeRemoved(ServletRequestAttributeEvent event):当程序在request范围内删除属性时触发该方法
③attributeReplaced(ServletRequestAttributeEvent event):当程序在request范围内的属性被替换或修改时触发该方法
(2)ServletRequestListener
①requestInitialized(ServletRequestEvent event):用户请求到达、被初始化时触发该方法;
②requestDestroyed(ServletRequestEvent sre):用户请求结束、被销毁时触发该方法。
Java监听器原理
Java监听器示例
监听器一般需要在web.xml中进行注册,如:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>监听器Demo</display-name>
<listener>
<listener-class>demo.MyServletContextListener</listener-class>
</listener>
</web-app>
Java代码如下:
package demo;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* @author 四个空格-https://www.4spaces.org
*
*/
public class MyServletContextListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("----------------会话销毁---------------------");
}
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("-----------------会话创建------------------");
}
}
PS:完整代码下载地址:点我下载
最新评论
网飞没问题, 迪士尼+有解决方案么?
pp助手是安卓手机用的,根本下载用不来苹果
已解决
这样的话数据库里的结构为{"attachment":{"content":"xxx"}}, 要怎么才能变成{"content":"xxx"},从而使结构保持一致?
赞! make test不过的坑都写到的,谢谢楼主~
谢谢你
用了root用户还是一直502是怎么回事呢
student id 是空的