16

我有这个代码,

@WebServlet(value="/initializeResources", loadOnStartup=1)
public class InitializeResources extends HttpServlet {

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
      System.out.println("HEREEEE");
  }

}

但是当 Web 应用程序启动时 servlet 并没有启动。

如何在 Servlet Annotation 上使用启动时的负载?

我的 Servlet API 是 3.0,我使用的是 Tomcat 7

4

3 回答 3

17

使用您当前的代码,您需要执行 GET 请求以查看输出HEREEEE

如果你想在 servlet 启动时做一些事情(即loadOnStartup值大于或等于 0 的元素,0),你需要将代码放在 init 方法或 servlet 的构造函数中:

@Override
public void init() throws ServletException {
    System.out.println("HEREEEE");
}

使用侦听器在应用程序范围内(在 中)启动资源可能更方便ServletContext

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class InitializeListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("On start web app");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("On shutdown web app");
    }

}

例如,请参阅我对Share variables between JAX-RS requests问题的回答。

于 2013-09-15T04:28:36.420 回答
6
@WebServlet(name="InitializeResources", urlPatterns="/initializeResources", loadOnStartup=1)

urlPatterns 以确保 web 容器找到 servlet 路径。

于 2015-09-09T11:32:19.657 回答
1

loadOnStartup为 Servlet 指定时,容器只会加载和预实例化 Servlet 的实例,以准备处理可能出现的任何 GET/POST 请求。这本身不会导致doGet()或被doPost()解雇,因为尚未处理实际的客户端请求。那么,它有什么用呢?

好吧,loadOnStartup通常用于具有大量初始化代码的 Servlet;比如说,他们可能会进行 JNDI 调用以获取资源或数据库调用以使用一些后端值填充本地数据结构。在没有loadOnStartup第一个客户端请求的情况下,由于所有这些额外的初始化内容,可能会非常缓慢,因此预先实例化它是有意义的。

现在,您的自定义初始化代码(JNDI、JDBC)将进入一个GenericServlet#init()被 servlet 容器调用的重写方法,以向 servlet 指示它正在投入使用。

于 2013-09-15T05:14:01.197 回答