亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 try-catch 資源在 Servlet 中提交響應后無法轉發

使用 try-catch 資源在 Servlet 中提交響應后無法轉發

Helenr 2022-07-20 12:22:46
下面的方法拋出:Servlet DetailCakeServlet 的 Servlet.service() 拋出異常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 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

要么做一個沒有輸出的轉發:


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!),轉發是錯誤的,因此 catch 中的轉發是臟的。


查看完整回答
反對 回復 2022-07-20
?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

如此處所述(在規范中沒有很快找到它),在進入 catch 塊之前,try-with-resources 構造將嘗試關閉在 try 塊中打開的資源- 即您的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 塊只是多余的。


查看完整回答
反對 回復 2022-07-20
  • 2 回答
  • 0 關注
  • 263 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號