我在web.xml中定义了一个错误页面:
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>
在该错误页面中,我创建了一个自定义标记。此标记的标记处理程序通过电子邮件发送任何错误的堆栈跟踪。在大多数情况下,这很有效。
如果输出在错误发生时已经开始发送到客户端,那么效果不佳的地方就很好。在这种情况下,我们得到这个:
SEVERE: Exception Processing ErrorPage[exceptionType=java.lang.Exception, location=/error.jsp]
java.lang.IllegalStateException
我相信发生此错误是因为我们无法在输出已经开始后将请求重定向到错误页面。我使用的解决方法是增加特别大的JSP页面上的缓冲区大小。但是我正在尝试编写一个可以应用于现有应用程序的通用错误处理程序,而且我不确定通过数百个JSP页面来确保它们的缓冲区足够大。
在这种情况下,有没有办法让我的堆栈跟踪电子邮件代码执行,即使我实际上无法将错误页面显示给客户端?
答案 0 :(得分:2)
如果您已经开始向客户端发送数据,则不会使用errorPage。 我所做的是使用JavaScript回调来检查不完整的页面,然后重定向到错误页面。在包含标题或页面的页面的开头,将布尔javascript变量初始化为false,并注册onload处理程序以检查状态并重定向到错误页面。
<script type="text/javascript">
var pageLoadSuccessful = false;//set to true in footer.jsp
dojo.addOnLoad(function(){
if (!pageLoadSuccessful) window.location = "<c:url value="/error.do" />";
});
</script>
然后在页脚jsp中,确保将此变量设置为true:
<script type="text/javascript">
pageLoadSuccessful = true;//declared in header.jsp
</script>
答案 1 :(得分:1)
您是否尝试过使用&lt;%@ page errorPage =“/ myerrorpage.jsp”%&gt;指令?
您还需要使用&lt;%page isErrorPage =“true”$&gt;在myerrorpage.jsp,然后。
我认为这可以解决您的问题。唯一的问题是你需要以某种方式将它包含在每个JSP中。
答案 2 :(得分:1)
实际上,这个特殊问题表明你在JSP中使用了scriptlet。这是bad practice,这个特殊问题是其中一个主要原因。您需要将所有业务逻辑移动到真正的 java类,以便最终只在JSP中使用taglibs / EL。在servlet /过滤器中,您可以在将请求转发到JSP之前完美地处理异常。