1. Введение
В этом руководстве мы собираемся обрабатывать исключения в приложении Jakarta EE Servlet , чтобы обеспечить корректный и ожидаемый результат при возникновении ошибки.
2. Исключения сервлета Jakarta EE
Во-первых, мы определим сервлет, используя аннотации API ( подробнее см . Введение в сервлеты ) с процессором GET
по умолчанию , который выдаст исключение:
@WebServlet(urlPatterns = "/randomError")
public class RandomErrorServlet extends HttpServlet {
@Override
protected void doGet(
HttpServletRequest req,
HttpServletResponse resp) {
throw new IllegalStateException("Random error");
}
}
3. Обработка ошибок по умолчанию
Давайте теперь просто развернем приложение в нашем контейнере сервлетов (мы собираемся предположить, что приложение работает по адресу http://localhost:8080/javax-servlets
).
Когда мы получим доступ к адресу http://localhost:8080/javax-servlets/randomError
, мы увидим обработку ошибок сервлета по умолчанию:
Обработка ошибок по умолчанию обеспечивается контейнером сервлетов и может быть настроена на уровне контейнера или приложения.
4. Пользовательская обработка ошибок
Мы можем определить пользовательскую обработку ошибок, используя дескриптор файла web.xml
, в котором мы можем определить следующие типы политик:
- Обработка ошибок кода состояния — это позволяет нам сопоставлять коды ошибок HTTP ( клиент и сервер ) со статической страницей ошибок HTML или сервлетом обработки ошибок.
- Обработка ошибок типа исключения — это позволяет нам сопоставлять типы исключений со статическими страницами ошибок HTML или сервлетом обработки ошибок.
4.1. Обработка ошибок кода состояния на HTML-странице
Мы можем настроить собственную политику обработки ошибок для ошибок HTTP 404 в файле web.xml
:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<error-page>
<error-code>404</error-code>
<location>/error-404.html</location> <!-- /src/main/webapp/error-404.html-->
</error-page>
</web-app>
Теперь откройте http://localhost:8080/javax-servlets/invalid.html
из браузера, чтобы получить статическую HTML-страницу с ошибкой.
4.2. Обработка ошибок типа исключения с помощью сервлета
Мы можем настроить собственную политику обработки ошибок для java.lang.Exception
в web.xml
:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/errorHandler</location>
</error-page>
</web-app>
В ErrorHandlerServlet
мы можем получить доступ к сведениям об ошибке, используя атрибуты ошибки , предоставленные в запросе:
@WebServlet(urlPatterns = "/errorHandler")
public class ErrorHandlerServlet extends HttpServlet {
@Override
protected void doGet(
HttpServletRequest req,
HttpServletResponse resp) throws IOException {
resp.setContentType("text/html; charset=utf-8");
try (PrintWriter writer = resp.getWriter()) {
writer.write("<html><head><title>Error description</title></head><body>");
writer.write("<h2>Error description</h2>");
writer.write("<ul>");
Arrays.asList(
ERROR_STATUS_CODE,
ERROR_EXCEPTION_TYPE,
ERROR_MESSAGE)
.forEach(e ->
writer.write("<li>" + e + ":" + req.getAttribute(e) + " </li>")
);
writer.write("</ul>");
writer.write("</html></body>");
}
}
}
Теперь мы можем получить доступ к http://localhost:8080/javax-servlets/randomError
, чтобы увидеть работу пользовательского сервлета ошибок.
Примечание . Наш тип исключения, определенный в файле web.xml
, слишком широк, и нам следует указать все исключения, которые мы хотим обрабатывать, более подробно.
Мы также можем использовать предоставленный контейнером регистратор сервлетов в нашем компоненте ErrorHandlerServlet
для регистрации дополнительных сведений:
Exception exception = (Exception) req.getAttribute(ERROR_EXCEPTION);
if (IllegalArgumentException.class.isInstance(exception)) {
getServletContext()
.log("Error on an application argument", exception);
}
Стоит знать, что выходит за рамки механизмов ведения журнала, предоставляемых сервлетом, для получения более подробной информации обратитесь к руководству по slf4j .
5. Вывод
В этой краткой статье мы рассмотрели обработку ошибок по умолчанию и указали пользовательскую обработку ошибок в приложении сервлета без добавления внешних компонентов или библиотек.
Как всегда, вы можете найти исходный код в репозитории учебных пособий по сервлетам .