Как выполнить несколько сервлетов последовательно?


Я только начинаю с сервлетов, и мне удалось создать несколько сервлетов, которые действуют как отдельные URL-адреса для заполнения базы данных для некоторого фиктивного тестирования. Что-то из формы:

public class Populate_ServletName extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
     resp.setContentType("text/plain");
     //Insert records
     //Print confirmation
  }
}
У меня есть около 6 таких сервлетов, которые я хочу выполнить в последовательности. Я думал использовать setLocation, чтобы установить следующую страницу для перенаправления, но не был уверен, что это правильный подход, потому что перенаправления должны происходить после вставки записей. В частности, я ищу что-то вроде этого:
public class Populate_ALL extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
     resp.setContentType("text/plain");
     //Call Populate_1
     //Call Populate_2
     //Call Populate_3
     //...
  }
}

Есть предложения?

2 3

2 ответа:

Использование RequestDispatcher#include() на URL-адрес, соответствующий url-pattern сервлета.

public class Populate_ALL extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     response.setContentType("text/plain");
     request.getRequestDispatcher("/populateServlet1").include(request, response);
     request.getRequestDispatcher("/populateServlet2").include(request, response);
     request.getRequestDispatcher("/populateServlet3").include(request, response);
     //...
  }
}

Примечание: если эти сервлеты не могут использоваться независимо , то это неправильный подход, и вы должны использовать автономные классы Java для этого, которые не расширяют HttpServlet. В вашем конкретном случае, я думаю, что шаблон Builder может представлять интерес.

RequestDispatcher#forward() не подходит здесь, так как он выбрасывает IllegalStateException, когда заголовки ответа уже зафиксированы. Это, несомненно, будет иметь место, когда вы передаете запрос/ответ через несколько сервлетов, каждый из которых записывает ответ.

HttpServletResponse#sendRedirect() абсолютно не подходит здесь, так как он неявно создает совершенно новые request и response, тем самым уничтожая оригинальные.

См. также:

Похоже, что вам может понадобиться сервис, который каждый из сервлетов может использовать для выполнения некоторой работы. Тогда сервлеты не зависят друг от друга, а скорее все используют сервис.

Однако вот объяснениепересылки или перенаправления запросов .