ServletContextListener,Timer,TimerTask学习笔记

1public abstract interface javax.servlet.ServletContextListener extends java.util.EventListener 。此类继承java的事件处理类EventListener, ServletContextListener有两个抽象方法。分别是:

 Apublic abstract void contextInitialized(javax.servlet.ServletContextEvent arg0);// 当web服务器启动的时候启动此方法

Bpublic abstract void contextDestroyed(javax.servlet.ServletContextEvent arg0);//当web服务器关闭的时候调用此方法,(但我在测试的时候却看不到它的调用)。

2假如我们像在web服务启动或则关闭的时候做一些事情,那么只需要写一个类实现ServletContextListener接口就可以了。

3一般会做定时的处理之类的操作,就要用到Timer :一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。

Timer ()
          创建一个新计时器。
Timer (boolean isDaemon)
          创建一个新计时器,可以指定其相关的线程作为守护程序运行。
Timer (String  name)
          创建一个新计时器,其相关的线程具有指定的名称。
Timer (String  name, boolean isDaemon)
          创建一个新计时器,其相关的线程具有指定的名称,并且可以指定作为守护程序运行

 

void cancel ()
          终止此计时器,丢弃所有当前已安排的任务。
 int purge ()
          从此计时器的任务队列中移除所有已取消的任务。
 void schedule (TimerTask  task, Date  time)
          安排在指定的时间执行指定的任务。
 void schedule (TimerTask  task, Date  firstTime, long period)
          安排指定的任务在指定的时间开始进行重复的固定延迟执行
 void schedule (TimerTask  task, long delay)
          安排在指定延迟后执行指定的任务。
 void schedule (TimerTask  task, long delay, long period)
          安排指定的任务从指定的延迟后开始进行重复的固定延迟执行
 void scheduleAtFixedRate (TimerTask  task, Date  firstTime, long period)
          安排指定的任务在指定的时间开始进行重复的固定速率执行
 void scheduleAtFixedRate (TimerTask  task, long delay, long period)
          安排指定的任务在指定的延迟后开始进行重复的固定速率执行

 

 

TimerTask类:由 Timer 安排为一次执行或重复执行的任务。

方法摘要
 boolean cancel ()
          取消此计时器任务。
abstract  void run ()
          此计时器任务要执行的操作。
 long scheduledExecutionTime ()
          返回此任务最近实际 执行的安排 执行时间。

4我的测试代码:

web.xml 写道
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>servlet</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<listener>
<listener-class>com.servlet.listener.teslistener.MytestListener</listener-class>
</listener>

</web-app>

 

MytestListener 写道
package com.servlet.listener.teslistener;

import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MytestListener implements ServletContextListener {

private Timer timer = null;


@Override
public void contextInitialized(ServletContextEvent event) {
event.getServletContext().log("服务器正在启动。。。。。。。。");
timer = new Timer(true);
timer.schedule(new DoTask(), 0, 5 * 1000);
}

/* 当我手动在eclipse里关闭服务器,缺看不到这个方法的执行,
* 当程序在服务器上运行, 而我要改它代码的时候,
* 就能看到这个方法的运行,不知道是为什么 */
@Override
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
event.getServletContext().log("服务器已经关闭。。。。。。。");

}

}

 

DoTask 写道
package com.servlet.listener.teslistener;

import java.util.Calendar;
import java.util.Date;
import java.util.TimerTask;

public class DoTask extends TimerTask {

private static final int defaul_hour=0;
private static final String default_date = "2009-04-25 17:44:00";
@Override
public void run() {
int result=compare();
System.out.println("result is =========="+result);
if(result<0){
Calendar cal=Calendar.getInstance();
// if(cal.get(Calendar.HOUR_OF_DAY)==defaul_hour){
// showConsoleMessage();
// }

showConsoleMessage();
}
else{
System.out.println("时间已经到了,定时器不能在执行。。。。。。");
}
}

public void showConsoleMessage(){
int a=1;
int b=2;
System.out.println("a and b is:"+(a+b));
System.out.println("now time is "+new Date().toString());

}

public int compare(){
String currentTime=GetCurrentTime.getCurrentTime();
int result=TimeCompare.timeCompare(currentTime,default_date);
return result;
}

}

 

GetCurrentTime 写道
package com.servlet.listener.teslistener;

import java.text.SimpleDateFormat;
import java.util.Date;

public class GetCurrentTime {
/*获得当前时间*/
public static String getCurrentTime(){
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(currentTime);
return dateString;
}

}

 

TimeCompare 写道
package com.servlet.listener.teslistener;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class TimeCompare {
/*时间比大小*/
public static int timeCompare(String t1,String t2){
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar c1=Calendar.getInstance();
Calendar c2=Calendar.getInstance();
try {
c1.setTime(formatter.parse(t1));
c2.setTime(formatter.parse(t2));
} catch (ParseException e) {
e.printStackTrace();
}
int result=c1.compareTo(c2);
return result;
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以和你讨论Servlet中的Filter和Listener。 在Servlet中,Filter和Listener是两个重要的组件,它们可以用于在Servlet容器中拦截请求和响应,以及处理Servlet容器中的事件。 Filter是一种拦截器,它可以在请求被Servlet处理之前或响应被发送回客户端之前拦截请求和响应,并对它们进行修改或处理。Filter可以用于对请求进行身份验证、授权、日志记录、压缩、加密等。 在Servlet中,Filter是通过实现javax.servlet.Filter接口来创建的。Filter接口有三个方法:init()、doFilter()和destroy()。其中,init()方法用于初始化Filter,doFilter()方法用于对请求和响应进行处理,destroy()方法用于销毁Filter。 下面是一个简单的Filter示例,它可以对请求进行日志记录: ```java public class LogFilter implements Filter { public void init(FilterConfig config) throws ServletException { // 初始化Filter } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 记录请求日志 System.out.println("Request received from " + request.getRemoteAddr()); // 继续处理请求 chain.doFilter(request, response); // 记录响应日志 System.out.println("Response sent to " + request.getRemoteAddr()); } public void destroy() { // 销毁Filter } } ``` Listener是一种监听器,它可以监听Servlet容器中的事件,例如Servlet的创建和销毁、Session的创建和销毁、ServletContext的创建和销毁等。Listener可以用于在Servlet容器中实现一些全局的业务逻辑,例如初始化数据库连接池、加载配置文件等。 在Servlet中,Listener是通过实现javax.servlet.ServletContextListener接口来创建的。ServletContextListener接口有两个方法:contextInitialized()和contextDestroyed()。其中,contextInitialized()方法在ServletContext被创建时调用,可以用于初始化全局资源;contextDestroyed()方法在ServletContext被销毁时调用,可以用于释放全局资源。 下面是一个简单的Listener示例,它可以在ServletContext被创建时初始化数据库连接池: ```java public class ConnectionPoolListener implements ServletContextListener { public void contextInitialized(ServletContextEvent event) { // 初始化数据库连接池 ConnectionPool pool = new ConnectionPool(); event.getServletContext().setAttribute("connectionPool", pool); } public void contextDestroyed(ServletContextEvent event) { // 释放数据库连接池 ConnectionPool pool = (ConnectionPool) event.getServletContext().getAttribute("connectionPool"); pool.release(); } } ``` 以上就是Servlet中Filter和Listener的简单介绍,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值