将异常从servlet转发到jsp页面的好方法是什么?

将异常从servlet转发到jsp页面的好方法是什么?,第1张

将异常从servlet转发到jsp页面的好方法是什么?

几个请求属性 已经
提供了有关异常的信息。你可以找到所有这些属性的名称中

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;}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5441982.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存