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

我知道我可以像这样在web.xml中放一些东西

<error-page>  

<exception-type>java.lang.Throwable</exception-type>

<location>/error.jsp</location>

</error-page>

但是,jsp页面不会显示任何构造信息,因为它无法获得确切的异常信息。我知道我们可以通过各种方式将不同的异常转发到不同的页面,exception-

type但是在web.xml中编写太多了。我希望一个页面足够,而另一个页面可以处理404之类的错误。

那么如何将异常信息传递给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_code

因此,简而言之,此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只有${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 code.

log(e);

throw e;

}

以上是 将异常从servlet转发到jsp页面的好方法是什么? 的全部内容, 来源链接: utcz.com/qa/407134.html

回到顶部