【发布时间】:2012-02-17 04:18:45
【问题描述】:
在我们拥有的一些遗留代码中,我们有一个进程来获取我们的“基础”JSP 文件,并在整个应用程序的所有 JSP 文件上粘贴页眉、页脚等以及我们想要的任何其他内容。这个过程添加到所有 JSP 中的一件事是在 scriptlet 中围绕整个 JSP 的 try-catch 块。所以,最后,我们所有的 JSP 都应该是这样的:
<%
try
{
%>
.... all the rest of the JSP .....
<%
}
catch(Exception e)
{
Log.error(e);
}
%>
我们最近摆脱了这个过程,并将我们的 JSP 转移到使用 JSTL 并且没有任何 scriptlet。我们创建了一个标签,我们基本上围绕每个 JSP 进行页眉、页脚等操作。所以现在我们的 JSP 看起来像这样:
<foo:page>
.... all the rest of the JSP .....
</foo:page>
在进行此切换时,我们无法捕获加载页面时发生的任何异常。我环顾四周,找到了<c:catch> 标签。我试图把它放到我们的页面标签中,但我不能让它按照我们想要的方式工作。我发现如果我将 <c:catch> 标签放在页面标签中的 <jsp:doBody/> 标签周围,它会捕获异常,我可以用它做点什么。但是,这不会捕获在此外部页面标记的其他部分中引发的任何异常。理想情况下,我会用<c:catch> 标记将整个页面标记括起来,但是当我这样做时,它似乎没有捕捉到异常。页面只是在引发异常时停止渲染。
我也一样
<c:if test="${!(empty pageException)}">
ERROR!
</c:if>
在这两种情况下都在<c:catch> 标记之后,但我实际上只看到“错误!”当<c:catch> 标记紧邻<jsp:doBody/> 时,在源代码中
任何有关这方面的信息将不胜感激。
【问题讨论】:
-
“页面只是在抛出异常时停止渲染。” 这实际上可能有不同的原因。尝试将响应缓冲区大小设置为与最大页面的 HTML 输出相同的大小。例如。 50KB 什么的。顺便说一句,正确的方法是将所有 Java 代码放在一个 servlet 而不是 JSP 中,并使用 JSP 仅生成 HTML,这样所有对异常敏感的业务逻辑都不会在 JSP 中执行。
标签: jsp exception-handling jstl