之前一直对监听知识有个概念,最近业务需要用到了才真正有点了解了监听器的好处。
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