【问题标题】:Load On Start Up using Annotation in JAVA使用 JAVA 中的注释在启动时加载
【发布时间】:2013-09-19 11:19:18
【问题描述】:

我有这个代码,

@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 上使用 load on startup?

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

【问题讨论】:

  • 您的容器使用的是哪个版本的 Servlet API?您的应用程序是如何安装在容器中的? (注解看起来是正确的,所以问题可能出在您的容器配置上。)
  • 感谢您的支持。我的 Servlet 版本 API 是 3.0,我使用的是 tomcat 7。我在 IntelliJ IDEA 12.1.4 上部署我的应用程序,使用 war exploded。
  • 你能显示你的 web.xml 吗?
  • 我的 web.xml 是空白的。我不使用,因为所有注释。
  • 这个注解解决了我的问题:@WebServlet(name="InitializeResources", urlPatterns="/initializeResources", loadOnStartup=1) 我不知道为什么,但是它起作用了。

标签: java tomcat servlets annotations


【解决方案1】:

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

如果你想在 servlet 启动时做一些事情(即元素 loadOnStartup 的值大于或等于 0,0),你需要将代码放在 init 方法或小服务程序:

@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 的回答。

【讨论】:

    【解决方案2】:
    @WebServlet(name="InitializeResources", urlPatterns="/initializeResources", loadOnStartup=1)
    

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

    【讨论】:

    • 谢谢,如果没有 urlPatterns,我的就无法工作。为什么需要 urlPatterns?
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-29
      • 1970-01-01
      • 2012-08-14
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 2015-12-20
      • 1970-01-01
      相关资源
      最近更新 更多