监听器是一个专门用于对其余对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生状况时,当即采起相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另外一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法当即被执行。java
JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的建立与销毁事件,以及监听这些域对象中的属性发生修改的事件。web
共包括如下3类8种监听器:spring
ServletContext建立与销毁监听:ServletContextListener数据库
Httpsession的建立与销毁监听:HttpSessionListener缓存
HttpServletRequest建立与销毁监听:ServletRequestListenersession
包括属性的添加,删除,替换(key值同样的时候,调用两次set就会触发这个事件)ide
ServletContex的属性变化的监听:ServletContextAttributeListenerurl
Httpsession的属性变化的监听:HttpSessionAttributeListenercode
HttpServletRequest的属性的变化的监听:ServletRequestAttributeListenerxml
保存在Session域中的对象能够有多种状态:
绑定session.setAttribute("bean",Object)到Session中;
从 Session域中解除session.removeAttribute("bean")绑定;
随Session对象持久化到一个存储设备中;
随Session对象从一个存储设备中恢复
Servlet 规范中定义了两个特殊的监听器接口"HttpSessionBindingListener和HttpSessionActivationListener"来帮助JavaBean 对象了解本身在Session域中的这些状态,实现这两个接口的类不须要注册。
HttpSessionBindingListener:实现了HttpSessionBindingListener接口的JavaBean对象能够感知本身被绑定到Session中和 Session中删除的事件
HttpSessionActivationListener:实现了HttpSessionActivationListener接口的JavaBean对象能够感知本身被活化(反序列化)和钝化(序列化)的事件
@WebListener public class MyServletContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("-----------contextInitialized-------------"); } @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("-----------contextDestroyed-------------"); } }
能够实如今系统启动时获取文件或数据库中配置的全局参数、设置系统缓存、预加载内容等。
好比原来SSM项目web.xml文件中spring的配置:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
ServletContextListener的第二个重要应用场景就是可使一些程序跟随系统一块儿运行,好比启动定时任务。
如下是一个quartz定时的启动demo:
public class DemoListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { DemoManager demoManager = null; try { demoManager = new DemoManager(new StdSchedulerFactory().getScheduler()); } catch (SchedulerException e) { e.printStackTrace(); } demoManager.addJob(DemoJob.class,"demoJob","Demo","0/8 * * * * ? "); System.out.println("DemoListener 启动!"); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } }
@WebServlet(name = "MyServlet2", urlPatterns = "/myServlet2") public class MyServlet2 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("----------doPost-----------"); doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("----------doGet-----------"); ServletContext context = getServletContext(); context.setAttribute("name","123"); } }
@WebListener public class MyHttpSessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent event) { System.out.println("session: " + event.getSession().getId() + " Created"); } @Override public void sessionDestroyed(HttpSessionEvent event) { System.out.println("session: " + event.getSession().getId() + " Destroyed"); } }
@WebListener public class MyHttpSessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent event) { System.out.println("session: " + event.getSession().getId() + " Created"); ServletContext context = event.getSession().getServletContext(); Integer count = (Integer) context.getAttribute("onlineCount"); if (null == count) { count = 0; } else { count++; } context.setAttribute("onlineCount", count); } @Override public void sessionDestroyed(HttpSessionEvent event) { System.out.println("session: " + event.getSession().getId() + " Destroyed"); ServletContext context = event.getSession().getServletContext(); Integer count = (Integer) context.getAttribute("onlineCount"); if(null == count){ count = 0; }else{ count--; context.setAttribute("onlineCount", count); } } }