2010-03-02 16 views

Respuesta

20

No, no se llama en cada solicitud. Solo se llama durante la inicialización del servlet, lo que generalmente ocurre solo una vez en la vida útil de la aplicación. También vea this answer para conocer con más detalle cómo se crean y se ejecutan los servlets.

Si realmente desea hacer alguna inicialización global/de toda la aplicación (que, por lo tanto, no está vinculada per se solo al servlet particular), entonces normalmente usaría el ServletContextListener para esto. Puede hacer las cosas de inicialización en el método contextInitialized().

import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import javax.servlet.annotation.WebListener; 

@WebListener 
public class Config implements ServletContextListener { 
    public void contextInitialized(ServletContextEvent event) { 
     // Do stuff during webapp's startup. 
    } 
    public void contextDestroyed(ServletContextEvent event) { 
     // Do stuff during webapp's shutdown. 
    } 
} 

Si no estás en Servlet 3.0 todavía y no se puede actualizar, y por lo tanto no se puede utilizar @WebListener anotación, a continuación, es necesario registrarse manualmente en /WEB-INF/web.xml, como a continuación:

<listener> 
    <listener-class>com.example.Config</listener-class> 
</listener> 
+0

gracias, ,, entonces, ¿cuál es la principal diferencia entre contextInitialized e init(), qué debería ejecutarse primero? – mebada

+1

El 'ServletContextListener # contextInitialized()' se ejecuta en el inicio de webapp. El 'HttpServlet # init()' se ejecuta en el inicio del servlet. Creo que ahora debería ser obvio para usted que los servlets no se pueden inicializar/iniciar cuando todavía no se ha iniciado la aplicación web. Verifique el enlace a la otra respuesta para obtener la imagen. Normalmente usas 'contextInitialized()' si quieres enganchar el inicio de webapp. Normalmente usa 'init()' si quiere enganchar el arranque del servlet. Eso es realmente todo. Si ni siquiera sabe lo que se supone que debe hacer su propio código, entonces lo reconsideraría una vez más (o haría una pregunta) – BalusC

+0

Cargaré los archivos de configuración para usarlos más adelante con cada solicitud. – mebada

1

init() solo se llama al crear el servlet. Esto puede suceder varias veces durante la vida del servidor. Lo usa para inicializar cualquier variable o lógica requerida para el uso regular del servlet.

Editar: Después de volver a leer su publicación, técnicamente no se llama con cada solicitud porque el servidor está creando una nueva instancia del servlet para cada solicitud. Verifique la configuración de su servidor para ver si obtendrá un nuevo servlet de mantener un solo servlet durante la vida útil del servidor.

Cuestiones relacionadas