Java 在具有try-catch资源的Servlet中提交响应后无法转发
下面的方法抛出:Servlet DetailCakeServlet的Servlet.service()抛出异常Java 在具有try-catch资源的Servlet中提交响应后无法转发,java,servlets,Java,Servlets,下面的方法抛出:Servlet DetailCakeServlet的Servlet.service()抛出异常 java.lang.IllegalStateException:提交响应后无法转发。 代码 try (PrintWriter out = response.getWriter()) { /* TODO output your page here. You may use following sample code. */ CakeDAO dao = n
java.lang.IllegalStateException:提交响应后无法转发。
代码
try (PrintWriter out = response.getWriter()) {
/* TODO output your page here. You may use following sample code. */
CakeDAO dao = new CakeDAO();
String strID = request.getParameter("id");
int id = Integer.parseInt(strID);
request.setAttribute("cake", dao.getCakeById(id));
request.getRequestDispatcher("/WEB-INF/detail.jsp").forward(request, response);
}catch (Exception ex) {
request.getRequestDispatcher("/WEB-INF/error.jsp").forward(request, response);
}
但是,当我删除ResourceOut对象时,它就工作了。原因可能是什么?如上所述(在规范中没有很快找到),在进入catch块之前,try-with-resources构造将尝试关闭try块内部打开的资源,即您的out
,从而关闭响应,在catch
块中尝试重定向时,已关闭。我建议以以下方式处理可能出现的例外情况:
try (PrintWriter out = response.getWriter()) {
try {
CakeDAO dao = new CakeDAO();
String strID = request.getParameter("id");
int id = Integer.parseInt(strID);
request.setAttribute("cake", dao.getCakeById(id));
request.getRequestDispatcher("/WEB-INF/detail.jsp").forward(request, response);
}catch (Exception ex) {
request.getRequestDispatcher("/WEB-INF/error.jsp").forward(request, response);
}
}
实际上,我看不到在您的代码中使用out
,所以整个try with resources块只是多余的。或者在不输出的情况下进行转发:
try {
CakeDAO dao = new CakeDAO();
String strID = request.getParameter("id");
int id = Integer.parseInt(strID);
request.setAttribute("cake", dao.getCakeById(id));
request.getRequestDispatcher("/WEB-INF/detail.jsp").forward(request, response);
} catch (Exception ex) {
request.getRequestDispatcher("/WEB-INF/error.jsp").forward(request, response);
}
或者:
try {
CakeDAO dao = new CakeDAO();
String strID = request.getParameter("id");
int id = Integer.parseInt(strID);
PrintWriter out = response.getWriter();
out.println("Cake: " + dao.getCakeById(id)); // Hereafter an exception would err.
// NEVER forward: ... .forward(request, response);
} catch (Exception ex) {
request.getRequestDispatcher("/WEB-INF/error.jsp").forward(request, response);
}
Try with resources自动关闭,不需要。在转发时,甚至会引发错误
更重要的是,如果没有作者,你会更好。在实际写入输出(缓冲I/O!)后,转发是错误的,因此捕获中的转发是脏的。请阅读需要了解如何在stackoverflow中提问。请使用以下内容编辑您的问题:#1。提供有关错误的更多详细信息(您可以粘贴错误堆栈至少10-15行,以提供有关所面临问题的更多视图。#2.“当我删除资源输出对象时”-即该对象(指定行号或提供更多详细信息)。如果人们不理解某个问题,他们不会试图通过阅读来回答。您提供的详细信息越多,回答该问题的机会就越大!我在try块中尝试了案例2,但在try之后转发,它仍然有效?getWriter通常会返回BufferedWriter。只要第一个缓冲区没有实际写入(刷新),仍可以转发。最好返回错误代码,如500,HttpServletResponse.INTERNAL\u SERVER\u error
。然后应用程序映射到可配置的错误页面。