Как я могу напечатать трассировку стека ошибок на странице JSP?

21
задан Jigar Joshi 23 June 2014 в 19:40
поделиться

5 ответов

получают параметр из запроса, который устанавливается внутри, и используют его для печати и обработки другой информации, такой как cause, message

<c:set var="exception" value="${requestScope['javax.servlet.error.exception']}"/>

и для печати трассировки стека

<!-- Stack trace -->
<jsp:scriptlet>
  exception.printStackTrace(new java.io.PrintWriter(out));
</jsp:scriptlet>
< hr>

См. также

20
ответ дан Jigar Joshi 23 June 2014 в 19:40
поделиться

Использование JSP-скриптлетов не одобряется практикой с десятилетия. Вы бы лучше избегали этого.

Если вы уже используете EL 2.2 или новее (Tomcat 7+, JBoss AS 6+, WildFly, GlassFish 3+ и т. Д.) С новой поддержкой выражений методов в форме ${instance.method()}, то вы можете просто использовать 100% EL для этого.

Сначала необходимо явно очистить модуль записи JSP с помощью JspWriter#flush() , чтобы все предыдущие выходные данные шаблона JSP действительно записывались в модуль записи ответа сервлета:

${pageContext.out.flush()}

Тогда вы можете просто передать ServletResponse#getWriter() на Throwable#printStackTrace() .

${exception.printStackTrace(pageContext.response.writer)}

Полный пример:

<%@page pageEncoding="UTF-8" isErrorPage="true" %>
...
<pre>${pageContext.out.flush()}${exception.printStackTrace(pageContext.response.writer)}</pre>

Если вы уже используете EL 3.0 (Tomcat 8+, WildFly, GlassFish 4+ и т. Д.), Вы даже можете сделать его одним выражением с помощью Новый оператор с запятой, который разделяет операторы EL:

<%@page pageEncoding="UTF-8" isErrorPage="true" %>
...
<pre>${pageContext.out.flush();exception.printStackTrace(pageContext.response.writer)}</pre>

Если по какой-то причине вы не можете использовать isErrorPage="true" (и, следовательно, неявный объект ${exception} недоступен), просто замените его на ${requestScope['javax.servlet.error.exception']} :

<%@page pageEncoding="UTF-8" %>
...
<pre>${pageContext.out.flush()}${requestScope['javax.servlet.error.exception'].printStackTrace(pageContext.response.writer)}</pre>

Если вы все еще не пользуетесь EL 2.2, тогда вам лучше всего создать собственную функцию EL. Подробности можно найти в . Каков хороший подход для пересылки исключения из сервлетов на страницу jsp?

Ниже приведен более полный пример страницы ошибки с более подробной информацией:

<%@page pageEncoding="UTF-8" isErrorPage="true" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<ul>
    <li>Exception: <c:out value="${requestScope['javax.servlet.error.exception']}" /></li>
    <li>Exception type: <c:out value="${requestScope['javax.servlet.error.exception_type']}" /></li>
    <li>Exception message: <c:out value="${requestScope['javax.servlet.error.message']}" /></li>
    <li>Request URI: <c:out value="${requestScope['javax.servlet.error.request_uri']}" /></li>
    <li>Servlet name: <c:out value="${requestScope['javax.servlet.error.servlet_name']}" /></li>
    <li>Status code: <c:out value="${requestScope['javax.servlet.error.status_code']}" /></li>
    <li>Stack trace: <pre>${pageContext.out.flush()}${exception.printStackTrace(pageContext.response.writer)}</pre></li>
</ul>
12
ответ дан Community 23 June 2014 в 19:40
поделиться

На странице с ошибкой просто сделайте:

<jsp:scriptlet>
    exception.printStackTrace(response.getWriter())
</jsp:scriptlet>

Хотя здесь напрашивается вопрос: что пользователь собирается делать с исключением. Почему бы не записать исключение в журнал ошибок, чтобы оно сохранилось, и вы можете вернуться к нему после того, как пользователь пожаловался?

3
ответ дан Abimaran Kugathasan 23 June 2014 в 19:40
поделиться

Объект «Брошенное исключение» доступен в виде атрибута запроса с именем «javax.servlet.error.exception». Итак, в вашем JSP вы можете написать:

<% request.getAttribute("javax.servlet.error.exception").printStackTrace(new java.io.PrintWriter(out); %>
2
ответ дан socha23 23 June 2014 в 19:40
поделиться

Вы можете использовать библиотеку ядра jstl

1) Импортировать вкладку поверх файла JSP

<%@ taglib prefi x=”c” uri=”http://java.sun.com/jsp/jstl/core” %>

2) Использовать тег

<c:catch var="myExceptionObject">
    Code that might throw Exception
<c:catch/>

<c:if test="${myExceptionObject} != null">
    There was an exception: ${myExceptionObject.message}
<c:if/>
0
ответ дан Chirag Visavadiya 23 June 2014 в 19:40
поделиться
Другие вопросы по тегам:

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