Переслать запрос нескольким сервлетам в java

Я хочу переслать запрос нескольким сервлетам в java. Каждый из этих сервлетов будет выполнять свои собственные операции после получения запроса. Мой текущий код делает это:

for(int i=0; i < numServlets; i++) {
    ServletContext servletContext = request.getServletContext();
    RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/"+ globalVars.ServletList[i]);
    requestDispatcher.forward(request, response);
}

Проблема в том, что я получаю ошибку java.lang.IllegalStateException: Cannot forward after response has been committed. Любые идеи о том, как заставить это работать?

Я читал в Интернете, что после пересылки запроса я должен добавить оператор возврата, чтобы выполнить следующий код, но это тоже не сработало.


person d_void    schedule 03.01.2018    source источник


Ответы (2)


Если вы хотите, чтобы запрос обрабатывался несколькими обработчиками, у вас есть несколько вариантов:

1) Большинство обработчиков подготавливают или контролируют данные и могут быть записаны как Filter объекты, зарегистрированные в контейнере сервлетов. Определен только один Servlet для каждого запроса, который отвечает за генерацию ответа.

2) Напишите один Servlet, который затем перебирает «обработчики» и вызывает каждый из них.

3) Напишите несколько классов Servlet и добавьте все, кроме последнего forward(), к следующему Servlet.

Я бы не рекомендовал № 3.

Лучше ли # 1 или # 2, зависит от того, что делают все «сервлеты». Например. обычно пишут фильтры для:

  • логирование
  • Безопасность (например, перенаправление на страницу входа, если вы не вошли в систему)
  • Модификация запроса (например, применение параметра запроса в качестве типа запроса)
  • Обработка ответа (например, сжатие)
person Andreas    schedule 03.01.2018

Ваш объект response поврежден. Вы не можете forward это сделать, пока не перестанете писать ответ.

Поскольку вы пересылаете его в цикле, один из сервлетов может зафиксировать ответ до завершения цикла.

Одна из причин, по которой сервлет может записывать ответ или фиксировать его любым способом после response.sendRedirect() или response.sendError().

person Roman C    schedule 03.01.2018