2013-05-01 5 views
3

javadoc of the javax.servlet.AsyncContext interface говорит:Что такое «отправка ошибок» в обработке сервлетов?

В случае асинхронной операции истекло, контейнер должен проходить через эти шаги:

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

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

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

ответ

4

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

Запрос, отправивший сообщение об ошибке, будет иметь тип диспетчера, установленный в 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, то контейнер отправит на эту страницу, когда возникнет ошибка страницы. На этой странице ошибки вы можете использовать код, например request.getAttribute ("javax.servlet.error.message"), чтобы получить сведения об ошибке. Пример ...

web.xml:

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

error.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»).

+0

Это все еще туманно для меня! Как настроить/настроить эту отправку ошибок? Кроме того, does not response.sendError() вызывать отправку ошибок? – brainOverflow

+0

Я добавил дополнительную информацию о выполнении отправки ошибок. – manojtc

0

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

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