2022-10-21 15:49

监听器详解

wanmatea

JavaEE

(698)

(0)

收藏

什么是监听器

Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。

监听对象:

1、ServletContext:application,整个应用只存在一个

2、HttpSession:session,针对每一个对话

3、ServletRequest:request,针对每一个客户请求

监听内容:创建、销毁、属性改变事件

监听作用:可以在事件发生前、发生后进行一些处理,一般可以用来统计在线人数和在线用户、统计网站访问量、系统启动时初始化信息等。

二、监听器的基本使用

1、创建一个实现监听器接口的类,并实现接口中的方法

public class TestListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("创建application对象");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("销毁application对象");
    }
}

2、添加注解@WebListener 或者配置web.xml文件,注册监听器

<listener>
<listener-class>com.example.listenerdemo2.TestListener</listener-class>
</listener>

三、常用监听器

1、ServletContextListener

(1)ServletContextListener

用于对ServletContext进行监听(创建、销毁)。

常用方法:

public void contextInitialized(ServletContextEvent sce);//ServletContext初始化
public void contextDestroyed(ServletContextEvent sce);//ServletContext销毁
//ServletContextEvent事件
public ServletContext getServletContext();取得一个ServletContext(application)对象

(2)ServletContextAttributeListener

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

常用方法:

public void attributeAdded(ServletContextAttributeEvent scab);//增加属性
public void attributeRemoved(ServletContextAttributeEvent scab);//属性删除
public void attributeRepalced(ServletContextAttributeEvent scab);//属性替换(第二次设置同一属性)
public String getName();//得到属性名称
public Object getValue();//取得属性的值

示例代码:

@WebListener
public class TestListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("创建application对象");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("销毁application对象");
    }
}

2、HttpSessionListener

(1)HttpSessionListener

对Session的整体状态的监听。

public void sessionCreated(HttpSessionEvent se);//session创建
public void sessionDestroyed(HttpSessionEvent se);//session销毁
//HttpSessionEvent事件
public HttpSession getSession();//取得当前操作的session

(2)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

示例代码:

@WebListener
public class TestListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("创建session对象");
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("销毁session对象");
    }
}

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

<session-config>

      <session-timeout>1</session-timeout>

 </session-config>

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

3、ServletRequestListener

(1)ServletRequestListener

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

public void requestInitialized(ServletRequestEvent sre);//request初始化
public void requestDestroyed(ServletRequestEvent sre);//request销毁
//ServletRequestEvent事件
public ServletRequest getServletRequest();//取得一个ServletRequest对象
public ServletContext getServletContext();//取得一个ServletContext(application)对象

(2)ServletRequestAttributeListener

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

public void attributeAdded(ServletRequestAttributeEvent srae);//增加属性
public void attributeRemoved(ServletRequestAttributeEvent srae);//属性删除
public void attributeReplaced(ServletRequestAttributeEvent srae);//属性替换(第二次设置同一属性)
//ServletRequestAttributeEvent事件:能取得设置属性的名称与内容
public String getName();//得到属性名称
public Object getValue();//取得属性的值

示例代码:

@WebListener
public class TestListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("销毁request对象");
    }
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("创建request对象");
    }
}

综合例子:

获取在线用户数量

@WebListener
public  class  TestListener  implements
ServletContextListener,HttpSessionListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext=sce.getServletContext();
        servletContext.setAttribute("count",0);
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
 
    }
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        HttpSession session=se.getSession();
        ServletContext servletContext=session.getServletContext();
        int count=(int)servletContext.getAttribute("count");
        count++;
        servletContext.setAttribute("count",count);
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        HttpSession session=se.getSession();
        ServletContext servletContext=session.getServletContext();
        int count=(int)servletContext.getAttribute("count");
        count--;
        servletContext.setAttribute("count",count);
    }
}

jsp页面:

<%

    out.write("在线人数:"+application.getAttribute("count"));

%>

<a href="hello-servlet">Hello Servlet</a>

image.png 

0条评论

点击登录参与评论