Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在具有try-catch资源的Servlet中提交响应后无法转发_Java_Servlets - Fatal编程技术网

Java 在具有try-catch资源的Servlet中提交响应后无法转发

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

下面的方法抛出: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 = 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
。然后应用程序映射到可配置的错误页面。