Java 我们可以在contextInialized方法中调用getServletContext()吗?
在此代码中创建实现Java 我们可以在contextInialized方法中调用getServletContext()吗?,java,servlets,servletcontextlistener,Java,Servlets,Servletcontextlistener,在此代码中创建实现contextInitializer接口的servlet 然后使用此行访问contextinitialized()中的文件 InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties")); 发生了此异常 java.lang.NullPointerException at javax.servlet.GenericServlet.
contextInitializer
接口的servlet
然后使用此行访问contextinitialized()
中的文件
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
发生了此异常
java.lang.NullPointerException at
javax.servlet.GenericServlet.getServletContext(GenericServlet.java:160)
有什么想法吗?我不熟悉您提到的ContextInitializer接口,但基于您遇到的异常情况,我的第一反应是不,您不能在contextInitialized方法内调用getServletContext。如果您签出,您将看到,在第160行,它试图从ServletConfig获取上下文,显然该servlet的ServletConfig对象尚未初始化 在我看来,您最好的选择是在ServletConfig和ServletContext都已初始化的情况下执行您想要运行的代码——因为我不熟悉您使用的环境(如我所说,我不熟悉ContextInitializer,所以我不知道它从何而来),就servlet生命周期而言,我真的帮不了你多少忙
取决于你想做什么,你可以考虑将输入流作为静态字段。在您的doGet/doPost方法中,您要检查它是否已经初始化——如果已经初始化,那么很好,继续正常工作;如果没有,则根据需要初始化它。您的上下文和配置应该在doGet/doPost中可用,因此您应该准备就绪。
提供了提供方法的参数 因此,这应该做到:public void contextInitialized(ServletContextEvent event) {
InputStream input = event.getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
// ...
}
也就是说,您通常不希望servlet实现这个接口。听众有不同的目的。只需按如下方式覆盖该选项:
protected void init() throws ServletException {
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/file.properties"));
// ...
}