Soy nuevo en Servlets. Quiero usar un método que se llama una sola vez después de implementarlo en el servidor. Miré en HttpServlet#init()
. Pero descubrí que se llama con cada solicitud. ¿Lo entendí mal? ¿Cuáles son las alternativas al init()
?Quiero utilizar un método que se llama una sola vez después de la implementación en Servidor
Respuesta
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>
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.
¿Está buscando un ServletContextListener?
- 1. Afirmando que un método se llama exactamente una vez
- 2. Android: FastScrolling SectionIndexer getSections() se llama una sola vez
- 3. ¿Por qué se llama al constructor una sola vez?
- 4. trozo de código que se llama solo una vez: ¿merece un método propio?
- 5. método IOS canAuthenticateAgainstProtectionSpace no se llama cada vez que
- 6. Llamar a una macro cada vez que se llama a un método - Objetivo C
- 7. HttpWebRequest.GetResponse() se cuelga la segunda vez que se llama
- 8. .replaceWith() trabajando una sola vez
- 9. Despedir a un evento cada vez que un nuevo método se llama
- 10. AngularJS ¿se puede llamar a un método $ on más de una vez para una sola emisión $?
- 11. android HttpResponse siempre muere la segunda vez que se llama
- 12. ¿Alguna vez se llama al método de actualización?
- 13. ExpandableLists en Android, quiero permitir que solo una lista primaria se expanda a la vez
- 14. Funciones que se puede llamar una sola vez
- 15. Ejecutar un método una sola vez al principio antes de ejecutar cualquier prueba en PyUnit
- 16. ¿Se calcula javascript str.length cada vez que se llama o solo una vez?
- 17. UIScrollView llama a layoutSubviews() cada vez que se desplaza
- 18. Dinámicamente incluyendo archivos javascript una sola vez
- 19. Manera pitónica de trabajar solo la primera vez que se llama una variable
- 20. Método virtual que no se llama
- 21. CASCADE DELETE una sola vez
- 22. Android: 'Pantalla de bienvenida' una sola vez
- 23. Desplazamiento de UIScrollView en una sola dirección a la vez
- 24. Uso grep para que coincida con un patrón en una línea de una sola vez
- 25. TabHost setCurrentTab sólo se llama al método alcrear para la actividad en la Tab vez
- 26. Cómo hacer que Mock devuelva una nueva lista cada vez que se llama al método usando Moq
- 27. Buscar tres números apareció una sola vez
- 28. asp.net garantizar javascript se carga una sola vez
- 29. ¿Qué método de actividad se llama primero?
- 30. Lo que se llama un nodo en una implementación WebSpere Red
gracias, ,, entonces, ¿cuál es la principal diferencia entre contextInitialized e init(), qué debería ejecutarse primero? – mebada
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
Cargaré los archivos de configuración para usarlos más adelante con cada solicitud. – mebada