我们可以在contextInialized方法内调用getServletContext()吗?
创建的servlet,在这个代码实现contextInitializer
接口,我们可以在contextInialized方法内调用getServletContext()吗?
然后使用该行
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
访问内部contextinitialized()
文件这个异常发生
java.lang.NullPointerException at
javax.servlet.GenericServlet.getServletContext(GenericServlet.java:160)
什么想法?
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"));
// ...
}
我不熟悉你引用的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中可用,所以你应该很好走。