我们可以在contextInialized方法中调用getServletContext()吗?

时间:2010-02-23 19:14:40

标签: java servlets servletcontextlistener

在此代码中创建实现contextInitializer接口的servlet,

然后使用此行访问contextinitialized()内的文件

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

发生此异常

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

任何想法?

2 个答案:

答案 0 :(得分: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中可用,所以你应该好好去。

答案 1 :(得分: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"));
    // ...
}