一,监听器定义
指专门用于对其他对象身上发生的 事件 或 状态改变 进行监听和相应处理的对象,当被监视对象发生变化时,立即采取相应的行动。
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: