1

我正在尝试从 servlet 使用中获得响应

request.setAttribute(error, error);
request.getRequestDispatcher("http://localhost:8080/redicted_test/Home.jsp").forward(request, response);

String redictedURL="http://localhost:8080/redicted_test/Home.jsp";
response.sendRedirect(redictedURL);

但得到错误

java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed

我知道我发送了两次回复,但我该怎么做呢?你能告诉我最简单的方法吗?

4

4 回答 4

1

您已经转发了请求,现在您正在重定向它

request.getRequestDispatcher("http://localhost:8080/redicted_test/Home.jsp").forward(request, response);
..
response.sendRedirect(redictedURL);

如果你想从 servlet 中设置一些属性并需要在 jsp 上显示,那么只需将请求转发到 jsp 并显示这些属性

于 2012-06-06T07:26:19.883 回答
1

在您的示例中,您已经执行了 jsp,并且渲染的 jsp 被发送到响应缓冲区中。并且由于您已经开始发送响应,因此响应标头已发送。但就在那之后,您想要发送重定向,并且重定向是一种头操作(更改 http 状态代码和位置头)。

于 2012-06-06T07:28:08.787 回答
1

我认为你应该使用include而不是forward..

forward is used to forward a request, that is control is transfered to the
new servler/jsp. u shud take care to not put any our.println() statements 
in the servlet from where u plan to call forward method. in fact u cant even 
fire response.getWriter() method in this case. u can only do that in the servlet
to which the control is bein fwded 

如果您要将请求转发到另一个 servlet 或 JSP,请不要写任何东西来响应。例如,如果 Servlet1 将请求转发给 Servlet2,则 Servlet1 不应该写任何东西来响应,也不应该调用 response.getOutputStream() 方法。这是不允许的,并且无论 servlet1 写入响应的任何内容都不会输出,否则您将得到 IllegalStateException .

include - means that the new servlet/jsp will be procesed and any
out.println()/html stuff will be included and then control will come
back to the servlet/jsp that called include method. 
于 2012-06-06T07:35:28.860 回答
0

在 a 之后RequestDispatcher.forward(),响应将被提交并关闭。您不能将任何标题/内容写入响应。

这就是为什么你不能redirectdo operation which adds header or response content在做之后RequestDispatcher.forward()

您拥有的替代方法是使用包含而不是转发。

但是,我不明白你的用例。您正在转发和重定向到同一页面。

于 2012-06-06T07:35:34.587 回答