2

我有一个依赖于一些初始化的网络应用程序(即需要启动一些线程)。

就像是:

public Class Init {
   private static resource ....
   static {
      // my initialization
   }

   public static void init(){}
}

所以我把我所有的初始化东西都放在了Init 中,在每个jsp页面中我都要调用.init()方法……init方法是空的,他的目的是启动Init类的初始化。这就是我认为我的初始化只开始一次的原因。

但是我仍然必须在任何页面(或 servlet)中手动调用 .init() 方法......调用的第一个页面(具有此初始化)将执行所需的操作,此后所有其他页面都受到保护(因为资源已经初始化)。但这有一个星期的位置,如果我错过了一个页面,并且用户调用了该页面......

有没有办法指示Tomcat在应用程序启动后自动执行我的初始化?

4

1 回答 1

4

您可以使用ServletContextListener. 让你的Init类实现这个接口。如果您喜欢将初始化代码从静态块移动到contextInitialized()方法,则可以。

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class Init implements ServletContextListener {

  private static resource;

  public void contextInitialized(ServletContextEvent sce) {
    // your initialization
  }

  public void contextDestroyed(ServletContextEvent sce) { 
    // empty  
  }
}

请注意,您需要通过将以下内容添加到您的web.xml

<listener>
  <listener-class>package.path.to.Init</listener-class>
</listener>

因为,您现在还可以访问ServletContext(调用 sce.getServletContext()),您可以(如果选择)将任何内容注册为上下文属性,并使其可用于应用程序中的任何 servlet 或 JSP。

于 2013-05-19T15:01:54.757 回答