JavaWeb系列之:监听器

时间:2022-08-27 13:48:01

一,监听器定义

指专门用于对其他对象身上发生的 事件 或 状态改变 进行监听和相应处理的对象,当被监视对象发生变化时,立即采取相应的行动。

Web监听器可以监听客户端的请求,服务端的操作。可以监听的对象有:

ServletContex ---->作用域:application(上下文对象,由容器创建和初始化,范围是整个应用,并且这个应用只有一个application存在,当web服              务器关闭时,就会把application对象销毁)。

HttpSession ------>作用域:session(session是一种保存上下文的机制,针对每一个会话。放在服务器端通过sessionId来区分的,当浏览器和服              务器结束会话后,会把session销毁)

ServletRequest ----->作用域:request(request对象是当客户发送请求时,容器就会创建一个ServletRequest对象,用来封装请求数据,同时会              创建一个ServletResponse对象来封装响应数据。在访问结束请求之后,request对象就会被销毁)

Web监听器主要用来监听这三个对象的创建,销毁,以及对象的属性的变化。

Web监听器总结:

web监听器是Servlet规范中定义的一种特殊类

用来监听ServletContext,HttpSession,ServletRequest等域对象的创建和销毁事件

用来监听域对象的属性发生修改的事件

可以在事件发生之前,发生之后做一些必要的处理

二,用途

1,统计在线人数和在线用户

2,系统启动时加载初始化信息(包括缓存,一些定时器信息,数据库连接等)

3,访问网站访问量

4,和Spring结合

三,实现一个监听器

1,步骤:

创建一个类,实现监听器接口

配置web.xml进行注册

2,代码:

public class FirstListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent servletcontextevent) {
        System.out.println("contextInitialized  ");
    }

    public void contextDestroyed(ServletContextEvent servletcontextevent) {
        System.out.println("contextDestroyed");
    }

}

web.xml配置监听器

<listener>
  <listener-class>com.iamazing.listener.FirstListener</listener-class>
</listener>

web容器启动时执行:contextInitialized(ServletContextEvent servletcontextevent)

web容器销毁时执行:contextDestroyed(ServletContextEvent servletcontextevent)

四,监听器的启动顺序

一个web.xml下有多个监听器时,注册顺序和加载顺序是按照web.xml中的配置顺序。

监听器,过滤器,Servlet的加载(启动)顺序:  监听器  》 过滤器 》 Servlet

五,监听器的分类

1,按监听的对象划分:

用于监听应用程序环境对象(ServletContext)的事件监听器

用于监听用户会话对象(HttpSession)的事件监听器

用于监听请求消息对象(ServletRequest)的事件监听器

2,按监听的事件划分

监听域对象自身的创建和销毁的事件监听器

监听域对象中的属性的增加和删除的事件监听器

监听绑定到HttpSession域对象中的某个对象的状态的事件监听器

六,监听域对象自身的创建和销毁的事件监听器

1.1,域对象有三个:ServletContext,HttpSession,ServletRequest。

在Servlet规范中,定义了三个接口,用来监听这三个域对象的创建事件和销毁事件

ServletContextListener, HttpSessionListener, ServletRequestListener

2,ServletContext

一个web项目中可以定义多个ServletContextListener,但是只有一个ServletContext对象。

2.1,在ServletContextListener中有两个事件处理方法:

contextInitialized方法:---->ServletContext创建时调用

  public void contextInitialized(ServletContextEvent sce):ServletContextEvent对象可以获取ServletContext对象,初始化的参数

ContextDestoryed方法:----->ServletContex销毁时调用

  public void contextDestoryed(ServletContextEvent sce)

2.2,主要用途

定时器

全局属性对象(比如:创建数据库连接)

2.3,代码:

 

public class FirstListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent servletcontextevent) {
        String initParam = servletcontextevent.getServletContext().getInitParameter("initParam");
        System.out.println("contextInitialized : initParam = "+initParam);
    }

    public void contextDestroyed(ServletContextEvent servletcontextevent) {
        System.out.println("contextDestroyed");
    }

}

 

<context-param>
  <param-name>initParam</param-name>
  <param-value>hello</param-value>
 </context-param>
 <listener>
  <listener-class>com.amazing.listener.FirstListener</listener-class>
 </listener>

 

3,HttpSession

一个web应用中可以有多个HttpSession对象

3.1,HttpSessionListener有两个处理事件方法

sessionCreated方法:------>session创建时调用

  public void sessionCreated(HttpSessionEvent se)

sessionDestoryed方法:----->sesssion销毁时调用

  public void sessionDestoryed(HttpSessionEvent se)

3.2,用途、

统计在线人数

记录访问日志

3.3,代码:

public class MyHttpSessionListener implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent httpsessionevent) {
        System.out.println("sessionCreated");
    }

    public void sessionDestroyed(HttpSessionEvent httpsessionevent) {
        System.out.println("sessionDestroyed");
    }

}

在web.xml中注册监听器

<listener>
  <listener-class>com.imooc.listener.MyHttpSessionListener</listener-class>
 </listener>

配置session失效时间:过了失效时间清除sesssion(注意:这里不一定整好时30分钟,因为并没有一个定时器去实现它,只是大致时间)

<session-config>
  <session-timeout>30</session-timeout>
 </session-config>

4,ServletRequest

请求开始创建对象,请求结束销毁对象

4.1,两个事件处理方法

  requestInitialized方法 ---->request创建时调用

  requestDestoryed方法 ----->request销毁时调用

4.2,用途

读取参数

记录访问历史(访问了哪些路径)

4.3,代码

public class MyServletRequestListener implements ServletRequestListener {

    public void requestDestroyed(ServletRequestEvent servletrequestevent) {
        System.out.println("requestDestroyed ");
    }

    public void requestInitialized(ServletRequestEvent servletrequestevent) {
        String name = servletrequestevent.getServletRequest().getParameter("name");
        System.out.println("requestInitialized name:"+name);
    }

}
<listener>
  <listener-class>com.imooc.listener.MyServletRequestListener</listener-class>
 </listener>

 七,监听域对象中的属性的增加和删除的事件监听器

ServletContextAttributeListener, HttpSessionAttributeListener, ServletRequestAttributeListener。

他们三个对象中的三个方法都是一样的:

attributeAdded:

attributeRemoved:

attributeReplaced: