Невозможно переслать после подтверждения ответа в сервлете с ресурсом try-catch - PullRequest
0 голосов
/ 05 марта 2019

Метод ниже: throw: Servlet.service () для сервлета DetailCakeServlet сгенерировал исключение
java.lang.IllegalStateException: Cannot forward after response has been committed.

Код

 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);
    }

Но когда я удаляюресурс вне объекта, это работает.В чем может быть причина?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Либо выполните пересылку без вывода:

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 автоматически закрывается и не требуется.При пересылке даже возникает ошибка.

Что более важно, без получения писателя, вам лучше.После того, как выходные данные действительно записаны (буферизованный ввод / вывод!), Пересылка ошибочна, поэтому пересылка в catch грязная.

0 голосов
/ 05 марта 2019

Как указано здесь (быстро его не нашли в спецификации), до ввода блока catch, конструкция try-with-resources будет пытаться закрыть ресурсы, открытые внутри Попробуйте блок - т. е. ваш out, и, следовательно, response, уже закрыт, когда вы пытаетесь перенаправить в блок 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 просто лишний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...