我有一个Spring MVC项目,我使用控制器建议来处理控制器中抛出的错误.但是,如果JSP文件中发生错误,我还想显示一个很好的错误页面(即使这确实不应该发生!).因此我在项目的web.xml文件中添加了以下内容:
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/views/application/error/view-error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/views/application/error/view-error.jsp</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)
如果我故意在JSTL中触发错误,则内容view-error.jsp会正常.但是,内容将附加到发生错误的JSP文件的输出中.例如,如果display-users.jsp在第50行发生错误,结果是在错误发生之前生成的输出(第1-50行)将在其中添加内容view-error.jsp.
这是非常不受欢迎的,因为它会生成一个时髦的错误页面.而且因为我无法分辨抛出异常的位置(如果可以,我会修复错误),那么用户看到的内容很可能看起来很糟糕.
我想这是因为输出已经在缓冲区中,可能已经发送到客户端了?有什么方法可以解决这个问题,或者可能是另一种方法吗?谢谢!
这是大型 JSP 生成大型 HTML 的问题,脚本 Java 代码到处混合。一旦写入足够的数据,服务器就会提交标头(将它们发送到客户端)并发送页面的开头。那时,您无法再回滚任何内容来取回浏览器已接收(并可能显示)的数据。
这就是不推荐使用 scriplet 的原因之一,如果您确实需要在 JSP 中添加一些智能,那么它应该位于页面的开头,然后再将任何内容实际发送到浏览器。但理想情况下,一切都应该在 servlet 中提前计算,并将准备好的数据放入请求属性中。这样,除了 HTML 输出和请求属性呈现之外,JSP 应该只包含简单的条件或循环标记。所有这些都几乎没有产生异常的风险。