但行好事  莫问前程

使用@WebServlet注解配置loadOnStartup不起作用的解决方法

通过配置<load-on-startup>1</load-on-startup>可以让该servlet在系统启动的时候进行初始化,在web.xml中的配置如下,代码如下:

<servlet>
        <!-- Servlet名 -->
        <servlet-name>timerServlet</servlet-name>
        <!-- Servlet的实现类 -->
        <servlet-class>org.light4j.servlet.lifecycle.TimerServlet</servlet-class>
        <!-- 配置应用启动时,创建Servlet实例 ,相当于指定@WebServlet的loadOnStartup属性 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

Servlet3.0开始,servlet即支持web.xml配置,也支持在servlet上面进行注解配置,官方文档说在注解上配置loadOnStartup=1可以达到和web.xml配置<load-on-startup>1</load-on-startup>同样的效果,但是实际情况并不是这样,程序启动之后该servlet并不运行,代码如下:

package org.light4j.servlet.lifecycle;

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

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

/**
 * Servlet生命周期
 * 
 * @author longjiazuo
 * 
 */
@WebServlet(loadOnStartup = 1)
public class TimerServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    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();
    }
}

后来查找资料,需要在注解上面加上urlPatterns属性,在web.xml里可以不用配置这个<url-pattern>,但是使用servlet3.0注解必须要有urlPatterns,完整代码如下:

package org.light4j.servlet.lifecycle;

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

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

/**
 * Servlet生命周期
 * 
 * <p>
 * 下面的注解如果不添加urlPatterns={"/timerServlet"},则定时器不起作用。
 * 
 * @author longjiazuo
 * 
 */
@WebServlet(urlPatterns = { "/timerServlet" }, loadOnStartup = 1)
public class TimerServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    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();
    }
}

这样配置之后就可以了。

打赏
欢迎关注人生设计师的微信公众账号
公众号ID:longjiazuoA

未经允许不得转载:人生设计师 » 使用@WebServlet注解配置loadOnStartup不起作用的解决方法

分享到:更多 ()

人生设计师-接受不同的声音

联系我关于我