Как получить сообщение на пользовательской ошибочной странице (Tomcat)?

В руководстве bash обратите внимание, что расширение скобки во время замены параметра , но не рекурсивно:

Порядок расширений: расширение скобы; расширение тильды, расширение параметров и переменных, арифметическое расширение и подстановка команд (выполняется слева направо); расщепление слов; и расширение имени файла.

blockquote>

Это означает, что любая тильда (или ссылки на параметры или подстановка команд), хранящаяся нерасширенной в переменной bash, не будет автоматически разрешать . Ваша переменная JAVA_HOME содержит литеральную тильду, поэтому bash не будет автоматически расширять ее.

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

$ echo "~"
~
$ echo ~
/home/jeffbowman

. .. но расширение параметра, подобное $HOME, происходит в кавычках. Замена его с помощью $ HOME расширяется до вашего домашнего каталога во время назначения JAVA_HOME .

FOO=~/bar        # stores /home/jeffbowman/bar
FOO="~/bar"      # stores ~/bar
FOO=$HOME/bar    # stores /home/jeffbowman/bar
FOO="$HOME/bar"  # stores /home/jeffbowman/bar

Хотя лучший вариант заключается в том, чтобы обеспечить правильное назначение, если вы хотите расширить это вручную, эти вопросы SO имеют некоторые хорошие варианты:

26
задан Lea Verou 16 June 2009 в 01:51
поделиться

5 ответов

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

<%
    out.println(pageContext.getErrorData().getRequestURI());
    out.println("<br/>");
    out.println(pageContext.getErrorData().getStatusCode());
    out.println("<br/>");
    out.println(pageContext.getException());
    out.println("<br/>");
%>

Он прекрасно работал со мной.

3
ответ дан russian eagle 19 July 2019 в 15:16
поделиться

То, что вы хотите, выглядит странно для меня :). Тем не менее, я бы сделал следующее:

  1. Реализовать HttpResponseWrapper, чтобы обернуть любое другое HttpResponse таким образом:

    public class HttpResponseWrapper implements HttpResponse {
        private String errorMessage;
    ...
    
        @Override
        public void sendError(...) {
            <save error message here>
        }
    ...
    }
    
  2. Создайте фильтр и оберните любой ответ в этом

  3. Установите фильтр для всех запросов и сначала в цепочке

  4. На странице ошибок проверьте, ответ является instanceof HttpResponseWrapper

  5. Получить ваше сообщение

0
ответ дан Jason Plank 19 July 2019 в 15:16
поделиться

Хм exception.getMessage () должен работать

Попробуйте добавить exception.getClass (). GetName ()

  1. Это может быть NullPointerException , у которого нет сообщения
  2. или исключение не от Sun, и сообщение установлено неправильно

Конечно, это работает, только если я правильно помню, если ошибка вызвана jsp с <% @ page errorPage = "/ yourerrorpage.jsp"%> вверху.

Если ошибка исходит от сервлета, сведения об исключении передаются как атрибуты запроса

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.exception      java.lang.Throwable
javax.servlet.error.request_uri    java.lang.String
javax.servlet.error.servlet_name   java.lang.String

Проверьте Спецификация сервлета раздел 9.9

9
ответ дан 28 November 2019 в 05:46
поделиться

Часть исключения в ErrorData будет установлена ​​только в том случае, если страница с ошибкой была загружена в результате исключения, а не кода ошибки ответа .

См. javadoc для sendError на HttpServletResponse . В нем упоминается, почему вы не видите сообщение, которое вы передали в sendError (выделено мной):

Отправляет клиенту ответ об ошибке с указанным статусом. По умолчанию сервер создает ответ, который выглядит как страница ошибки сервера в формате HTML, содержащая указанное сообщение, при этом для типа содержимого устанавливается значение «text / html», а файлы cookie и другие заголовки остаются неизменными. Если для веб-приложения было сделано объявление страницы с ошибкой, соответствующее переданному коду состояния, он будет доставлен обратно вместо предложенного параметра msg.

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

0
ответ дан 28 November 2019 в 05:46
поделиться

Сообщение об ошибке доступно через атрибут javax.servlet.error.message объекта запроса на странице ошибки jsp.

Вот синтаксис jsp для доступа к нему :

<c:out value="${requestScope['javax.servlet.error.message']}"/>

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

13
ответ дан 28 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: