Когда сервлет генерирует исключение, веб-контейнер выполняет поиск конфигураций в файле 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 обычным способом и поместите ваш файл класса в
Давайте добавим следующую конфигурацию в 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, и это должно работать.