之前一直对监听知识有个概念,最近业务需要用到了才真正有点了解了监听器的好处。
web项目的监听事件与监听器:
ServletAPI中的6个事件类:
ServletContextEvent:该类表示上下文(ServletContext)事件,当应用上下文对象发生变化,如创建或销毁上下文对象时,将触发上下文事件
ServletContextAttributeEvent:该类表示上下文(ServletContext)属性事件,当应用上下文属性改变,例如增加、删除、覆盖上下文中的属性时,将触发上下文属性事件
ServletRequestEvent:该类表示请求(ServletRequest)事件,当请求对象发生改变,例如创建或者销毁请求对象,将触发此事件
ServletRequestAttributeEvent:该类表示请求(ServletRequest)属性事件,当请求中的属性发生改变,触发该事件
HttpSessionEvent:该类表示会话(HttpSession)事件,当会话对象发生改变,例如创建或者销毁会话对象,活化或者钝化会话对象,将触发此事件
HttpSessionBindingEvent:该类表示会话(HttpSession)绑定事件,当会话中的属性发生变化,例如增加删除覆盖会话中
Servlet API针对每种事件类型,都定义了至少一种借口来处理该事件,这些接口都以Listener结尾,成为监听器接口,共有如下8种接口。
ServletConetxListener:上下文监听器,监听ServletContextEvent事件
ServletContextaAttributeListener:上下文属性监听器,用来监听ServletRequestAttributeEvent事件
ServletRequestListener:请求监听器,监听ServletRequestEvent事件。
ServletRequestAttributeListener:请求属性监听器,用来监听ServletRequestAttributeEvent事件
HttpSessionListener:会话监听器,监听HttpSessionEvent事件
HttpSessionActivationListener:会话活化监听器,监听HttpSessionEvent事件
HttpSessionAttributeListener:会话属性监听器,监听HttpSessionBindingEvent事件
HttpSessionBindingListener:会话绑定监听器,监听HttpSessionBindingEvent事件。
我这里是要求定时任务,我不知道如何让他实现程序开始自动启动。刚开始使用的是java程序。然后发现java程序不会定时,百度发现使用web程序,容器启动后让容器自动调用即可。
这个时候看到了别人写法使用了监听器,豁然开朗,于是也使用ServletContextListener实现了定时任务的功能:
public class AliRepayHistoryTask { public void task(){ Timer timer = new Timer(); TimerTask timerTask = new TimerTask() { @Override public void run() { fetchAliRepayHistory(); } }; timer.schedule(timerTask, new Date(2017 - 1900, 7, 14, 14, 2), 60*60*24); } public void fetchAliRepayHistory(){ JdbcUtil jdbcUtil = new JdbcUtil(); String sql = " select bill_seq_no , to_char(to_date(last_update_date, 'yyyyMMddHH24miss'), 'yyyy-MM-dd HH24:mi:ss') " + " from acl.pay_order " + " where " + " status = 'S' " + " and gate_id = '1003' " + " and last_update_date >= ? " + " and last_update_date <= ? " + " order by last_update_date asc"; String yesterday = DateUtil.getDateString(DateUtil.addDay(new Date(), -1), "yyyyMMdd"); String yesterdayBegin = yesterday + "000000"; String yesterdayEnd = yesterday + "235959"; Object[] params = new Object[]{yesterdayBegin, yesterdayEnd}; List<Order> orders = jdbcUtil.query(sql, params, new ResultHandler<List<Order>>() { public List<Order> handler(ResultSet rs) throws SQLException { List<Order> list = new ArrayList<Order>(); while(rs.next()){ Order order = new Order(); order.setBillSeqNo((String)rs.getObject(1)); order.setCreateDate((String)rs.getObject(2)); list.add(order); } return list; } }); try { FileOutputStream outputStream = new FileOutputStream(new File("C:/Users/zhen/Desktop/每日支付宝付款报表.txt"), true); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter((outputStream))); bufferedWriter.newLine(); bufferedWriter.write(yesterday.substring(0, 4) + "-" + yesterday.substring(4, 6) + "-" + yesterday.substring(6, 8) + ":"); bufferedWriter.newLine(); for(Order order : orders){ bufferedWriter.write("billSeqNo=" + order.getBillSeqNo() + ", createDate=" + order.getCreateDate()); bufferedWriter.newLine(); } bufferedWriter.close(); outputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } public class AliRepayHistoryTaskListener implements ServletContextListener{ public void contextInitialized(ServletContextEvent servletContextEvent) { new AliRepayHistoryTask().task(); } public void contextDestroyed(ServletContextEvent servletContextEvent) { } } <listener> <listener-class>com.listener.AliRepayHistoryTaskListener</listener-class> </listener>
参考链接:http://blog.csdn.net/l1028386804/article/details/52727297