一、Servlet监听器的概念

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

监听对象:

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

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

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

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

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

二、监听器的基本使用

创建步骤:

1、创建一个实现监听器接口的类

2、配置web.xml文件,注册监听器

<listener>
<listener-class>完整类名</listener-class>
</listener>

监听器的启动顺序:按照web.xml的配置顺序来启动

加载顺序:监听器>过滤器>Servlet

三、监听器的分类

3.1 按照监听的对象划分

1、用于监听应用程序环境对象(ServletContext)的事件监听器,实现ServletContextListener、ServletContextAttributeListener接口

2、用于监听用户会话对象(HttpSeesion)的事件监听器,实现HttpSessionListener、HttpSessionAttributeListener接口

3、用于监听请求消息对象(ServletRequest)的事件监听器,实现ServletRequestListener、ServletRequestAttributeListener接口

3.2按照监听事件划分

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

根据监听对象不同分别实现ServletContextListener、HttpSessionListener、ServletRequestListener接口。

①ServletContext的创建和销毁:contextInitialized方法和contextDestroyed方法

public void contextInitialized(ServletContextEvent sce)//ServletContext创建时调用
public void contextDestroyed(ServletContextEvent sce)//ServletContext销毁时调用

主要用途:作为定时器、加载全局属性对象、创建全局数据库连接、加载缓存信息等

实例:

在web.xml中可以配置项目初始化信息,在contextInitialized方法中进行启动

<context-param>
<param-name>属性名</param-name>
<param-value>属性值</param-value>
</context-param>

自定义监听器

 
public class MyFirstListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent sce){
//获取web.xml中配置的属性
String value=sce.getServletContext().getInitParameter("属性名");
System.out.println(value);
  }
public void contextDestroyed(ServletContextEvent sce){
//关闭时操作
  }
}
 

②HttpSession的创建和销毁:sessionCreated和sessionDestroyed方法

public void sessionCreated(HttpSessionEvent se)//session创建时调用
public void sessionDestroyed(HttpSessionEvent se)//session销毁时调用

主要用途:统计在线人数、记录访问日志等

【注】

web.xml配置session超时参数,单位:分,session超时的时间并不是精确的

<session-config>
<session-timeout>10</session-timeout>
</session-config>

③ServletRequest的创建和销毁:requestInitialized和requestDestroyed方法

public void requestInitialized(ServletRequestEvent sre)//request创建时调用
public void requestDestroyed(ServletRequestEvent sre)//request销毁时调用

主要用途:读取request参数,记录访问历史

实例:

 
public class MySRequestListener implements SevletRequestListener{
public void requestInitialized(ServletRequestEvent sre){
String value=sre.getServletRequest().getParameter("key");//获取request中的参数
System.out.println(value);
}
public void requestDestroyed(ServletRequestEvent sre){
System.out.println("request destroyed");
}
}
 

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

  根据监听对象不同分别实现ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener接口。

  实现方法:attributeAdded、attributeRemoved、attributeReplaced

3、监听绑定到HttpSeesion域中的某个对象的状态的事件监听器(创建普通JavaBean)

  HttpSession中的对象状态:绑定→解除绑定;钝化→活化

  实现接口及方法:HttpSessionBindingListener接口(valueBound和valueUnbound方法)、HttpSessionActivationListener接口(sessionWillPassivate和sessionDidActivate方法)

【注1】①要实现钝化和活化必须实现Serializable接口

②不需要在web.xml中注册

【注2】

  绑定:    通过setAttribute保存到session对象当中

  解除绑定:  通过removeAttribue去除

  钝化:    将session对象持久化到存储设备上

  活化:    将session对象从存储设备上进行恢复

  session钝化机制:

    ①把服务器不常使用的session对象暂时序列化到系统文件或者是数据库中,当使用时反序列化到内存中,整个过程由服务器自动完成;

    ②session的钝化机制由SessionManager管理,创建一个普通的JavaBean绑定和接触需要实现HttpSessionBindingListener接口

四、Servlet3.0下监听器的使用

4.1 使用条件

  1、使用servlet3.0新标准的jar包

  2、JDK在1.6以上版本

  3、编译器的编译级别为6.0

  4、在web.xml文件中,使用3.0规范

  5、使用支持servlet3.0特性的web容器,比如tomcat7

4.2 servlet3.0下监听器的用法

使用注解 @WebListener 即可,无法去定义监听器的顺序

@WebListener的常用属性
属性名 类型 是否可选 描述
value String 是 该监听器的描述信息
@WebListener("This is a listener")
public class FirstListener impliements ServletRequestListener{}

该注解用于将类声明为监听器,被 @WebListener 标注的类必须实现以下至少一个接口:

  ServletContextListener

  ServletContextAttributeListener

  ServletRequestListener

  ServletRequestAttributeListener

  HttpSessionListener

  HttpSessionAttributeListener

【Servlet】Servlet监听器的更多相关文章

  1. Servlet的监听器

    Listener是Servlet的监听器,它可以监听客户端的请求.服务端的操作等.通过监听器,可以自动激发一些操作,比如监听在线的用户的数量.当增加一个HttpSession时,就激发sessionC ...

  2. 第六章 对象作用域与servlet事件监听器

          作用域对象 Servlet上下文监听器 Servlet会话监听器 Servlet请求监听器     一:对象作用域 作用域对象 属性操作方法 作用域范围说明 ServletContext( ...

  3. Servlet的监听器Listener

    Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是 随web应用的启动而启动,只初始化一次,随web ...

  4. JSP学习笔记(5)——Servlet、监听器、过滤器、MVC模式介绍

    MVC模式 在讲解Servlet前,先介绍一下MVC模式. M:model 模型,相当于数据层,用于存放数据,如一个Java中的一个bean类 V:view 视图,相当于页面层,用于显示数据,如一个网 ...

  5. org.apache.cxf.transport.servlet.CXFServlet cannot be cast to javax.servlet.Servlet

    java.lang.ClassCastException: org.apache.cxf.transport.servlet.CXFServlet cannot be cast to javax.se ...

  6. sae Servlet class XXXX is not a javax.servlet.Servlet

    以前都是使用myeclipse开发web工程上传sae后没有问题,但是使用javaee导出war包上传sae 无法访问 Servlet class  XXXX is not a javax.servl ...

  7. cannot be cast to javax.servlet.Servlet

    在第一次开发Maven项目时,maven环境和仓库以及eclipse都和讲师讲解的一样,可是却遇到下面这个问题: java.lang.ClassCastException: servlet.UserS ...

  8. java.lang.ClassCastException: cn.itcase.serviceImpl.servicestudentImpl cannot be cast to javax.servlet.Servlet

    java.lang.ClassCastException: cn.itcase.serviceImpl.servicestudentImpl cannot be cast to javax.servl ...

  9. 异常:Servlet class X is not a javax.servlet.Servlet

    使用Maven命令 mvn archetype:create 创建了一个简单的web项目.导入Eclipse运行时,报这样的异常信息: Servlet class X is not a javax.s ...

  10. Servlet Servlet是Java平台上的CGI技术

    Servlet Servlet是Java平台上的CGI技术.Servlet在服务器端运行,动态地生成Web页面.与传统的CGI和许多其它类似CGI的技术相比,Java Servlet具有更高的效率并更 ...

随机推荐

  1. springbot项目中使用继承

    package com.example.demo.controller; import com.sun.org.apache.bcel.internal.generic.NEW; import org ...

  2. python的三种特性

    1.封装 什么时候用函数? 各个函数之间是独立的且无共用的数据. 什么时候用类? 函数之间是相关的,且有共用的数据,则可以使用类来封装. 所谓的封装: (1)使用构造方法将内容封装到 对象 中. (2 ...

  3. 新项目UX设计0到1的正确开启方式

    无论是在BAT还是创业小公司,都随时可能接到从0开始的新项目,那么作为负责新项目的主设OR独立设计师,我们应该从何开启工作呢?

  4. 通过actionlib控制jaco机械臂

    为了安全,先写一个简单控制三个手指的程序: 根据驱动包内kinova_fingers_action.cpp服务器写客户端程序 #include <ros/ros.h> #include & ...

  5. 论文学习——《Good View Hunting: Learning Photo Composition from Dense View Pairs》

    论文链接:http://www.zijunwei.org/papers/cvpr18-photo-composition.pdf 代码及数据集链接:https://www3.cs.stonybrook ...

  6. lterator遍历

    iterator是一种接口机制,为各种不同的数据结构提供统一的访问机制 作用: 1.为各种数据结构,提供一个统一的.简便的访问接口: 2.使得数据结构的成员能够按某种次序排列 3.ES6创造了一种新的 ...

  7. delphi DBGrid简单自绘(字体颜色、背景等)

    delphi DBGrid简单自绘(字体颜色.背景等)  从网上找的代码 应该是C#写的,其实delphi 的操作类似: 1 2 3 4 5 6 7 8 9 10 11 12 13 void __fa ...

  8. lua之table|模块|包

    一.table table是   Lua的一种数据结构用来帮助我们创建不同的数据类型,如:数字.字典等. Lua table使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是   ni ...

  9. NX二次开发-UFUN创建块UF_MODL_create_block

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> UF_initialize(); UF_FEATURE_SIGN Sign = ...

  10. 其它课程中的python---4、Matplotlib最最最最简单使用

    其它课程中的python---4.Matplotlib最最最最简单使用 一.总结 一句话总结: 慢慢来吧,不着急,心态平和和沉稳:每次和世界交互,你就能感受到无比的自信 1.如何区别python2和p ...