假设我有一个名为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内的bug,还是我应该使用某种特殊方式在标记文件的主体内设置属性?
我们当前的解决方法是替换:
<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/