Чтобы Ваш сервлет вызвал другой сервлет, Вы можете:

  • Либо дать сервлету сделать HTTP запрос к другому сервлету. (Это относится к общему программированию на Java. Для более подробной информации, обратитесь к ресурсу Работа с URL-ами.)
  • Либо сервлет может вызвать общедоступные методы другого сервлета напрямую, если оба сервлета запущены на одном и том же сервере.

Этот урок обсуждает второй из вышеуказанных пунктов. Чтобы вызвать общедоступный метод другого сервлета напрямую, Вам надо:

  • Знать имя сервлета, метод которого Вы хотите вызвать.
  • Получить доступ к объекту сервлета Servlet.
  • Вызвать общедоступный метод.

Чтобы получить доступ к объекту Servlet, используйте метод getServlet класса ServletContext. Получите объект ServletContext из объекта ServletConfig, который находится в объекте Servlet. Пример поможет Вам разобраться. Когда сервлет BookDetail вызывает сервлет BookDB, сервлет BookDetail запрашивает объект Servlet сервлета BookDB вот так:

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

Как только Вы получили объект сервлета, Вы можете вызывать любой общедоступный метод этого сервлета. Например, сервлет BookDetail вызывает метод getBookDetails сервлета 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);
        ...
    }
}

Вам надо проявлять осторожность при вызове методов другого сервлета. Если сервлет, который Вы хотите вызывать, реализует интерфейс SingleThreadModel, Ваш вызов может нарушить природу однопотокового сервлета. (Сервер не может вмешаться и обеспечить, чтоб вызов был в момент, когда никто не взаимодействует с сервлетом.) В таком случае, Ваш сервлет должен использовать HTTP запрос к другому сервлету вместо прямых вызовов методов.