2010-03-02 50 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。

相關問題