Servlets - Xử lý ngoại lệ

Khi một servlet ném một ngoại lệ, vùng chứa web sẽ tìm kiếm các cấu hình trong web.xml sử dụng phần tử kiểu ngoại lệ cho một trận đấu với kiểu ngoại lệ được ném.

Bạn sẽ phải sử dụng error-page phần tử trong web.xml để chỉ định lệnh gọi của các servlet để đáp ứng một số exceptions hoặc HTTP status codes.

Cấu hình web.xml

Hãy xem xét, bạn có một servlet ErrorHandler sẽ được gọi bất cứ khi nào có bất kỳ ngoại lệ hoặc lỗi nào được xác định. Sau đây là mục nhập đượ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 Trình xử lý lỗi chung cho tất cả các ngoại lệ thì bạn nên xác định trang lỗi sau thay vì xác định các phần tử trang lỗi riêng biệt cho mọi ngoại lệ -

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

Sau đây là những điểm cần lưu ý về web.xml ở trên để Xử lý Ngoại lệ -

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

  • Nếu có bất kỳ lỗi nào với mã trạng thái 404 (Không tìm thấy) hoặc 403 (Bị cấm), thì servlet ErrorHandler sẽ được gọi.

  • Nếu ứng dụng web ném ServletException hoặc IOException, thì vùng chứa web sẽ gọi servlet / ErrorHandler.

  • Bạn có thể xác định các Trình xử lý Lỗi khác nhau để xử lý các loại lỗi hoặc ngoại lệ khác nhau. Ví dụ trên là rất chung chung và hy vọng nó phục vụ mục đích giải thích cho bạn khái niệm cơ bản.

Thuộc tính yêu cầu - Lỗi / Ngoại lệ

Sau đây là danh sách các thuộc tính yêu cầu mà một servlet xử lý lỗi có thể truy cập để phân tích bản chất của lỗi / ngoại lệ.

Sr.No. Thuộc tính & Mô tả
1

javax.servlet.error.status_code

Thuộc tính này cung cấp mã trạng thái có thể được lưu trữ và phân tích sau khi lưu trữ 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ề kiểu ngoại lệ có thể được lưu trữ và phân tích sau khi lưu trữ trong 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 thông tin có thể được lưu trữ và phân tích sau khi lưu trữ trong 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 gọi servlet và nó có thể được lưu trữ và phân tích sau khi lưu trữ trong 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ề ngoại lệ được nêu ra, có thể được lưu trữ và phân tích.

6

javax.servlet.error.servlet_name

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

Ví dụ về Servlet xử lý lỗi

Ví dụ này sẽ cung cấp cho bạn hiểu biết cơ bản về Xử lý ngoại lệ trong Servlet, nhưng bạn có thể viết các ứng dụng bộ lọc phức tạp hơn bằng cách sử dụng cùng một khái niệm -

// 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à đưa tệp lớp của bạn vào / webapps / ROOT / WEB-INF / lớp.

Hãy để chúng tôi thêm cấu hình sau vào web.xml để xử lý các trường hợp 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ờ hãy thử sử dụng một servlet đưa ra bất kỳ ngoại lệ nào hoặc nhập sai URL, điều này sẽ kích hoạt Vùng chứa Web để gọi ErrorHandlerservlet 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 nhập sai URL thì nó sẽ hiển thị kết quả sau:

The status code : 404

Đoạn mã trên có thể không hoạt động với một số trình duyệt web. Vì vậy, hãy thử với Mozilla và Safari và nó sẽ hoạt động.