2010-11-01 13 views
8

mientras que realmente no puedo pensar en un caso de uso práctico para tal escenario, pero pretendo pura y simplemente que esto sea una pregunta impulsada por la curiosidad.Accediendo a una instancia de servlet

entiendo que el contenedor de servlets se aferra a todas las instancias creadas de los servlets, y los delegados solicitan subprocesos a estas instancias. también tiene sentido mantener estas instancias administradas, para evitar llamadas injustificadas que alteren el ciclo de vida de instancias de servlet fuera del ámbito del contenedor.

pero ¿realmente no hay forma de acceder a las instancias de servlet?

Respuesta

5

Antes de Servlet 2.1 (más de una década de antigüedad), puede usar ServletContext#getServlet() para esto. Sin embargo, está en desuso desde entonces. Simplemente porque es un mal diseño. Si desea invocar otro servlet desde dentro de un servlet en la cadena de solicitud-respuesta, solo use RequestDispatcher#include(). Si desea invocar métodos no servlet específicos de otro servlet, entonces es hora de refactorizar ese código en una clase Java separada que luego podría importar/usar en ambos servlets.

+0

un comportamiento muy interesante de hecho. Solo estaba al tanto de "incluir" en el contexto de las JSP, pero el hecho de que los métodos de servicio de servlet también puedan estar encadenados es una noticia. gracias por el aprendizaje. – anirvan

+0

Aún así, esta técnica debe usarse con sumo cuidado, ya que también indica un olor de diseño. Más que a menudo, el servlet llamante debería haber sido un filtro desde el principio, o debe transformarse para seguir al [controlador frontal] (http://stackoverflow.com/questions/3541077/design-patterns-web-based-applications /) patrón. – BalusC

2

El contenedor crea SOLAMENTE UNA instancia del Servlet y utiliza la misma instancia para atender varias solicitudes. Hay "SingleThreadModel", que si implementa, el contenedor crearía varias instancias del Servlet pero ahora está en desuso.

0

No a través de la API de servlet estándar (por lo que la respuesta es no).

Puede, sin embargo, utilizar su conocimiento de la implementación real y trucos desagradables con la reflexión para obtener la estructura de datos utilizada por la implementación para contener instancias de servlet, (entonces la respuesta es sí).

El contenedor de servlets puede, sin embargo, tener un SecurityManager que prohíba el uso de dichos desagradables trucos (por lo que la respuesta es tal vez).

Cuestiones relacionadas