Solución:
Sí, no hace nada. Podría haber sido abstracto, pero luego cada servlet se vería obligado a implementarlo. De esta forma, de forma predeterminada, no ocurre nada en init()
y cada servlet puede anular este comportamiento. Por ejemplo, tiene dos servlets:
public PropertiesServlet extends HttpServlet {
private Properties properties;
@Override
public void init() {
// load properties from disk, do be used by subsequent doGet() calls
}
}
y
public AnotherServlet extends HttpServlet {
// you don't need any initialization here,
// so you don't override the init method.
}
Desde el javadoc:
/**
*
* A convenience method which can be overridden so that there's no need
* to call <code>super.init(config)</code>.
*
* <p>Instead of overriding {@link #init(ServletConfig)}, simply override
* this method and it will be called by
* <code>GenericServlet.init(ServletConfig config)</code>.
* The <code>ServletConfig</code> object can still be retrieved via {@link
* #getServletConfig}.
*
* @exception ServletException if an exception occurs that
* interrupts the servlet's
* normal operation
*
*/
Entonces no hace nada y es solo una conveniencia.
Es posible que el constructor no tenga acceso a ServletConfig
ya que el contenedor no ha llamado init(ServletConfig config)
método.
init()
el método se hereda de GenericServlet
que tiene un ServletConfig
como su propiedad. así es como HttpServlet
y cualquier servlet personalizado que escriba extendiendo HttpServlet
obtiene ServletConfig
.
y GenericServlet
implementos ServletConfig
que tiene getServletContext
método. entonces tus servlets personalizados init
tendrá acceso a ambos.