实现tomcat启动时自动运行代码

方法1:tomcat 自动执行servlet

写一个servlet,在init()方法中写好想要执行的程序,程序如下:

eclipse新建一个web\Dynamic Web Project , name = myweb1 , 把tomcat中的 servlet-api.jar复制到lib中,新建一个类MyServlet.java, 继承 javax.servlet.HttpServlet,代码如下:

 

 

  1. package org.cai;  
  2.   
  3. import javax.servlet.ServletException;  
  4. import javax.servlet.http.HttpServlet;  
  5.   
  6. public class MyServlet extends HttpServlet {  
  7.   
  8.     @Override  
  9.     public void init() throws ServletException {  
  10.         // TODO Auto-generated method stub   
  11.         super.init();  
  12.         System.out.println("自动加载启动.");  
  13.         System.out.println("自动加载启动.");  
  14.         for(int i = 0; i < 10; i++){  
  15.               
  16.             System.out.println(i + "、 自动加载启动.");  
  17.         }  
  18.     }  
  19.   
  20.       
  21. }  
package org.cai;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class MyServlet extends HttpServlet {

	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		super.init();
		System.out.println("自动加载启动.");
		System.out.println("自动加载启动.");
		for(int i = 0; i < 10; i++){
			
			System.out.println(i + "、 自动加载启动.");
		}
	}

	
}


 

 

同时,在web.xml配置文件内容如下:

 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <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">  
  3.   <display-name>myweb1</display-name>  
  4.   <welcome-file-list>  
  5.     <welcome-file>index.jsp</welcome-file>  
  6.   </welcome-file-list>  
  7.   <servlet>  
  8.    <servlet-name>MyServlet</servlet-name>  
  9.    <servlet-class>org.cai.MyServlet</servlet-class>  
  10.    <STRONG><load-on-startup>0</load-on-startup></STRONG>  
  11.   </servlet>  
  12.   <servlet-mapping>  
  13.    <servlet-name>MyServlet</servlet-name>  
  14.    <url-pattern>/</url-pattern>  
  15.   </servlet-mapping>  
  16. </web-app>     
<?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>myweb1</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
   <servlet-name>MyServlet</servlet-name>
   <servlet-class>org.cai.MyServlet</servlet-class>
   <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
   <servlet-name>MyServlet</servlet-name>
   <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>   


 

 

其中<load-on-startup>0</load-on-startup>即可实现tomcat启动时执行该servlet

load-on-startup的值必须为整数

当load-on-startup值为负整数或者未指定时,容器在该servlet被调用时加载

当其值为0和正整数时,容器启动时加载,值越小,优先级越高

使用虚拟路径部署到tomcat中:在 tomcat的 server.xml的 </Host>前加入:

<Context debug="0" docBase="F:/studyworkspace/myweb1/WebRoot" path="myweb1" reloadable="true">
     </Context>

 

docBase为 myweb1的webroot的路径 ,path为上下文
方法2:Servlet侦听器

要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口,同时实现它的contextInitialized(ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数。

listener类如下:

 

  1. package org.cai;  
  2.   
  3. import javax.servlet.ServletContextEvent;  
  4. import javax.servlet.ServletContextListener;  
  5.   
  6. public class MyListener implements ServletContextListener {  
  7.   
  8.     private java.util.Timer timer = null ;  
  9.     public void contextDestroyed(ServletContextEvent event) {  
  10.         // TODO Auto-generated method stub   
  11.   
  12.     }  
  13.   
  14.     public void contextInitialized(ServletContextEvent event) {  
  15.   
  16.         timer = new java.util.Timer(true) ;  
  17.         event.getServletContext().log("定时器已启动。") ;  
  18.         timer.schedule(new MyTask(event.getServletContext()), 05000) ;  
  19.         event.getServletContext().log("已经添加任务调度表。" ) ;  
  20.           
  21.     }  
  22.   
  23. }  
package org.cai;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyListener implements ServletContextListener {

	private java.util.Timer timer = null ;
	public void contextDestroyed(ServletContextEvent event) {
		// TODO Auto-generated method stub

	}

	public void contextInitialized(ServletContextEvent event) {

		timer = new java.util.Timer(true) ;
		event.getServletContext().log("定时器已启动。") ;
		timer.schedule(new MyTask(event.getServletContext()), 0, 5000) ;
		event.getServletContext().log("已经添加任务调度表。" ) ;
		
	}

}


 


contextInitialized函数里的内容将被自动执行
最后在web.xml里面添加一个监听节点就行了
  <listener>
   <listener-class>org.cai.MyListener</listener-class>
  </listener>

完整web.xml如下

 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <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">  
  3.   <display-name>myweb2</display-name>  
  4.   <welcome-file-list>  
  5.     <welcome-file>index.jsp</welcome-file>  
  6.   </welcome-file-list>  
  7.   <listener>  
  8.     <listener-class>org.cai.MyListener</listener-class>  
  9.   </listener>  
  10. </web-app>  
<?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>myweb2</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <listener>
  	<listener-class>org.cai.MyListener</listener-class>
  </listener>
</web-app>


 

如果要执行定时任务,就在自动执行的代码里面使用 java.util.Timer以及创建一个继承java.util.TimerTask的类。示例:

  1. package org.cai;  
  2.   
  3. import java.util.TimerTask;  
  4.   
  5. import javax.servlet.ServletContext;  
  6.   
  7. public class MyTask extends TimerTask {  
  8.   
  9.      private static boolean isRunning = false;   
  10.      private ServletContext context = null;   
  11.   
  12.      public MyTask(ServletContext context){  
  13.            
  14.          this.context = context ;  
  15.      }  
  16.     @Override  
  17.     public void run() {  
  18.   
  19.         if (! isRunning){  
  20.             System.out.println("开始执行指定任务.") ;  
  21.             //if (C_SCHEDULE_HOUR == c.get(Calendar.HOUR_OF_DAY)) {  
  22.                 isRunning = true ;  
  23.                 context.log("开始执行指定任务.") ;  
  24.                 //TODO 添加自定义的详细任务,以下只是示例   
  25.                 int i = 0;   
  26.                 while (i++ < 10) {   
  27.                     context.log("已完成任务的" + i + "/" + 10);   
  28.                     //System.out.println("已完成任务的" + i + "/" + 1000) ;  
  29.                 }   
  30.           
  31.                 isRunning = false;   
  32.                 context.log("指定任务执行结束");   
  33.                 System.out.println("指定任务执行结束") ;  
  34.   
  35.             //}  
  36.         }else{  
  37.               
  38.             context.log("上一次任务执行还未结束");   
  39.   
  40.         }  
  41.     }  
  42.   
  43. }  
package org.cai;

import java.util.TimerTask;

import javax.servlet.ServletContext;

public class MyTask extends TimerTask {

	 private static boolean isRunning = false; 
	 private ServletContext context = null; 

	 public MyTask(ServletContext context){
		 
		 this.context = context ;
	 }
	@Override
	public void run() {

		if (! isRunning){
			System.out.println("开始执行指定任务.") ;
			//if (C_SCHEDULE_HOUR == c.get(Calendar.HOUR_OF_DAY)) {
				isRunning = true ;
				context.log("开始执行指定任务.") ;
				//TODO 添加自定义的详细任务,以下只是示例 
				int i = 0; 
				while (i++ < 10) { 
					context.log("已完成任务的" + i + "/" + 10); 
					//System.out.println("已完成任务的" + i + "/" + 1000) ;
				} 
		
				isRunning = false; 
				context.log("指定任务执行结束"); 
				System.out.println("指定任务执行结束") ;

			//}
		}else{
			
			context.log("上一次任务执行还未结束"); 

		}
	}

}


以上两种方法部署到tomcat,运行tomcat\bin\startup.bat,即可看到效果,其中方法2中的日志写入到tomcat\logs\localhost.xxxx-xx-xx.log文件中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值