Java 如何使用异常详细信息和sendmail按钮构建Struts自定义错误页面

Java 如何使用异常详细信息和sendmail按钮构建Struts自定义错误页面,java,error-handling,struts,Java,Error Handling,Struts,我目前正在管理Struts中的错误(404500),这样任何面临错误的用户都可以看到一个包含所有详细信息的方便的错误页面。我还想在错误页面中实现一个sendmail功能,这样他们就可以立即将错误消息发送给开发人员团队 sendmail功能已经完成。我只需要找到一种在JSP页面上打印异常详细信息的方法 以下是我所拥有的: web.xml: <error-page> <error-code>500</error-code> <location

我目前正在管理Struts中的错误(404500),这样任何面临错误的用户都可以看到一个包含所有详细信息的方便的错误页面。我还想在错误页面中实现一个
sendmail
功能,这样他们就可以立即将错误消息发送给开发人员团队

sendmail
功能已经完成。我只需要找到一种在JSP页面上打印异常详细信息的方法

以下是我所拥有的:

web.xml

<error-page>
    <error-code>500</error-code>
    <location>/jsp/common/error500.jsp</location>
</error-page>

<error-page>
    <error-code>404</error-code>
    <location>/jsp/common/error404.jsp</location>
</error-page>

500
/jsp/common/error500.jsp
404
/jsp/common/error404.jsp
JSP:

标题为:

<%@ page isErrorPage="true" import="java.io.*" contentType="text/plain"%>

尝试了以下操作:

一,


错误404
二,


错误404
信息:
堆栈跟踪:

正如您所看到的,重定向工作得很好。我只需要找到如何在JSP中打印stacktrace。

正常的Struts 1异常处理使用声明性处理

protected ActionForward processException(HttpServletRequest request,
                                       HttpServletResponse response,
                                       Exception exception,
                                       ActionForm form,
                                       ActionMapping mapping)
throws IOException, ServletException {
request.setAttribute("exception", exception);
return mapping.findForward("error");
异常存储在
Globals.exception\u KEY
下,除非您提供自己的密钥

S1异常处理在指南部分中有详细说明

如果您绕过正常的异常处理机制,我不确定异常是否会存储在作用域中;你可以看看它是否在那里。然而,404与异常是不同的问题;这是一个缺少的映射,不是一个例外

如果您使用的是Struts 2,这是一个不同但相似的过程。在提问时加入Struts版本非常重要——Struts 1和2以及S1.2和S1.3之间的情况发生了很大变化


(如果您使用的是S1.2之前的版本,则发出嘘声。)

常规Struts 1异常处理使用声明性处理

异常存储在
Globals.exception\u KEY
下,除非您提供自己的密钥

S1异常处理在指南部分中有详细说明

如果您绕过正常的异常处理机制,我不确定异常是否会存储在作用域中;你可以看看它是否在那里。然而,404与异常是不同的问题;这是一个缺少的映射,不是一个例外

如果您使用的是Struts 2,这是一个不同但相似的过程。在提问时加入Struts版本非常重要——Struts 1和2以及S1.2和S1.3之间的情况发生了很大变化

(如果您使用的是S1.2之前的版本,发出嘘声。)

试试看

out.println(stringWriter.getBuffer().toString());
下面的代码覆盖了
RequestProcessor
,将
异常
放在JSP中可用

protected ActionForward processException(HttpServletRequest request,
                                       HttpServletResponse response,
                                       Exception exception,
                                       ActionForm form,
                                       ActionMapping mapping)
throws IOException, ServletException {
request.setAttribute("exception", exception);
return mapping.findForward("error");
}

试试看

out.println(stringWriter.getBuffer().toString());
下面的代码覆盖了
RequestProcessor
,将
异常
放在JSP中可用

protected ActionForward processException(HttpServletRequest request,
                                       HttpServletResponse response,
                                       Exception exception,
                                       ActionForm form,
                                       ActionMapping mapping)
throws IOException, ServletException {
request.setAttribute("exception", exception);
return mapping.findForward("error");

}

它不起作用,因为我在上有一个NullPointerException。似乎无法从我的JSP访问异常对象。它无法工作,因为我在上有NullPointerException。似乎无法从我的JSP访问异常对象。我已按照建议编写了异常处理程序。我仍然无法在JSP页面上显示堆栈跟踪。有什么想法吗?如何从我的错误页面(JSP)访问异常stacktrace?@CharleyDC5异常存储在我列出的键下;有很多选择。就我个人而言,我认为从用户体验的角度来看,显示页面本身的堆栈跟踪是可怕的,而且根本没有必要。我会给你更多的想法。我不想把它展示给客户。我想把它放在一个隐藏的字段中,只向客户显示一个“发送到支持团队”按钮。单击该按钮,我只需使用AJAX向支持团队发送一封电子邮件。@CharleyDC5相同的区别,尽管我想我不会麻烦——我会自动执行,或者将其保存到DB/将其放入JMS队列中,等等。我已经按照建议编写了异常处理程序。我仍然无法在JSP页面上显示堆栈跟踪。有什么想法吗?如何从我的错误页面(JSP)访问异常stacktrace?@CharleyDC5异常存储在我列出的键下;有很多选择。就我个人而言,我认为从用户体验的角度来看,显示页面本身的堆栈跟踪是可怕的,而且根本没有必要。我会给你更多的想法。我不想把它展示给客户。我想把它放在一个隐藏的字段中,只向客户显示一个“发送到支持团队”按钮。通过单击该按钮,我只需使用AJAX向支持团队发送一封电子邮件。@CharleyDC5相同的区别,尽管我想我不会麻烦——我要么自动执行,要么将其保存到DB/将其放入JMS队列中,等等。