Как исправить Не удается вызвать sendRedirect() после того, как ответ был исправлен?
Я пытаюсь передать значения с сервлета на страницу 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();
}
}
когда я запускаю свою страницу, которую я получаю:
Ошибка:
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)
Я попытался использовать:
RequestDispatcher dd=request.getRequestDispatcher("usertaskpage.jsp");
dd.forward(request, response);
но я получил ту же ошибку.
Как исправить эту ошибку?
Ответы
Ответ 1
вы уже отправили ответ в блоке catch:
RequestDispatcher dd = request.getRequestDispatcher("error.jsp");
dd.forward(request, response);
поэтому вы не можете снова вызвать:
response.sendRedirect("usertaskpage.jsp");
поскольку он уже отправлен (зафиксирован).
Итак, что вы можете сделать:
сохраните строку, чтобы указать, где вам нужно перенаправить ответ.
String page = "";
try {
} catch (Exception e) {
page = "error.jsp";
} finally {
page = "usertaskpage.jsp";
}
RequestDispatcher dd=request.getRequestDispatcher(page);
dd.forward(request, response);
Ответ 2
вы не можете вызвать sendRedirect(), после того как вы уже использовали forward(). Итак, вы получаете это исключение.
Ответ 3
Основной причиной исключения IllegalStateException является сервлет Java, который пытается записать в выходной поток (ответ) после того, как ответ был зафиксирован.
Всегда лучше следить за тем, чтобы контент не добавлялся в ответ после перенаправления или перенаправления, чтобы избежать исключения IllegalStateException. Это можно сделать, включив оператор return непосредственно рядом с оператором forward или redirect.
ОФИЦИАЛЬНАЯ ЛИНИЯ JAVA 7
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ