Что такое «отправка ошибок» при обработке сервлетов?

javadoc интерфейса javax.servlet.AsyncContext говорит:

В случае истечения времени ожидания асинхронной операции контейнер должен выполнить следующие шаги:

  • Вызывать в своем методе onTimeout все AsyncListener экземпляры, зарегистрированные в ServletRequest, на котором была инициирована асинхронная
    операция.
  • Если ни один из прослушивателей не вызвал complete() или какой-либо из методов dispatch(), выполните диспетчеризацию ошибок с кодом состояния, равным HttpServletResponse.SC_INTERNAL_SERVER_ERROR.
  • Если не найдено подходящей страницы с ошибкой или страница с ошибкой не вызвала complete() или какой-либо из методов dispatch(), вызовите complete().

Но я нигде не мог найти значение «отправка ошибок». На самом деле существовала ошибка Apache, которая восклицала то же самое. (В их точных словах: «Я тоже не видел определения« отправки ошибок »»)

Но, конечно, для этого должно быть четкое определение и как его использовать. Кто-нибудь знает?


person 2020    schedule 01.05.2013    source источник


Ответы (2)


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

Для запроса, полученного через диспетчеризацию ошибок, будет задан тип диспетчера DispatcherType.ERROR. (В коде метода службы сервлета вы можете получить тип отправки, используя getDispatcherType())

Следующие шесть атрибутов области запроса также будут установлены в сообщениях об ошибках.

"javax.servlet.error.exception"
"javax.servlet.error.exception_type"
"javax.servlet.error.message"
"javax.servlet.error.request_uri"
"javax.servlet.error.servlet_name"
"javax.servlet.error.status_code"

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

http://docs.oracle.com/javaee/6/api/javax/servlet/DispatcherType.html http://docs.oracle.com/javaee/6/api/javax/servlet/RequestDispatcher.html

Вы можете настроить отправку ошибок, используя тег в дескрипторе развертывания (web.xml). Например, если вы добавили тег error-page для кода ошибки 404, то контейнер будет отправляться на эту страницу при возникновении ошибки page not found. На этой странице ошибки вы можете использовать такой код, как request.getAttribute("javax.servlet.error.message"), чтобы получить сведения об ошибке. Пример ...

веб.xml:

<web-app>
    <error-page>
        <error-code>404</error-code>
        <location>/error.jsp</location>
    </error-page>
</web-app>

ошибка.jsp:

<!DOCTYPE html>
<html>
    <head>
        <title>404 Error</title>
    </head>
    <body>
        The page was not found. You requested <%= request.getAttribute("javax.servlet.error.message") %> but it was not found. Sorry.
    </body>
</html>

В приведенном выше примере приложения, если страница, запрошенная клиентом, не найдена или вы где-то используете response.sendError("404", "..."), контейнер отправит сообщение об ошибке в error.jsp.

Здесь также применяется механизм обработки ошибок JSP (использующий директивы страницы «errorPage» и «isErrorPage»).

person manojtc    schedule 02.05.2013
comment
Мне до сих пор туманно! Как настроить/настроить эту отправку ошибок? Кроме того, разве response.sendError() не вызывает отправку ошибок? - person 2020; 03.05.2013

Другая информация, которая не имеет прямого отношения к вопросу, но которая, как я видел, не упоминается четко почти во всех местах, включая ответ выше, заключается в том, что отправка ошибок технически НЕ «перенаправляет», это скорее внутренняя переадресация. . Для новичков это может показаться запутанным, поскольку обычно все пишется так: «Контейнер выполняет перенаправление на страницу с ошибкой». Таким образом, в тот момент, когда ваш контейнер видит, что какой-либо ресурс отправляет код ошибки http/неперехваченное исключение, он начинает просматривать веб-xml, чтобы увидеть, определен ли какой-либо обработчик, и если он присутствует, то он соответствующим образом перенаправляет запрос на этот ресурс, используя запросить диспетчера. Тогда, очевидно, применима вся информация, упомянутая в приведенном выше ответе.

Однако, если кто-то хочет сделать перенаправление, он может сделать это в фильтре или сервлете или из любого места, где у них есть доступный объект ответа.

person Shailendra    schedule 17.10.2013