2011-02-28 23 views
12

Cuando descompilo el GenericServlet y compruebo el init(), veo el siguiente código.¿Para qué se utiliza el método init() del servlet?

public void init(ServletConfig servletconfig) 
    throws ServletException 
{ 
    config = servletconfig; 
    init(); 
} 

public void init() 
    throws ServletException 
{ 
} 

¿Qué está haciendo el método init aquí? Me estoy perdiendo de algo ?

+2

No relacionado con la pregunta: la mayoría de los servletcontenedores son de código abierto. Puede descargar el código fuente de su servletcontainer desde su página de inicio. Incluye la API de Servlet. No es necesario descompilarlo manualmente :) – BalusC

+0

@BalusC puedes, pero es un proceso tedioso. Para "verificar lo que hace esta cosa", prefiero la descompilación también. – Bozho

+3

@Bozho: las fuentes decompiladas no contienen javadocs. Es tal vez una tediosa tarea de una sola vez, pero después de eso puede simplemente incluir la fuente en su IDE y nunca tendrá que enfrentar una página de "fuente desconocida" y/o descompilar cada pequeña clase individualmente. – BalusC

Respuesta

8

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 
* 
*/ 

Por lo tanto, no hace nada y es sólo una conveniencia.

+2

¿Por qué no podemos poner todo el código de inicialización/init dentro del constructor del servlet? En realidad, mi libro hace la pregunta de esta manera: '¿Por qué hay un método init()? En otras palabras, ¿por qué el constructor no es suficiente para inicializar un servlet? ¿Qué tipo de código pondrías en el método init()? –

+2

_Bueno, en JDK 1.0 (para el cual los servlets fueron escritos originalmente), los constructores para clases Java cargadas dinámicamente (como servlets) no pudieron aceptar argumentos. Por lo tanto, para proporcionar a un nuevo servlet cualquier información sobre sí mismo y su entorno, un servidor debe llamar al método init() de un servlet y pasar un objeto que implementa la interfaz ServletConfig_ - Programación Java Servlet de Jason Hunter con William Crawford – Kay

12

Sí, no hace nada. Podría haber sido abstracto, pero luego cada servlet se vería obligado a implementarlo. De esta forma, de manera 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. 
} 
+0

Pero no se sirven solicitudes hasta que se llame al método init(). Si no ocurre nada en el método init, ¿cuál es el punto? – vinoth

+4

Su servlet puede anular esto y especificar lo que debería suceder – Bozho

+1

@Bozho - ¿Por qué no podemos poner todo el código de inicialización/init dentro del constructor del servlet? En realidad, mi libro hace la pregunta de esta manera: '¿Por qué hay un método init()? En otras palabras, ¿por qué el constructor no es suficiente para inicializar un servlet? ¿Qué tipo de código pondrías en el método init()? –

3

El constructor puede no tener acceso a ServletConfig ya que el contenedor no ha llamado al método init(ServletConfig config).

init() 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 implementa ServletConfig que tiene getServletContext método. para que su método personalizado de servlets init tenga acceso a ambos.

Cuestiones relacionadas