web.xml中的错误页面

3
我有这样的问题:我在web.xml中设置了java.lang.Exception类型的默认错误页面,因此它应该显示在servlet和jsp的所有异常上。但是,当我想测试这个页面时(我关闭连接),它在浏览器中不会出现。在测试的servlet中,我使用数据库,因此如果没有连接,它将抛出异常。在servlet中,我捕获这个异常,并throw new ServletException()。同时,在catch块中,我首先记录消息,然后抛出异常。那么为什么我的tomcat不显示这个错误页面?相反,它显示空白页面,并且在服务器输出中,我可以看到这些错误消息。
 <error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/errorPages/InternalError.jsp</location>
    </error-page>

我将会翻译以下内容:

我将错误页面保存在 /errorPages 文件夹中,需要显示的页面名为 InternalError.jsp。

在转到使用 El 显示从数据库检索出来的数据的 jsp 页面之后,该页面必须被显示。在该 jsp 页面中,数据通过存储在会话中的对象传递。


请展示 web.xml 片段。 - Matt Ball
1个回答

2
在servlet或JSP导致异常时,若响应已经被提交,您将会看到一个空白页面。换句话说,在HTTP响应头已发送到web浏览器时,这是一个无法回退的点。
为了预防这种情况发生,您需要确保只有在所有业务代码完成其工作后才开始向响应写入内容(最好不要在servlet中这样做,而是转发到JSP),并且您的JSP不包含任何单行业务代码(通常由脚本块<% %>表示)。
因此,如果您在servlet中执行以下操作:
response.getWriter().write("blah");
throw new ServletException("epic fail");

或者当异常在 JSP “半路出现” 时被抛出
<p>Some HTML</p>
<% throw new ServletException("epic fail"); %>
<p>Some more HTML</p>

如果没有正确设置,那么你很可能会遇到空白页面的风险。

通过在Servlet而不是JSP中执行业务工作。 JSP仅用于表示。另请参阅https://dev59.com/13A75IYBdhLWcg3wqK10 - BalusC
我在jsp中没有业务逻辑。Jsp只包含格式化输出的对象,这些对象可以访问数据库,例如: <c:set var="s" value="${sessionScope.Obj.info}" scope="page" /> 其中Obj是一个类,具有访问数据库的getInfo方法。 - maks
这实际上更糟。你需要祈祷此时响应没有被提交。大多数servlet容器默认在发送每2KB的数据后刷新响应。 - BalusC
几乎好了,您需要进行转发而不是重定向。因为重定向基本上是指示浏览器创建一个新的请求,所以所有请求属性都会丢失。 - BalusC
我了解到,如果我使用过滤器,那么任何发生的异常都将在过滤器中被捕获,因此在这种情况下为了让用户看到错误页面,我必须在过滤器中抛出异常。在我的项目中,所有可能引发异常的JSP都在过滤器下面。 - maks
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接