В руководстве 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 имеют некоторые хорошие варианты:
Я прошу прощения за столь поздний ответ, но я столкнулся с этой проблемой всего неделю назад, я просмотрел много разных сайтов, но никто так и не ответил на эту проблему так, как мне хотелось бы услышать. В этом посте я узнал несколько интересных решений, а затем пришел к своим собственным. Просто включите этот источник на своей странице:
<%
out.println(pageContext.getErrorData().getRequestURI());
out.println("<br/>");
out.println(pageContext.getErrorData().getStatusCode());
out.println("<br/>");
out.println(pageContext.getException());
out.println("<br/>");
%>
Он прекрасно работал со мной.
То, что вы хотите, выглядит странно для меня :). Тем не менее, я бы сделал следующее:
Реализовать HttpResponseWrapper
, чтобы обернуть любое другое HttpResponse
таким образом:
public class HttpResponseWrapper implements HttpResponse {
private String errorMessage;
...
@Override
public void sendError(...) {
<save error message here>
}
...
}
Создайте фильтр и оберните любой ответ в этом
Установите фильтр для всех запросов и сначала в цепочке
На странице ошибок проверьте, ответ является instanceof HttpResponseWrapper
Получить ваше сообщение
Хм exception.getMessage ()
должен работать
Попробуйте добавить exception.getClass (). GetName ()
NullPointerException
, у которого нет сообщения Конечно, это работает, только если я правильно помню, если ошибка вызвана 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
Часть исключения
в ErrorData
будет установлена только в том случае, если страница с ошибкой была загружена в результате исключения, а не кода ошибки ответа .
См. javadoc для sendError
на HttpServletResponse
. В нем упоминается, почему вы не видите сообщение, которое вы передали в sendError
(выделено мной):
Отправляет клиенту ответ об ошибке с указанным статусом. По умолчанию сервер создает ответ, который выглядит как страница ошибки сервера в формате HTML, содержащая указанное сообщение, при этом для типа содержимого устанавливается значение «text / html», а файлы cookie и другие заголовки остаются неизменными. Если для веб-приложения было сделано объявление страницы с ошибкой, соответствующее переданному коду состояния, он будет доставлен обратно вместо предложенного параметра msg.
Если ответ уже был зафиксирован, этот метод генерирует исключение IllegalStateException. После использования этого метода ответ должен считаться зафиксированным и не должен записываться в.
Сообщение об ошибке доступно через атрибут javax.servlet.error.message
объекта запроса на странице ошибки jsp.
Вот синтаксис jsp для доступа к нему :
<c:out value="${requestScope['javax.servlet.error.message']}"/>
Вы можете найти другую информацию об ошибках, доступную на странице ошибок здесь в разделе Новые атрибуты ошибок .