【问题标题】:What is the proper way to catch an exception in JSTL在 JSTL 中捕获异常的正确方法是什么
【发布时间】: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>

在进行此切换时,我们无法捕获加载页面时发生的任何异常。我环顾四周,找到了&lt;c:catch&gt; 标签。我试图把它放到我们的页面标签中,但我不能让它按照我们想要的方式工作。我发现如果我将 &lt;c:catch&gt; 标签放在页面标签中的 &lt;jsp:doBody/&gt; 标签周围,它会捕获异常,我可以用它做点什么。但是,这不会捕获在此外部页面标记的其他部分中引发的任何异常。理想情况下,我会用&lt;c:catch&gt; 标记将整个页面标记括起来,但是当我这样做时,它似乎没有捕捉到异常。页面只是在引发异常时停止渲染。

我也一样

<c:if test="${!(empty pageException)}">
    ERROR!
</c:if>

在这两种情况下都在&lt;c:catch&gt; 标记之后,但我实际上只看到“错误!”当&lt;c:catch&gt; 标记紧邻&lt;jsp:doBody/&gt; 时,在源代码中

任何有关这方面的信息将不胜感激。

【问题讨论】:

  • “页面只是在抛出异常时停止渲染。” 这实际上可能有不同的原因。尝试将响应缓冲区大小设置为与最大页面的 HTML 输出相同的大小。例如。 50KB 什么的。顺便说一句,正确的方法是将所有 Java 代码放在一个 servlet 而不是 JSP 中,并使用 JSP 仅生成 HTML,这样所有对异常敏感的业务逻辑都不会在 JSP 中执行。

标签: jsp exception-handling jstl


【解决方案1】:

您可以在&lt;%@ page %&gt; 指令中使用errorPage 属性,而不是包装try catch 块或&lt;c:catch&gt;&lt;/c:catch&gt; 块。

1.创建一个错误 JSP 页面,该页面处理应用程序中所有其他 JSP 页面发生的错误。要将 JSP 页面指定为 errorHandler 页面,请使用此 JSP 页面指令:

<%@ page isErrorPage="true" %>`

在errorHandler JSP页面中,使用exception隐式对象检索异常详情。

2.将errorHandler JSP页面包含在其他JSP页面中,通过该JSP指令指定如果当前页面发生异常,将请求转发到errorHandler.jsp:

&lt;%@ page errorPage="/errorHandler.jsp" %&gt;

【讨论】:

    【解决方案2】:

    &lt;c:catch&gt; 应该可以工作。作为备份,您可以让您的 &lt;foo:page&gt; 类实现 TryCatchFinally 并在那里处理异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 2010-09-10
      相关资源
      最近更新 更多