2010-02-23 51 views
1

創建的servlet,在這個代碼實現contextInitializer接口,我們可以在contextInialized方法內調用getServletContext()嗎?

然後使用該行

InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties")); 

訪問內部contextinitialized()文件這個異常發生

java.lang.NullPointerException   at  
    javax.servlet.GenericServlet.getServletContext(GenericServlet.java:160) 

什麼想法?

回答

1

ServletContextListener#contextInitialized()爲您提供ServletContextEvent參數,它爲您提供了getServletContext()方法。

因此,這應該這樣做:

public void contextInitialized(ServletContextEvent event) { 
    InputStream input = event.getServletContext().getResourceAsStream("/WEB-INF/file.properties")); 
    // ... 
} 

這就是說,你通常不希望你的servlet來實現這個接口。聽衆有不同的目的。只需覆蓋HttpServlet#init()如下:

protected void init() throws ServletException { 
    InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties")); 
    // ... 
} 
1

我不熟悉你引用的ContextInitializer接口,但基於異常你得到我的第一反應是,不,你不能調用contextInitialized方法中的getServletContext。如果您檢出http://www.docjar.com/html/api/javax/servlet/GenericServlet.java.html,您會發現在160行,它試圖從ServletConfig獲取上下文,顯然該servlet的ServletConfig對象尚未初始化。

你最好的選擇(在我看來)將執行你想運行的代碼在ServletConfig和ServletContext都被初始化的地方運行 - 因爲我不熟悉你正在使用的環境(就像我說過的,我對ContextInitializer不熟悉,所以我不知道它來自哪裏),但我的真正幫助不會超過您的servlet生命週期。

根據你想要做什麼,你可能會考慮把你的輸入流作爲一個靜態字段。在你的doGet/doPost方法中,你會檢查它是否已經被初始化 - 如果它已經存在,那麼很好,像平常一樣繼續;如果沒有,則根據需要進行初始化。你的上下文和配置應該在doGet/doPost中可用,所以你應該很好走。

相關問題