мы можем сделать getwriter и вперед в одном сервлете - PullRequest
0 голосов
/ 03 июня 2010

Допустим, моя форма называется сервлетом. Я бы сделал некоторую обработку в нем. В сервлете я хочу что-то напечатать на странице. для этого я использовал

PrintWriter out=response.getWriter();
 out.println("some text here");

затем в сервлете я выполнил еще некоторую обработку формы, которая прекрасно работает, и после этого я хочу, чтобы сервлет был перенаправлен на страницу jsp. Для этого я использовал

RequestDispatcher rd = request.getRequestDispatcher("/somepage.jsp");
 rd.forward(request, response);

проблема возникает здесь. текст

some text here

печатается, но сервлет не пересылает запрос на страницу jsp, как будто код не запускается.

1 Ответ

0 голосов
/ 03 июня 2010

Нет, вы не можете этого сделать. Если вы исследовали файлы журнала сервера, то должны были заметить что-то вроде IllegalStateException: cannot forward, response already committed.

При записи чего-либо в ответ будет зафиксирован ответ и отправлены заголовки ответа и записанные байты на стороне клиента. Но отправка перенаправления впоследствии может потребовать изменения заголовков ответа, и это больше невозможно, потому что они уже отправлены. Сервер не может получить уже отправленный заголовок и байты назад и повторить ответ. Это точка невозврата.

Также считается плохой практикой выводить некоторые выходные данные HTML / шаблона внутри сервлета. Вы должны делать это в JSP. Вы можете хранить сообщения в области запроса и использовать EL в JSP для их отображения.

Например:

request.setAttribute("message", "some message"); // Will be available as ${message}
request.getRequestDispatcher("/somepage.jsp").forward(request, response);

и somepage.jsp

<p>Message: ${message}</p>
...