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