Xử lý ngoại lệ (Exception) trong Servlet



Khi một Servlet ném một Exception, thì Web container tìm kiếm các cấu hình (Configuration) trong web.xml mà sử dụng phần tử loại exception này để kết nối với loại exception đã ném.

Bạn sẽ phải sử dụng phần tử error.page trong web.xml để xác định sự triệu hồi của các Servlet trong phản hồi tới các exceptions hoặc HTTP status codes cụ thể.

Cấu hình web.xml

Giả sử, bạn có một Servlet là ErrorHandler mà sẽ được gọi bất cứ khi nào có bất kỳ exception hoặc error nào được định nghĩa. Sau đây sẽ là entry được tạo trong web.xml

<!-- servlet definition -->
<servlet>
        <servlet-name>ErrorHandler</servlet-name>
        <servlet-class>ErrorHandler</servlet-class>
</servlet>
<!-- servlet mappings -->
<servlet-mapping>
        <servlet-name>ErrorHandler</servlet-name>
        <url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>

<!-- error-code related error pages -->
<error-page>
    <error-code>404</error-code>
    <location>/ErrorHandler</location>
</error-page>
<error-page>
    <error-code>403</error-code>
    <location>/ErrorHandler</location>
</error-page>

<!-- exception-type related error pages -->
<error-page>
    <exception-type>
          javax.servlet.ServletException
    </exception-type >
    <location>/ErrorHandler</location>
</error-page>

<error-page>
    <exception-type>java.io.IOException</exception-type >
    <location>/ErrorHandler</location>
</error-page>

Nếu bạn muốn có một Error Handler chung cho tất cả Exception, thì bạn nên định nghĩa error-page sau thay cho việc định nghĩa từng phần tử error-page riêng biệt cho mỗi exception.

<error-page>
    <exception-type>java.lang.Throwable</exception-type >
    <location>/ErrorHandler</location>
</error-page>

Sau đây là một số điểm đáng chú ý trong web.xml trên để Xử lý Exception:

  • ErrorHandler được định nghĩa theo cách thông thường như bất kỳ Servlet nào khác và được định cấu hình bên trong web.xml.

  • Nếu có bất kỳ lỗi nào với Status code hoặc 404 (Not Found) hoặc 403 (Forbidden), thì ErrorHandler servlet này sẽ được triệu hồi.

  • Nếu ứng dụng web ném hoặc ServletException hoặ IOException, thì Web container triệu hồi ErrorHandler servlet này.

  • Bạn có thể định nghĩa các Error Handler khác nhau để xử lý các loại Error hoặc Exception khác nhau. Ví dụ trên là một ví dụ chung và hi vọng rằng nó sẽ giải thích cho bạn hiểu về khái niệm cơ bản này.

Quảng cáo

Các thuộc tính Request: Error/Exception

Bảng dưới liệt kê các thuộc tính request mà một Servlet xử lý lỗi có thể truy cập để phân tích bản chất của Error/Exception:

STTThuộc tính và Miêu tả
1

javax.servlet.error.status_code

Thuộc tính này cung cấp status code mà có thể được lưu giữ và được phân tích sau khi lưu giữ trong kiểu dữ liệu java.lang.Integer

2

javax.servlet.error.exception_type

Thuộc tính này cung cấp thông tin về loại exception mà có thể được lưu giữ và được phân tích sau khi lưu giữ trong một kiểu dữ liệu java.lang.Class

3

javax.servlet.error.message

Thuộc tính này cung cấp thông báo lỗi chính xác mà có thể được lưu giữ và được phân tích sau khi lưu giữ trong một kiểu dữ liệu java.lang.String

4

javax.servlet.error.request_uri

Thuộc tính này cung cấp thông tin về URL đang triệu hồi tới Servlet và nó có thể được lưu giữ và được phân tích sau khi lưu giữ trong một kiểu dữ liệu java.lang.String

5

javax.servlet.error.exception

Thuộc tính này cung cấp thông tin về exception mà có thể được lưu giữ và được phân tích sau khi lưu giữ trong kiểu dữ liệu java.lang.Throwable

6

javax.servlet.error.servlet_name

Thuộc tính này cung cấp tên Servlet mà có thể được lưu và được phân tích sau khi lưu giữ trong một kiểu dữ liệu java.lang.String

Ví dụ về xử lý ngoại lệ Servlet

Sau đây là ví dụ về Servlet mà sẽ được sử dụng như là Error Handler trong bất kỳ trường hợp nào có error hoặc exception xuất hiện với bất kỳ Servlet nào đã định nghĩa của bạn.

Ví dụ này giúp bạn hiểu hơn về Xử lý ngoại lệ trong Servlet, và bạn có thể viết các chương trình phức tạp hơn bởi cùng sử dụng khái niệm này.

// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

// Extend HttpServlet class
public class ErrorHandler extends HttpServlet {
 
  // Method to handle GET method request.
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // Analyze the servlet exception       
      Throwable throwable = (Throwable)
      request.getAttribute("javax.servlet.error.exception");
      Integer statusCode = (Integer)
      request.getAttribute("javax.servlet.error.status_code");
      String servletName = (String)
      request.getAttribute("javax.servlet.error.servlet_name");
      if (servletName == null){
         servletName = "Unknown";
      }
      String requestUri = (String)
      request.getAttribute("javax.servlet.error.request_uri");
      if (requestUri == null){
         requestUri = "Unknown";
      }

      // Set response content type
      response.setContentType("text/html");
 
      PrintWriter out = response.getWriter();
	  String title = "Error/Exception Information";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
        "<html>\n" +
        "<head><title>" + title + "</title></head>\n" +
        "<body bgcolor=\"#f0f0f0\">\n");

      if (throwable == null && statusCode == null){
         out.println("<h2>Error information is missing</h2>");
         out.println("Please return to the <a href=\"" + 
           response.encodeURL("http://localhost:8080/") + 
           "\">Home Page</a>.");
      }else if (statusCode != null){
         out.println("The status code : " + statusCode);
      }else{
         out.println("<h2>Error information</h2>");
         out.println("Servlet Name : " + servletName + 
                             "</br></br>");
         out.println("Exception Type : " + 
                             throwable.getClass( ).getName( ) + 
                             "</br></br>");
         out.println("The request URI: " + requestUri + 
                             "<br><br>");
         out.println("The exception message: " + 
                                 throwable.getMessage( ));
      }
      out.println("</body>");
      out.println("</html>");
  }
  // Method to handle POST method request.
  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
      throws ServletException, IOException {
     doGet(request, response);
  }
}

Biên dịch ErrorHandler.java theo cách thông thường và đặt class file trong <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes.

Quảng cáo

Chúng ta thêm cấu hình sau trong web.xml để xử lý ngoại lệ:

<servlet>
        <servlet-name>ErrorHandler</servlet-name>
        <servlet-class>ErrorHandler</servlet-class>
</servlet>
<!-- servlet mappings -->
<servlet-mapping>
        <servlet-name>ErrorHandler</servlet-name>
        <url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>
<error-page>
    <error-code>404</error-code>
    <location>/ErrorHandler</location>
</error-page>
<error-page>
    <exception-type>java.lang.Throwable</exception-type >
    <location>/ErrorHandler</location>
</error-page>

Bây giờ bạn thử sử dụng một Servlet mà nêu ra một exception hoặc một loại lỗi URL, nó sẽ kích hoạt Web Container để gọ ErrorHandler servlet và hiển thị một thông báo thích hợp như được lập trình. Ví dụ, nếu bạn soạn một URL lỗi, nó sẽ cho thông báo sau:

The status code : 404

Code trên có thể không làm việc trong một số trình duyệt, vì thế, nếu bạn sử dụng Mozilla và Safari thì nó sẽ làm việc.

Các bạn ở Hà Nội có thể tham gia khóa học thứ 9 của vietjackteam (đang tuyển sinh) vào cuối tháng 10/2018 do anh Nguyễn Thanh Tuyền, admin vietjack.com trực tiếp giảng dạy tại Hà Nội. Chi tiết nội dung khóa học tham khỏa link : Khóa học Java.Các bạn học CNTT, điện tử viễn thông, đa phương tiện, điện-điện tử, toán tin có thể theo học khóa này. Số lượng các công việc Java hoặc .NET luôn gấp ít nhất 3 lần Android hoặc iOS trên thị trường tuyển dụng. Khóa online= Đi phỏng vấn, Khóa offline= Đi phỏng vấn+ 1.5 tháng thực tập ngoài doanh nghiệp. .

Mọi người có thể xem demo nội dung khóa học tại địa chỉ Video demo khóa học Offline

Các bạn ở xa học không có điều kiện thời gian có thể tham dự khóa Java online để chủ động cho việc học tập. Từ tháng 4/2018, VietJack khuyến mại giá SỐC chỉ còn 250k cho khóa học, các bạn có thể trả lại tiền nếu không hài lòng về chất lượng trong 1 tháng, liên hệ facebook admin fb.com/tuyen.vietjack để thanh toán chuyển khoản hoặc thẻ điện thoại, khóa học bằng Tiếng Việt với gần 100 video, các bạn có thể chủ động bất cứ lúc nào, và xem mãi mãi. Thông tin khóa học tại Khóa học Java Online trên Udemy

Follow fanpage của team https://www.facebook.com/vietjackteam/ hoặc facebook cá nhân Nguyễn Thanh Tuyền https://www.facebook.com/tuyen.vietjack để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.

Các bài học SEO phổ biến khác tại VietJack: