jsp - JSP标记文件: Exception inside of <c:set> results with a blank screen if it is executed inside of a tag file's body stored in a variable

标签 jsp error-handling exception-handling jstl jsp-tags

假设我有一个名为show-body.tag的非常简单的JSP标记文件:

<%@ tag body-content="scriptless" %>
<jsp:doBody var="body"/>
${body}

它所做的只是输出标签的主体(我的标签比较复杂,但这只是为了简单起见)。然后,在JSP页面中,我将像这样使用此标记来获取错误(wrong.key不存在):
<myTag:show-body>
  <c:set var="x">
    <bean:message key="wrong.key"/>
  </c:set>
  ${x}
</myTag:show-body>

最终将出现空白屏幕和200个请求状态代码,而不是将我转发到我的错误页面。

如果我从<c:set>中取出代码,则一切正常,这意味着我可以正确地转发到带有500状态代码的错误页面:
<myTag:show-body>
  <bean:message key="wrong.key"/>
</myTag:show-body>

另外,在<c:set>中抛出异常但在自定义标签的主体之外可以正常工作:
<c:set var="x">
  <bean:message key="wrong.key"/>
</c:set>
${x}

同样,将标签正文不存储在自定义标签文件内部的变量中也会导致错误页面正确显示:
<%@ tag body-content="scriptless" description="Outputs tabs" %>
<jsp:doBody />

但是,正是这三者的结合导致了黑屏问题。为什么会这样呢?这是JSP内的bu​​g,还是我应该使用某种特殊方式在标记文件的主体内设置属性?

我们当前的解决方法是替换:
<jsp:doBody var="body"/>
${body}

与:
<c:set var="body">
  <jsp:doBody/>
</c:set>
${body}

我们正在使用Tomcat 8 Servlet 3.1。

最佳答案

在自定义标签内,您应该使用<jsp:attribute>标签,看看这个docs page

关于jsp - JSP标记文件: Exception inside of <c:set> results with a blank screen if it is executed inside of a tag file's body stored in a variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40686966/

相关文章:

java - 来自不同目录的“预链接”JSP

jsp - JSTL fmt formatDate 标记按原样传递,而不是所需的值

c# - 基于参数抛出/不抛出异常 - 为什么这不是一个好主意?

java - 有没有办法在 Java 中全局处理异常?

java - 使用 Java、Spring、Jsp、Extjs 获取 Wildfly 8.2.0 Final - Undertow "UT010019: Response already commited"错误

java - java中如何将EL值赋给变量

php - 有人知道如何在运行的 self 创建页面上获取自定义woocommerceorders.php吗?

javascript - 表单控制故障解决方法

c# - Monotouch 全局异常处理

exception-handling - 如何在不抛出 TaskCanceledExceptions 的情况下等待任务?