1、Servlet监听器的概念web
Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的建立与销毁事件,以及监听这些域对象中属性发生修改的事件。数据库
监听对象:缓存
一、ServletContext:application,整个应用只存在一个tomcat
二、HttpSession:session,针对每个对话服务器
三、ServletRequest:request,针对每个客户请求session
监听内容:建立、销毁、属性改变事件app
监听做用:能够在事件发生前、发生后进行一些处理,通常能够用来统计在线人数和在线用户、统计网站访问量、系统启动时初始化信息等。网站
2、监听器的基本使用spa
建立步骤:日志
一、建立一个实现监听器接口的类
二、配置web.xml文件,注册监听器
<listener> <listener-class>完整类名</listener-class> </listener>
监听器的启动顺序:按照web.xml的配置顺序来启动
加载顺序:监听器>过滤器>Servlet
3、监听器的分类
3.1 按照监听的对象划分
一、用于监听应用程序环境对象(ServletContext)的事件监听器,实现ServletContextListener、ServletContextAttributeListener接口
二、用于监听用户会话对象(HttpSeesion)的事件监听器,实现HttpSessionListener、HttpSessionAttributeListener接口
三、用于监听请求消息对象(ServletRequest)的事件监听器,实现ServletRequestListener、ServletRequestAttributeListener接口
3.2按照监听事件划分
一、监听域对象自身的建立和销毁的事件监听器
根据监听对象不一样分别实现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"); } }
二、监听域对象中的属性的增长和删除的事件监听器
根据监听对象不一样分别实现ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener接口。
实现方法:attributeAdded、attributeRemoved、attributeReplaced
三、监听绑定到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接口
4、Servlet3.0下监听器的使用
4.1 使用条件
一、使用servlet3.0新标准的jar包
二、JDK在1.6以上版本
三、编译器的编译级别为6.0
四、在web.xml文件中,使用3.0规范
五、使用支持servlet3.0特性的web容器,好比tomcat7
4.2 servlet3.0下监听器的用法
使用注解 @WebListener 便可,没法去定义监听器的顺序
属性名 | 类型 | 是否可选 | 描述 |
value | String | 是 | 该监听器的描述信息 |
@WebListener("This is a listener") public class FirstListener impliements ServletRequestListener{}
该注解用于将类声明为监听器,被 @WebListener 标注的类必须实现如下至少一个接口:
ServletContextListener
ServletContextAttributeListener
ServletRequestListener
ServletRequestAttributeListener
HttpSessionListener
HttpSessionAttributeListener
参考资料:慕课网【JAVA Web开发技术应用——监听器】http://www.imooc.com/learn/271