几个请求属性 已经
提供了有关异常的信息。你可以找到所有这些属性的名称中
RequestDispatcher的javadoc:
ERROR_EXCEPTION
--javax.servlet.error.exeption
ERROR_EXCEPTION_TYPE
--javax.servlet.error.exception_type
ERROR_MESSAGE
--javax.servlet.error.message
ERROR_REQUEST_URI
--javax.servlet.error.request_uri
ERROR_SERVLET_NAME
--javax.servlet.error.servlet_name
ERROR_STATUS_CODE
--javax.servlet.error.status_pre
因此,简而言之,此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 pre: <c:out value="${requestScope['javax.servlet.error.status_pre']}" /></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" />...<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只有
${exception}将页面标记为错误页面时,具体实例本身才在JSP中可用:
<%@ page isErrorPage="true" %>...${exception}
仅当使用EL 2.2或更高版本时,才可以按以下方式打印其堆栈跟踪:
<%@ page isErrorPage="true" %>...<pre>${pageContext.out.flush()}${exception.printStackTrace(pageContext.response.writer)}</pre>
或者,如果您尚未使用EL2.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 pre. log(e); throw e;}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)