Учебники

Сервлеты — обработка исключений

Когда сервлет генерирует исключение, веб-контейнер выполняет поиск конфигураций в файле web.xml , в которых используется элемент типа исключения, для поиска соответствия с выброшенным типом исключения.

Вам придется использовать элемент error-page в web.xml, чтобы указать вызов сервлетов в ответ на определенные исключения или коды состояния HTTP.

Конфигурация web.xml

Учтите, у вас есть сервлет ErrorHandler, который будет вызываться всякий раз, когда есть какое-либо определенное исключение или ошибка. Ниже будет запись, созданная в 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>

Если вы хотите иметь универсальный обработчик ошибок для всех исключений, вам следует определить следующую страницу ошибок вместо определения отдельных элементов страницы ошибок для каждого исключения —

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

Ниже приведены замечания, которые необходимо отметить в отношении вышеупомянутого web.xml для обработки исключений.

  • Сервлет ErrorHandler обычно определяется как любой другой сервлет и настраивается в web.xml.

  • Если есть ошибка с кодом состояния 404 (не найдено) или 403 (запрещено), будет вызван сервлет ErrorHandler.

  • Если веб-приложение выдает исключение ServletException или IOException, тогда веб-контейнер вызывает сервлет / ErrorHandler.

  • Вы можете определить разные обработчики ошибок для обработки различных типов ошибок или исключений. Приведенный выше пример очень общий и надеюсь, что он послужит цели, чтобы объяснить вам основную концепцию.

Сервлет ErrorHandler обычно определяется как любой другой сервлет и настраивается в web.xml.

Если есть ошибка с кодом состояния 404 (не найдено) или 403 (запрещено), будет вызван сервлет ErrorHandler.

Если веб-приложение выдает исключение ServletException или IOException, тогда веб-контейнер вызывает сервлет / ErrorHandler.

Вы можете определить разные обработчики ошибок для обработки различных типов ошибок или исключений. Приведенный выше пример очень общий и надеюсь, что он послужит цели, чтобы объяснить вам основную концепцию.

Атрибуты запроса — ошибки / исключения

Ниже приведен список атрибутов запроса, к которым сервлет обработки ошибок может получить доступ для анализа природы ошибки / исключения.

Sr.No. Атрибут и описание
1

javax.servlet.error.status_code

Этот атрибут дает код состояния, который можно сохранить и проанализировать после сохранения в типе данных java.lang.Integer.

2

javax.servlet.error.exception_type

Этот атрибут предоставляет информацию о типе исключения, который можно сохранить и проанализировать после сохранения в типе данных java.lang.Class.

3

javax.servlet.error.message

Этот атрибут дает информацию о точном сообщении об ошибке, которое может быть сохранено и проанализировано после сохранения в типе данных java.lang.String.

4

javax.servlet.error.request_uri

Этот атрибут дает информацию об URL, вызывающем сервлет, и его можно сохранить и проанализировать после сохранения в типе данных java.lang.String.

5

javax.servlet.error.exception

Этот атрибут дает информацию о возникшем исключении, которая может быть сохранена и проанализирована.

6

javax.servlet.error.servlet_name

Этот атрибут дает имя сервлета, которое можно сохранить и проанализировать после сохранения в типе данных java.lang.String.

javax.servlet.error.status_code

Этот атрибут дает код состояния, который можно сохранить и проанализировать после сохранения в типе данных java.lang.Integer.

javax.servlet.error.exception_type

Этот атрибут предоставляет информацию о типе исключения, который можно сохранить и проанализировать после сохранения в типе данных java.lang.Class.

javax.servlet.error.message

Этот атрибут дает информацию о точном сообщении об ошибке, которое может быть сохранено и проанализировано после сохранения в типе данных java.lang.String.

javax.servlet.error.request_uri

Этот атрибут дает информацию об URL, вызывающем сервлет, и его можно сохранить и проанализировать после сохранения в типе данных java.lang.String.

javax.servlet.error.exception

Этот атрибут дает информацию о возникшем исключении, которая может быть сохранена и проанализирована.

javax.servlet.error.servlet_name

Этот атрибут дает имя сервлета, которое можно сохранить и проанализировать после сохранения в типе данных java.lang.String.

Пример сервлета обработчика ошибок

Этот пример даст вам базовое понимание обработки исключений в сервлете, но вы можете написать более сложные приложения-фильтры, используя ту же концепцию —

Этот пример даст вам базовое представление об обработке исключений в сервлете, но вы можете написать более сложные приложения-фильтры, используя ту же концепцию:

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

Скомпилируйте ErrorHandler.java обычным способом и поместите ваш файл класса в / WebApps / ROOT / WEB-INF / классы.

Давайте добавим следующую конфигурацию в web.xml для обработки исключений:

<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>

Теперь попробуйте использовать сервлет, который вызывает любое исключение или вводит неправильный URL-адрес, это приведет к тому, что Web-контейнер вызовет сервлет ErrorHandler и отобразит соответствующее сообщение, как запрограммировано. Например, если вы введете неправильный URL-адрес, будет показан следующий результат:

The status code : 404

Приведенный выше код может не работать с некоторыми веб-браузерами. Так что попробуйте с Mozilla и Safari, и это должно работать.