Một lập luận khác chống lại việc đóng OutputStream
. Nhìn vào servlet này. Nó ném ra một ngoại lệ. Ngoại lệ được ánh xạ trong web.xml thành lỗi JSP:
package ser;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet(name = "Erroneous", urlPatterns = {"/Erroneous"})
public class Erroneous extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
try {
throw new IOException("An error");
} finally {
// out.close();
}
}
}
Tệp web.xml chứa:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<error-page>
<exception-type>java.io.IOException</exception-type>
<location>/error.jsp</location>
</error-page>
</web-app>
Và lỗi .jsp:
<%@page contentType="text/html" pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Error Page</title>
</head>
<body>
<h1><%= exception.getMessage()%></h1>
</body>
</html>
Khi bạn tải /Erroneous
trong trình duyệt, bạn thấy trang lỗi hiển thị "Lỗi". Nhưng nếu bạn bỏ nhận xét out.close()
dòng trong servlet ở trên, triển khai lại ứng dụng và tải lại, /Erroneous
bạn sẽ không thấy gì trong trình duyệt. Tôi không có manh mối nào về những gì đang thực sự xảy ra, nhưng tôi đoán điều đó out.close()
ngăn cản việc xử lý lỗi.
Đã thử nghiệm với Tomcat 7.0.50, Java EE 6 bằng Netbeans 7.4.
close()
điều không làm gì cả. Những gì bạn nên làm là đóng mọi tài nguyên có thể đóng được.