Servlet细节———< load-on-startup >配置

来源:互联网 发布:怎样学好linux 编辑:程序博客网 时间:2024/06/05 19:49

Servlet细节———< load-on-startup >配置


需求:当我们的网站启动的时候,可能会要求初始化一些数据(比如创建临时表),再比如我们的网站定时要求完成一些任务[定时写日志,定时备份数据,定时发邮件等等]

解决方法:可以通过< load-on-startup >配合线程知识解决。

定义发电子邮件的类

public class Email extends Thread{public void run(){    int i = 0;    try{        while(true){        //每休眠一分钟,就去扫描sendmail,看看哪份信件应当被发送        Thread.sleep(10*1000);        System.out.println("发出第"+(++i)+"邮件");}    }catch(Exception e){      e.printStackTrace();    }}}

然后创建一个Servlet调用Email类,并且把< load-on-startup >元素配置为1:

import java.io.IOException;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//下面语句加了注释后就得自己在xml文件中配置<servlet>元素//@WebServlet("/InitServlet")public class InitServlet extends HttpServlet {public InitServlet() {    super();}public void init(ServletConfig config) throws ServletException {    System.out.println("Init One");    Email email = new Email();    email.start();}public void destroy() {}}

再定义一个Servlet文件,把< load-on-startup >元素配置为2:

import java.io.IOException;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;//@WebServlet("/InitServlet2")public class InitServlet2 extends HttpServlet {public InitServlet2() {    super();}public void init(ServletConfig config) throws ServletException {    System.out.println("Init2");}public void destroy() {}}

配置web.xml文件

<servlet>  <servlet-name>InitServlet</servlet-name>  <servlet-class>com.Test.InitServlet</servlet-class>  <load-on-startup>2</load-on-startup></servlet><servlet>  <servlet-name>InitServlet2</servlet-name>  <servlet-class>com.Test.InitServlet2</servlet-class>  <load-on-startup>1</load-on-startup></servlet>

值得注意的是最好不要再做映射了,防止别人手动调用。

结果:

虽然会有报错说找不到路径,原因就是没有加映射,但不要紧,因为我们想要的还是会出来,Init One比Init2 先出现,而且每间隔10秒就有发送邮件的信息发出来。

解释:

1.load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。

2.它的值必须是一个整数,表示servlet应该被载入的顺序

3.当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;

4.当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。

5.正数的值越小,该servlet的优先级越高,应用启动时就越先加载。

6.当值相同时,容器就会自己选择顺序来加载。