2010-03-02 33 views

回答

20

不,它不是在每个请求调用。它只在servlet的初始化过程中调用,这通常只会在webapp的一生中发生一次。另请参阅this answer了解更多详细信息,了解如何创建和执行servlet。如果你实际上想做一些全局/应用范围的初始化(因此它本身并不仅限于特定的servlet),那么你通常会使用ServletContextListener来实现这一点。你可以在contextInitialized()方法中做初始化的东西。

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

@WebListener 
public class Config implements ServletContextListener { 
    public void contextInitialized(ServletContextEvent event) { 
     // Do stuff during webapp's startup. 
    } 
    public void contextDestroyed(ServletContextEvent event) { 
     // Do stuff during webapp's shutdown. 
    } 
} 

如果你不上Servlet 3.0但并不能升级,因此无法使用@WebListener注解,那么你需要手动注册在/WEB-INF/web.xml象下面这样:

<listener> 
    <listener-class>com.example.Config</listener-class> 
</listener> 
+0

感谢, ,,那么contextInitialized和init()之间的主要区别是什么,首先应该运行什么? – mebada 2010-03-02 16:07:27

+1

在webapp启动时执行'ServletContextListener#contextInitialized()'。 'HttpServlet#init()'在servlet启动时执行。我认为现在应该很明显,当webapp尚未启动时,servlet不能被初始化/启动。检查链接到其他答案来获取图片。如果你想挂钩webapp的启动,你通常使用'contextInitialized()'。如果你想挂钩servlet的启动,你通常使用'init()'。这就是全部。如果你甚至不知道你自己的代码应该做什么,那么我会再次思考一次(或者提出一个问题) – BalusC 2010-03-02 16:12:36

+0

我将加载配置文件以便稍后用于每个请求。 – mebada 2010-03-02 16:23:57

1

init()仅在创建servlet时被调用。这可能会在服务器的生命周期中发生多次。您可以使用它来初始化常规使用该servlet所需的任何变量或逻辑。

编辑: 在重新阅读您的文章后,并没有在技术上调用每个请求,因为服务器正在为每个请求创建一个新的servlet实例。检查你的服务器设置,看它是否会在服务器的整个生命周期中获得一个保持单个servlet的新servlet。

相关问题