2.7.4 load-on-startup Servlet

2.7.4 load-on-startup Servlet

上一节中已经介绍过,创建Servlet实例有两个时机:用户请求之时或应用启动之时。应用启动时就创建Servlet,通常是用于某些后台服务的Servlet,或者需要拦截很多请求的Servlet;这种Servlet通常作为应用的基础Servlet使用,提供重要的后台服务。
配置load-on-startupServlet有两种方式。

  • web.xml文件中通过<servlet>元素的<load-on-startup>子元素进行配置
  • 通过@WebServlet注解的loadOnStartup属性指定。

<load-on-startup>元素或loadOnStartup属性都只接收一个整型值,这个整型值越小,Servlet就越优先实例化。

使用注解配置load-on-startup的Servlet

TimerServlet.java

下面是一个简单的Servlet,该Servlet不响应用户请求,它仅仅执行计时器功能,每隔一段时间会在控制台打印出当前时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package lee;

import javax.servlet.http.*;
import javax.servlet.*;
import javax.servlet.annotation.*;

import javax.swing.*;
import java.awt.event.*;
import java.util.Date;

@WebServlet(loadOnStartup = 1)
public class TimerServlet extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
super.init(config);
Timer t = new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println(new Date());
}
});
t.start();
}
}

这个Servlet没有提供service()方法,这表明它不能响应用户请求,所以无须为它配置URL映射由于它不能接收用户请求,所以只能在应用启动时实例化。

以上程序中的注解:

1
@WebServlet(loadOnStartup = 1)

在web.xml中配置load-on-startup的Servlet

即可将该Servlet配置了load-on-startup Servlet.除此之外,还可以在web.xml文件中增加如下配置片段。

1
2
3
4
5
6
7
8
9
<servlet>
<!-- Servlet名 -->
<servlet-name>timerServlet</servlet-name>
<!-- Servlet的实现类 -->
<servlet-class>lee.TimerServlet</servlet-class>
<!-- 配置应用启动时,创建Servlet实例
,相当于指定@WebServlet的loadOnStartup属性-->
<load-on-startup>1</load-on-startup>
</servlet>

以上配置片段中粗体字代码指定Web应用启动时,web容器将会实例化该Servlet,且该Servlet不能响应用户请求,将一直作为后台服务执行:每隔1秒钟输出一次系统时间。