监听器的定义
(专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生变化时,立即采取相应的行动)
定义:Servlet规范中定义的一种特殊的类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁时间,以及用于监听域对象的属性发生修改的事件,监听器对象可以在事件发生前、发生后做一些必要的处理
WEB应用中的监听器:
由Servlet规范提供的,可以监视客户端的请求以及服务端的操作,同时可以监视1.ServletContext(application,容器创建并且初始化的,范围整个Web应用,整个Web应用只有一个application对象,Web容器关闭就会销毁application对象)、
2.HttpSession(session,是一种保存上下文的机制,针对每一个会话,放在服务器端,通过session的id进行区分的,浏览器和服务器结束后,就会把session进行销毁)、
3.ServletRequest(request,客户发送请求时,容器就会创建一个ServletRequest对象,进行封装请求数据,同时会创建一个ServletResponse对象,进行封装响应数据,访问请求结束之后,request对象就会被销毁)。
第一个监听器案例
步骤1:创建一个类并实现ServletContextListener接口(javax.servlet),并且实现了contextInitialized方法和contextDestroyed方法
步骤2:web.xml配置监听对象
监听器的启动顺序
注册顺序加载监听器,如果注册含有过滤器、监听器、Servlet,
监听器优先级>过滤器优先级>Servlet优先级
监听器的分类
按监听的对象划分
【a】用于监听应用程序环境对象(ServletContext)的事件监听器。
【b】用于监听用户会话对象(HttpSession)的事件监听器
【c】用于监听请求消息对象(ServletRequest)的事件监听器
按监听的事件划分
【a】监听域对象自身的创建和销毁的事件监听器
定义:监听的对象包括ServletContext、HttpSession、ServletRequest,Servlet规范中定义了三个接口ServletContextListener、HttpSessionListener、ServletRequestListener来监听这三个对象的创建及销毁事件。
【b】监听域对象中的属性的增加和删除的事件监听器
【c】监听绑定到HttpSession域中的某个对象的状态的事件监听器
ServletContext事件监听器
ServletContext的创建及销毁:ServletContext实现了ServletContextListener接口来监听该对象的创建及销毁事件,一个Web应用下可以创建多个ServletContextListener,但是一个Web应用中只有一ServletContext对象,ServletContextListener对象的contextInitialized方法和contextDestroyed方法(主要用于数据库连接关闭时,可以释放一些资源,以免过度的占用),方法里的参数ServletContextEvent可以获取ServletContext以及获取一些初始化参数。
ServletContextListener主要用途:做一些定时器:可以加载一些全局属性对象,可以创建全局的数据库连接,以及加载一些缓存信息。
getServletContext():通过参数ServletContextEvent获取ServletContext对象,并且可以往全局变量ServletContext中存入变量,通过setAttribute方法,这样就可以在其他地方进行获取。
getInitParameter():通过ServletContext对象获取初始化参数(初始化参数在web.xml中进行配置)。
servletcontextlistener可以用于初始化各种属性,或者在结束时释放相关资源
HttpSession的事件监听器
监听域对象(HttpSession):HttpSession实现了HttpSessionListener接口,用于监听该对象的创建及销毁事件,一个HttpSession对象可以注册多个HttpSessionListener接口,一个Web应用中也可以有多个HttpSession对象,HttpSessionListener有sessionCreated(HttpSessionEvent se)和sessionDestroyed(HttpSessionEvent se),分别是session创建和销毁时调用,方法里的参数可以获取当前创建的HttpSession对象。
HttpSessionListener主要用途
统计在线人数,记录访问日志(在后台把访问人的访问时间和ip做一些统计数据)
HttpSession对象的创建和销毁:
session对象的创建是在用户第一次打开浏览器,第一次访问Wen应用时,这次对话Web容器就会分配一个session,用户可以在session里保存一些信息,session对象的销毁第一是关闭服务器,会调用销毁方法,第二种是关闭浏览器session会被销毁(session不一定会立即销毁,该时间不是一个量化的),第三种,不关闭浏览器,session超时(可以通过在web.xml中配置
ServletRequest的监听器
ServletRequest对象的创建和销毁:ServletRequest的创建和销毁是实现了ServletRequestListener接口,一个ServletRequest对象可以注册多个ServletRequestListener接口,并且实现了requestInitialized(ServletRequestEvent sre)request创建时被调用,requestDestroyed(ServletRequestEvent sre)request销毁时调用。
ServletRequestListener主要用途:读取request里的参数,记录访问历史、访问路径,都可以通过它来进行监听(监听到每一个用户的访问请求,请求结束后就会执行销毁方法,有getServletContext方法和getServletRequest方法)。
HttpSession中的对象状态
(1)绑定:通过setAttribute();
(2)解除绑定:removeAttribute();
(3)钝化:将session对象序列化到存储设备上
(4)活化:将session对象从存储设备上进行恢复
session钝化机制:
(1)把服务器中不常使用的session对象暂时的序列化到系统文件或是数据库中,当使用时反序列化到内存中,整个过程有服务器自动完成。
(2)session的钝化机制由SessionManager管理
Servlet3.0下监听器的使用
Servlet2.5下可以定义监听器的顺序,通过在web.xml中定义,Servlet3.0通过注解@WebListener实现这一功能,就不需要在web.xml配置Listener。
注意:@WebListener方式不能实现设置顺序功能