Поддерживает ли RequestDispatcher прямой HTTP-метод запроса?

Я хочу перехватить запрос с помощью RequestDispatcher, а затем я хочу перенаправить запрос на другой сервлет - что-то вроде этого:

RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet/some.ThirdPartyServlet" + "?" + "param_name=" + "somevalue");
dispatcher.forward(request, response);

Если входящий запрос был POST, будет ли диспетчер запросов принимать мои новые параметры и включать их в тело сообщения, или это пересылка теперь станет GET?

Ответы

Ответ 1

Он сохраняет исходный запрос, не меняя его.

Итак, он останется POST, если он был POST.

Ответ 2

Я думаю, что ваша забота скорее о наличии переданных запросов параметров (а не атрибутов, как упоминают другие). В этом случае не имеет значения, используете ли вы переадресацию или перенаправление. Но если вы перейдете к другому Servlet, тогда будет вызван соответствующий метод, связанный с исходным запросом, полученный с помощью HttpServletRequest#getMethod(). Если это POST, то будет вызываться doPost(). Вы все равно можете получить дополнительные параметры в строке запроса обычным способом с помощью HttpServletRequest.getParameter().

Итак, в основном в servlet1:

protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    request.getRequestDispatcher("servlet2?foo=bar").forward(request, response);
}

в основном может обрабатываться servlet2 следующим образом:

protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    String foo = request.getParameter("foo"); // Returns "bar".
}

Ответ 3

Если вы используете forward, тогда управление остается в контейнере сервлета, атрибуты запроса сохраняются, а запрос остается POST. Это когда вы используете перенаправление, чтобы он вызывал ответ в браузер, заставляя его делать запрос GET, где он теряет атрибуты запроса для исходного запроса, потому что GET является совершенно новым запросом.