Java 如何修复在响应提交后无法调用 sendRedirect()?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/26352632/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
how to fix Cannot call sendRedirect() after the response has been committed?
提问by MMMMS
I am trying to pass values from servlet to jsp page using the code below:
我正在尝试使用以下代码将值从 servlet 传递到 jsp 页面:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
try {
System.out.println("try");
String taskid=request.getParameter("id");
convty = new Connectivity();
con = convty.setConnection();
st=con.createStatement();
query="select * from task_table";
rset=convty.getResultSet(query, con);
while(rset.next()) {
System.out.println("while");
lst.add(rset.getString("task_id"));
lst.add(rset.getString("date"));
lst.add(rset.getString("project_name"));
}
rset.close();
System.out.println("after while");
} catch(Exception e) {
RequestDispatcher dd= request.getRequestDispatcher("error.jsp");
dd.forward(request, response);
} finally {
System.out.println("finally1");
HttpSession sessionvar = request.getSession();
sessionvar.setAttribute("TaskData", "lst");
response.sendRedirect("usertaskpage.jsp");
lst.clear();
out.close();
}
}
when I run my page I am getting:
当我运行我的页面时,我得到:
Error :
错误 :
java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:483)
src.Taskservlet.doPost(Taskservlet.java:108)
javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
I tried to use:
我尝试使用:
RequestDispatcher dd=request.getRequestDispatcher("usertaskpage.jsp");
dd.forward(request, response);
but I got the same error.
但我遇到了同样的错误。
How to fix this error?
如何修复此错误?
采纳答案by Nomesh DeSilva
you have already forwarded the response in catch block:
您已经在 catch 块中转发了响应:
RequestDispatcher dd = request.getRequestDispatcher("error.jsp");
dd.forward(request, response);
so, you can not again call the :
所以,你不能再次调用:
response.sendRedirect("usertaskpage.jsp");
because it is already forwarded (committed).
因为它已经被转发(提交)了。
So what you can do is: keep a string to assign where you need to forward the response.
所以你可以做的是:保留一个字符串来分配你需要转发响应的位置。
String page = "";
try {
} catch (Exception e) {
page = "error.jsp";
} finally {
page = "usertaskpage.jsp";
}
RequestDispatcher dd=request.getRequestDispatcher(page);
dd.forward(request, response);
回答by DeepInJava
you can't call sendRedirect(), after you have already used forward(). So, you get that exception.
在您已经使用了 forward()之后,您无法调用sendRedirect ()。所以,你得到了那个例外。
回答by sunleo
The root cause of IllegalStateException exception is a java servlet is attempting to write to the output stream (response) after the response has been committed.
IllegalStateException 异常的根本原因是 Java servlet 在响应提交后试图写入输出流(响应)。
It is always better to ensure that no content is added to the response after the forward or redirect is done to avoid IllegalStateException. It can be done by including a ‘return' statement immediately next to the forward or redirect statement.
最好确保在完成转发或重定向后没有向响应添加任何内容以避免 IllegalStateException。可以通过在 forward 或 redirect 语句旁边包含一个“return”语句来完成。