## Llamar a un Servlet desde otro Servlet

Para hacer que nuestro servlet llame a otro servlet, podemos:

- Un servlet puede hacer peticiones HTTP a otro servlet. La apertura de una conexión URL se explica en las páginas de la sección Trabajar con URLs.

- Un servlet puede llamar directamente a los métodos públicos de otros servlet, si los dos se están ejecutando dentro del mismo servidor.

Esta página explica la segunda opción. Para llamar directamente a los métodos públicos de otro servlet, debemos:

- Conocer el nombre del servlet al que queremos llamar.

- Obtener el acceso al objeto Servlet del servlet.

- Llamar al método público del servlet.

Para obtener el acceso al objetoServlet, utilizamos el método getServlet del objeto ServletContext. Obtener el objeto ServletContext desde el objeto ServletConfig almacenado en el objeto Servlet. Un ejemplo aclarará esto. Cuando el servlet BookDetail llama al servlet BookDB, el servlet BookDetail obtiene el objeto Servlet del BookDB Servlet de esta forma:

    public class BookDetailServlet extends HttpServlet {

        public void doGet (HttpServletRequest request,
                           HttpServletResponse response)
            throws ServletException, IOException
        {
            ...
                BookDBServlet database = (BookDBServlet)
                    getServletConfig().getServletContext().getServlet("bookdb");
            ...
        }
    }

Una vez que tenemos el objeto Servlet, podemos llamar a cualquiera de los métodos públicos del servlet. Por ejemplo, el servlet BookDetail llama al método getBookDetails del servlet BookDB:

    public class BookDetailServlet extends HttpServlet {

        public void doGet (HttpServletRequest request,
                           HttpServletResponse response)
            throws ServletException, IOException
        {
            ...
                BookDBServlet database = (BookDBServlet)
                    getServletConfig().getServletContext().getServlet("bookdb");
                BookDetails bd = database.getBookDetails(bookId);
            ...
        }
    }

Debemos tener precaución cuando llamemos a métodos de otro servlet. Si el servlet al que queremos llamar implementa el interface SingleThreadModel, nuestra llamada podría violar la naturaleza mono-thread del servlet. (El servidor no tiene forma de intervenir y asegurarse de que nuestra llamada suceda cuando el servlet no está interactuando con otro cliente). En este caso, nuestro servlet debería hacer una petición HTTP al otro servlet en vez de llamar directamente a sus métodos.

Ozito