Java Servlet重写init(ServletConfig配置)
我试图覆盖init(ServletConfig配置)方法。我的代码是:
public void init(ServletConfig config) throws ServletException { ServletContext sc = getServletContext(); // ----- NullPointerException }
这是给出NullPointerException。
如果我将其修改为:
public void init(ServletConfig config) throws ServletException { ServletContext sc = config.getServletContext(); // ----- works fine }
这很好用。 我知道我们应该覆盖init()方法而不是init(ServletConfig配置)但是
任何人都可以给我正确的理由,为什么会这样?
比较init(ServletConfig)
的文档:
public void init(ServletConfig config)抛出ServletException 由servlet容器调用,以向servlet指示servlet 正在投入使用。 请参阅Servlet #init。 此实现存储ServletConfig对象 它从servlet容器接收供以后使用。 当覆盖 这种forms的方法,调用super.init(config)。
并将其与init()
的文档进行比较:
public void init()抛出ServletException 一种方便的方法,可以被覆盖,所以没有必要 调用super.init(config)。 而不是重写init(ServletConfig),只需覆盖此方法 它将由GenericServlet.init(ServletConfig配置)调用。 该 仍然可以通过getServletConfig()检索ServletConfig对象。
覆盖init(ServletConfig)
,必须要做的第一件事就是调用:
super.init(config);
如果这样做,那么直接调用方法中的getServletContext()
将不再导致NPE。
发生这种情况是因为您重写错误的方法机制如果覆盖
public void init(ServletConfig config) throws ServletException { super.init(config); ServletContext sc = getServletContext(); }
而不是覆盖init(ServletConfig)
,只需覆盖下面的方法,它将由GenericServlet.init(ServletConfig config)
调用GenericServlet.init(ServletConfig config)
public void init() throws ServletException { ServletContext sc = getServletContext(); }
因为在:
public void init(ServletConfig config) throws ServletException { ServletContext sc = getServletContext(); }
你不要调用super.init(ServletConfig)
。 因此,ServletConfig不存储在servlet实例中,后续对getServletConfig的调用将返回null。
只需将super init(config)放在重写方法的第一行即可
public void init(ServletConfig config) throws ServletException