2010-02-23 48 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中可用,所以你应该很好走。

相关问题