例外に関する情報は、いくつかのリクエスト属性によってすでに利用可能です。これらすべての属性の名前は、RequestDispatcher
javadocで確認できます。
つまり、この JSP の例は、考えられるすべての例外の詳細を表示する必要があります。
<%@ 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>
</ul>
さらに、次の有用な情報を表示することもできます。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<jsp:useBean id="date" class="java.util.Date" />
...
<ul>
<li>Timestamp: <fmt:formatDate value="${date}" type="both" dateStyle="long" timeStyle="long" /></li>
<li>User agent: <c:out value="${header['user-agent']}" /></li>
</ul>
具体的なインスタンス自体は、ページをエラー ページとしてマークした場合にException
のみ使用可能な JSP 内にあります。${exception}
<%@ page isErrorPage="true" %>
...
${exception}
EL 2.2以降を使用している場合のみ、以下のようにスタックトレースを出力できます:
<%@ page isErrorPage="true" %>
...
<pre>${pageContext.out.flush()}${exception.printStackTrace(pageContext.response.writer)}</pre>
または、まだ EL 2.2 を使用していない場合は、そのためのカスタム EL 関数を作成します。
public final class Functions {
private Functions() {}
public static String printStackTrace(Throwable exception) {
StringWriter stringWriter = new StringWriter();
exception.printStackTrace(new PrintWriter(stringWriter, true));
return stringWriter.toString();
}
}
に登録されている/WEB-INF/functions.tld
:
<?xml version="1.0" encoding="UTF-8" ?>
<taglib
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<display-name>Custom Functions</display-name>
<tlib-version>1.0</tlib-version>
<uri>http://example.com/functions</uri>
<function>
<name>printStackTrace</name>
<function-class>com.example.Functions</function-class>
<function-signature>java.lang.String printStackTrace(java.lang.Throwable)</function-signature>
</function>
</taglib>
そして、として使用することができます
<%@ taglib prefix="my" uri="http://example.com/functions" %>
...
<pre>${my:printStackTrace(exception)}</pre>
例外のロギングに関しては、最も簡単な場所は、URL パターンにマップされ、基本的に次のことを行うフィルターです。/*
try {
chain.doFilter(request, response);
} catch (ServletException e) {
log(e.getRootCause());
throw e;
} catch (IOException e) { // If necessary? Usually not thrown by business code.
log(e);
throw e;
}