web监听器
web监听器的定义;
web监听器是servlet规范中定义的一种特殊类;
用于监听servletContext(application) 、 HttpSession (session)、ServeletRequest (request)等域对象的创建与销毁事件;
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。 由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
在Servlet API中有一个ServletContextListener接口,它能够监听ServletContext对象的生命周期,实际上就是监听Web应用的生命周期。
可以在事件发生前、发生后做一些必要的处理;用于监听域对象的属性发生修改的事件;
web监听器的用途;
1.统计在线人数和在线用户;
2.系统启动时加载初始化信息;
3.统计网站访问量;
4.跟SPring结合;
第一个web监听器;
步骤:1.创建一个实现监听器接口的类;2.配置web.xml 进行注册;(点击desgin)然后选中Lister,之后把实现的类路径选中,就好了
按监听的对象划分:
1.用于监听应用程序环境对象(ServletContext)的事件监听器;
2.用于监听用户会话对象(HttpSession)的事件监听器;
3.用于监听请求消息对象(ServletRequset)的事件监听器;
按监听的事件划分:
1.监听域对象自身的创建和销毁的事件监听器;
2.监听域对象的属性的增加和删除监听器;
3.监听绑定到HttpSession域的某个对象的事件监听器;
监听域对象自身的创建和销毁的事件监听器;
在servlet规范中呢,定义了三个接口,分别是ServletContextListener HttpSessionLister ,ServletRequestLister来监听ServletContext,HttpSession,ServletRequset
对象的创建和销毁;
1.ServletContext的创建和销毁:
ServletContext实现了ServletContextListener 这个接口;来监听这个对象的创建和销毁;
ServletContextListener 有两个方法:
public void contextInitialized(ServletContextEvent sce)
ServletContext创建时调用;
public vod contextDestoryed(ServletContextEvent sce)
ServletContext销毁时调用;
事例代码:
public class MyServletContextListener implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent arg0) { System.out.println("contextDestroyed"); } @Override public void contextInitialized(ServletContextEvent arg0) { System.out.println("contextInitialized"); } }
2.HttpSession的对象创建与销毁;
HttpSession实现了HttpSessionLister 这个接口;来监听这个对象的创建和销毁;
HttpSessionLister有两个方法:
public void sessionCreated(HttpSessionEvent sce)
Session创建时调用;
public vod sessionDestroyed(((HttpSessionEvent sce);
Session销毁时调用; 用途:统计访问人数;记录访问日志;
session创建的时间,当用户打开浏览器,第一次访问我们的网站的时候,这个时候,session对象就会被创建;可以在session保存一些信息;
销毁session对象:有三种方法;1.手动的点击退出的时候,程序会去调用销毁的方法,2,当关闭浏览器的时候,session对象也会被销毁。3,没有关闭浏览器,
但是会话超时了,这个时候session对象也会被销毁;
我们可以在web.xml中配置
<session-config> <time-out>1</time-out> </session-config>
事例代码:
package com.imooc.listener; import java.util.ArrayList; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import com.imooc.entity.User; import com.imooc.util.SessionUtil; @WebListener public class MyHttpSessionListener implements HttpSessionListener { private int userNumber = 0; @Override public void sessionCreated(HttpSessionEvent arg0) { userNumber++; arg0.getSession().getServletContext().setAttribute("userNumber", userNumber); } @Override public void sessionDestroyed(HttpSessionEvent arg0) { userNumber--; arg0.getSession().getServletContext().setAttribute("userNumber", userNumber); ArrayList<User> userList = null;//在线用户List userList = (ArrayList<User>)arg0.getSession().getServletContext().getAttribute("userList"); if(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId())!=null){ userList.remove(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId())); } } }
ServletRequest实现了ServletRequestListener 接口;
public void requestDestroyed(ServletRequestEvent arg0)
Request创建时调用;
public void requestInitialized(ServletRequestEvent arg0)
Request销毁时调用; 用途:读取参数;记录访问历史;
事例代码:
import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpServletRequest; @WebListener public class MyServletRequestListener implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent arg0) { } @Override public void requestInitialized(ServletRequestEvent arg0) { System.out.println("fff"); } }