Использование 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" %>
...
${pageContext.out.flush()}${exception.printStackTrace(pageContext.response.writer)}
Если вы уже используете EL 3.0 (Tomcat 8+, WildFly, GlassFish 4+ и т. Д.), Вы даже можете сделать его одним выражением с помощью нового оператора точки с запятой, который разделяет операторы EL:
<%@page pageEncoding="UTF-8" isErrorPage="true" %>
...
${pageContext.out.flush();exception.printStackTrace(pageContext.response.writer)}
Если по какой-то причине вы не можете использовать isErrorPage="true"
(и, следовательно, неявный объект ${exception}
недоступен), просто замените на ${requestScope['javax.servlet.error.exception']}
:
<%@page pageEncoding="UTF-8" %>
...
${pageContext.out.flush()}${requestScope['javax.servlet.error.exception'].printStackTrace(pageContext.response.writer)}
Если вы все еще не пользуетесь EL 2.2, тогда вам лучше всего создать собственную функцию EL.Подробности можно найти в Каков хороший подход для пересылки исключения из сервлетов на страницу jsp?
Ниже приведен более полный пример страницы ошибки с более подробной информацией:
<%@page pageEncoding="UTF-8" isErrorPage="true" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
Exception:
Exception type:
Exception message:
Request URI:
Servlet name:
Status code:
Stack trace: ${pageContext.out.flush()}${exception.printStackTrace(pageContext.response.writer)}