java监听器原理_Java中Servlet Listener监听器详解(原理)

本文详细介绍了Java中Servlet监听器的工作原理和使用,包括ServletContextListener、ServletContextAttributeListener、HttpSessionListener和ServletRequestListener。监听器是实现特定接口的Java程序,用于监听服务器端的对象状态变化,如上下文创建、销毁、属性修改等。通过监听器,开发者可以在特定事件发生时自动执行代码,例如记录在线用户数量。示例代码展示了如何创建和注册监听器,并在web.xml中配置它们。

Java中Servlet Listener监听器详解(原理)

Listener是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。

原理

Listener监听器就是一个实现特定接口的普通Java程序,这个程序专门用于监听一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。

bb75e9f451fe047d98b926f481ad8e87.png

简单的说,被监听对象A中,关联着B对象。事件源A类对外提供一个方法,用于设置监听器对象B到A类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event对象,将this即B与相关的动作封装进Event对象中,然后调用监听器B对象的doXXXX(event)方法,将事件对象传入方法实参中。

分类+例子

ServletContext监听

ServletContextListener:用于对Servlet整个上下文进行监听(创建、销毁)。

public void contextInitialized(ServletContextEvent sce);//上下文初始化

public void contextDestroyed(ServletContextEvent sce);//上下文销毁

public ServletContext getServletContext();//ServletContextEvent事件:取得一个ServletContext(application)对象

ServletContextAttributeListener:对Servlet上下文属性的监听(增删改属性)。

public void attributeAdded(ServletContextAttributeEvent scab);//增加属性

public void attributeRemoved(ServletContextAttributeEvent scab);//属性删除

public void attributeRepalced(ServletContextAttributeEvent scab);//属性替换(第二次设置同一属性)

public String getName();//得到属性名称

public Object getValue();//取得属性的值

例子

//MyServletContextListener类实现了ServletContextListener接口,因此可以对ServletContext对象的创建和销毁这两个动作进行监听。

public class MyServletContextListener implements ServletContextListener {

@Override

public void contextInitialized(ServletContextEvent sce) {

System.out.println("ServletContext对象创建");

}

@Override

public void contextDestroyed(ServletContextEvent sce) {

System.out.println("ServletContext对象销毁");

}

}

//web.xml文件中注册监听器

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

index.jsp

ServletContextListener监听器

me.gacl.web.listener.MyServletContextListener

这样我们就完成了监听器的编写和注册,Web服务器在启动时,就会自动把在web.xml中配置的监听器注册到ServletContext对象上,这样开发好的MyServletContextListener监听器就可以对ServletContext对象进行监听了。

Session监听

HttpSessionListener接口:对Session的整体状态的监听。

public void sessionCreated(HttpSessionEvent se);//session创建

public void sessionDestroyed(HttpSessionEvent se);//session销毁

//HttpSessionEvent事件

public HttpSession getSession();//取得当前操作的session

HttpSessionAttributeListener接口:对session的属性监听。

public void attributeAdded(HttpSessionBindingEvent se);//增加属性

public void attributeRemoved(HttpSessionBindingEvent se);//删除属性

public void attributeReplaced(HttpSessionBindingEvent se);//替换属性

//HttpSessionBindingEvent事件

public String getName();//取得属性的名称

public Object getValue();//取得属性的值

public HttpSession getSession();//取得当前的session

例子

//MyHttpSessionListener类实现了HttpSessionListener接口,因此可以对HttpSession对象的创建和销毁这两个动作进行监听。

public class MyHttpSessionListener implements HttpSessionListener {

@Override

public void sessionCreated(HttpSessionEvent se) {

System.out.println( se.getSession() + "创建了!!");

}

/* HttpSession的销毁时机需要在web.xml中进行配置,如下:

*

1

这样配置就表示session在1分钟之后就被销毁

*/

@Override

public void sessionDestroyed(HttpSessionEvent se) {

System.out.println("session销毁了!!");

}

}

//web.xml文件中注册监听器

HttpSessionListener监听器

me.gacl.web.listener.MyHttpSessionListener

1

当我们访问jsp页面时,HttpSession对象就会创建,此时就可以在HttpSessionListener观察到HttpSession对象的创建过程了。

Request监听

ServletRequestListener:用于对Request请求进行监听(创建、销毁)。

public void requestInitialized(ServletRequestEvent sre);//request初始化

public void requestDestroyed(ServletRequestEvent sre);//request销毁

//ServletRequestEvent事件

public ServletRequest getServletRequest();//取得一个ServletRequest对象

public ServletContext getServletContext();//取得一个ServletContext(application)对象

ServletRequestAttributeListener:对Request属性的监听(增删改属性)。

public void attributeAdded(ServletRequestAttributeEvent srae);//增加属性

public void attributeRemoved(ServletRequestAttributeEvent srae);//属性删除

public void attributeReplaced(ServletRequestAttributeEvent srae);//属性替换(第二次设置同一属性)

//ServletRequestAttributeEvent事件:能取得设置属性的名称与内容

public String getName();//得到属性名称

public Object getValue();//取得属性的值

例子

//MyServletRequestListener类实现了ServletRequestListener接口,因此可以对ServletRequest对象的创建和销毁这两个动作进行监听。

public class MyServletRequestListener implements ServletRequestListener {

@Override

public void requestDestroyed(ServletRequestEvent sre) {

System.out.println(sre.getServletRequest() + "销毁了!!");

}

@Override

public void requestInitialized(ServletRequestEvent sre) {

System.out.println(sre.getServletRequest() + "创建了!!");

}

}

//web.xml文件中注册监听器

ServletRequestListener监听器

me.gacl.web.listener.MyServletRequestListener

用户每一次访问都会创建request对象,当访问结束后,request对象就会销毁。

总结

1. 监听器Listener就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

2. Listener是Servlet的监听器,可以监听客户端的请求,服务端的操作等。

3. Listener实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等.

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值