我有一个依赖于某些初始化的web应用程序(即需要启动一些线程)。
类似的东西:
public Class Init {
private static resource ....
static {
// my initialization
}
public static void init(){}
}
所以我将所有初始化内容放在 Init 类中,在每个jsp页面中我都要调用 .init()方法... init方法为空,他的目的是启动Init类初始化。这就是我认为我的初始化只启动一次。
但是我仍然必须在任何页面(或servlet)中手动调用.init()方法...调用的第一个页面(具有此初始化)将执行所需的操作,并且在此之后每个其他页面都是安全的( '因为资源已经初始化了)。但如果我错过了一个页面,用户会调用该页面,那么这有一周的时间点......
有没有办法指示Tomcat在应用程序启动后自动执行初始化?
答案 0 :(得分: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