Java监听器(Listener)
Servlert的监听器Listener,它是实现了javax.servlet.ServletContextListener接口的服务器端程序,随着web应用的启动而启动,只初始化一次,随web应用的停止而销毁。
1.主要作用:
application、session、request三个对象创建、销毁时候或者往其中添加修改删除属性时自动执行代码的功能组件
做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者一个固定的对象等等
1 2 3 4 5 6 7
| public interface ServletContextListener extends EventListener { public void contextInitialized(ServletContextEvent sce); public void contextDestroyed(ServletContextEvent sce); }
|
1.ServletContextListener:对Servlet上下文的创建和销毁进行监听。
1 2 3 4 5 6 7 8 9 10 11
| class test implements ServletContextListener{
contextInitialized(ServletContextEvent sce) ;
contextDestroyed(ServletContextEvent sce); }
|
2.ServletContextAttributeListener:监听Servlet上下文属性的添加、删除和替换。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class test implements ServletContextAttributeListener{ @Override public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) { System.out.println("添加了一个ServletContext属性");
} @Override public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) { System.out.println("移除了一个ServletContext属性"); } @Override public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) { System.out.println("修改了一个ServletContext属性的作用范围"); } }
|
3.HttpSessionListener:对Session的创建和销毁进行监听。
1 2 3 4 5 6 7 8 9
| class test implements HttpSessionListener{
public void sessionCreated(HttpSessionEvent se);
public void sessionDestroyed(HttpSessionEvent se);
public HttpSession getSession(); }
|
补充:session的销毁有两种情况:1.session超时
2.通过调用session对象的invalidate()方法使session失效。
4.HttpSessionAttributeListener:对Session对象中属性的添加、删除和替换进行监听。
1 2 3 4 5 6 7 8 9 10
| class test implements HttpSessionAttributeListener{ public void attributeAdded(HttpSessionBindingEvent se); public void attributeRemoved(HttpSessionBindingEvent se); public void attributeReplaced(HttpSessionBindingEvent se);
public String getName(); public Object getValue(); public HttpSession getSession(); }
|
5.ServletRequestListener:对请求对象的初始化和销毁进行监听。
1 2 3 4 5 6 7
| class test implements ServletRequestListener{ public void requestInitialized(ServletRequestEvent sre); public void requestDestroyed(ServletRequestEvent sre);
public ServletRequest getServletRequest(); public ServletContext getServletContext(); }
|
6.ServletRequestAttributeListener:对请求对象属性的添加、删除和替换进行监听。
1 2 3 4 5 6 7 8
| class test implements ServletRequestAttributeListener{ public void attributeAdded(ServletRequestAttributeEvent srae); public void attributeRemoved(ServletRequestAttributeEvent srae); public void attributeReplaced(ServletRequestAttributeEvent srae);
public String getName(); public Object getValue(); }
|
2.常见使用场景:
初始化基础数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
@Component public class ListenerTest implements ServletContextListener, ApplicationContextAware { private static ApplicationContext applicationContext; @SuppressWarnings("static-access") public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext=applicationContext; }
@Override public void contextInitialized(ServletContextEvent servletContextEvent) { ServletContext servletContext = servletContextEvent.getServletContext(); StudentService studentService = (StudentService) applicationContext.getBean("studentService"); System.out.println(studentService.list()); servletContext.setAttribute("学生列表",studentService.list()); } @Override public void contextDestroyed(ServletContextEvent sce) {
} }
|
统计当前在线人数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| @Component public class SessionListenerTest implements HttpSessionListener {
public static int ONLINE_USERS_TOTAL = 0;
@Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { ServletContext application = httpSessionEvent.getSession().getServletContext(); Integer online_users_total = (Integer) application.getAttribute("ONLINE_USERS_TOTAL"); if(ONLINE_USERS_TOTAL==0){ application.setAttribute("ONLINE_USERS_TOTAL",1); }else{ application.setAttribute("ONLINE_USERS_TOTAL",online_users_total); } ONLINE_USERS_TOTAL++; System.out.println(ONLINE_USERS_TOTAL+"login"); }
@Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { ServletContext application = httpSessionEvent.getSession().getServletContext(); ONLINE_USERS_TOTAL--; application.setAttribute("ONLINE_USERS_TOTAL",ONLINE_USERS_TOTAL); System.out.println(ONLINE_USERS_TOTAL+"logout"); } }
|
定期清理session
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
@Component public class SessionScanerListener implements HttpSessionListener, ServletContextListener { @SuppressWarnings("unchecked") List<HttpSession> sessionList = Collections.synchronizedList(new LinkedList<HttpSession>()); private Object lock = new Object();
public void sessionCreated(HttpSessionEvent httpSessionEvent) { System.out.println("session 创建成功..."); HttpSession httpSession = httpSessionEvent.getSession(); synchronized (lock){ sessionList.add(httpSession); } }
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { System.out.println("session 销毁成功..."); } public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("web应用关闭..."); }
public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("web应用初始化..."); Timer timer = new Timer(); timer.schedule(new MyTask(sessionList,lock), 0, 1000*30); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public class MyTask extends TimerTask { private List<HttpSession> list; private Object lock; public MyTask(List<HttpSession> list, Object lock){ this.list = list; this.lock = lock; } @Override public void run() { synchronized (lock){ System.out.println("定时器开始执行..."); ListIterator<HttpSession> listIterator = list.listIterator(); while(listIterator.hasNext()){ HttpSession httpSession = listIterator.next(); if(System.currentTimeMillis() - httpSession.getLastAccessedTime() > 1000*30){ httpSession.invalidate(); listIterator.remove(); } } } } }
|