Как выполнить несколько сервлетов последовательно?
Я только начинаю с сервлетов, и мне удалось создать несколько сервлетов, которые действуют как отдельные 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 ответа:
Использование
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
, тем самым уничтожая оригинальные.См. также:
Похоже, что вам может понадобиться сервис, который каждый из сервлетов может использовать для выполнения некоторой работы. Тогда сервлеты не зависят друг от друга, а скорее все используют сервис.
Однако вот объяснениепересылки или перенаправления запросов .