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