JSP: Как я могу заставить код на моей странице ошибок работать, даже если я не могу отобразить его? - PullRequest
3 голосов
/ 17 октября 2008

Я определил страницу ошибки в моем web.xml:

 <error-page>
   <exception-type>java.lang.Exception</exception-type>
   <location>/error.jsp</location>
 </error-page>

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

Где это не работает, если выходные данные уже начали отправляться клиенту во время возникновения ошибки. В этом случае мы получаем это:

SEVERE: Exception Processing ErrorPage[exceptionType=java.lang.Exception, location=/error.jsp]
 java.lang.IllegalStateException

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

Есть ли способ разрешить выполнение моего кода электронной почты трассировки стека в этом случае, даже если я на самом деле не могу отобразить страницу ошибки для клиента?

Ответы [ 3 ]

2 голосов
/ 02 декабря 2009

ErrorPage не будет использоваться, если вы уже начали отправлять данные клиенту. Я использую обратный вызов JavaScript для проверки неполной страницы и перенаправления на страницу ошибки. В начале вашей страницы во включаемом заголовке или в чем-то другом инициализируйте логическую переменную javascript в false и зарегистрируйте обработчик загрузки для проверки состояния и перенаправления на страницу ошибки.

<script type="text/javascript">
        var pageLoadSuccessful = false;//set to true in footer.jsp
        dojo.addOnLoad(function(){
            if (!pageLoadSuccessful) window.location = "<c:url value="/error.do" />";
        });
</script>

Затем в jsp нижнего колонтитула обязательно задайте для этой переменной значение true:

<script type="text/javascript">
    pageLoadSuccessful = true;//declared in header.jsp
</script>
1 голос
/ 02 декабря 2009

Фактически, эта конкретная проблема указывает на то, что вы использовали скриптлеты в JSP. Это плохая практика , и именно эта проблема является одной из основных причин этого. Вы должны переместить всю свою бизнес-логику в класс real java, чтобы в JSP вы получили только taglibs / EL. В сервлете / фильтре вы можете прекрасно обработать исключения перед отправкой запроса в JSP.

1 голос
/ 17 октября 2008

Вы пытались использовать директиву <% @ page errorPage = "/ myerrorpage.jsp"%>?

Вам также необходимо использовать <% page isErrorPage = "true" $> в myerrorpage.jsp, затем.

Я думаю, что это может решить вашу проблему. Единственная проблема в том, что вам нужно как-то включить его в каждую JSP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...