JSP - 我可以在<c:if>中使用<jsp:attribute>吗?例外:“必须使用jsp:body指定标签主体”</c:if> </jsp:attribute>

时间:2010-08-17 22:52:28

标签: jsp jsp-tags jspinclude

我在JSP中有以下内容:

<c:if test="${true}">
<jsp:attribute name="extraInlineComplianceJavascript">
window.isSummaryComplianceLinkVisible = '${TabList.isSummaryComplianceLinkVisible}';
window.isDetailComplianceLinkVisible = '${TabList.isDetailComplianceLinkVisible}';
window.complianceSummaryReportTag = '${helper.complianceSummaryReportTag}';
window.complianceDetailReportTag = '${helper.complianceReportTag}';
</jsp:attribute>
</c:if>

原样,我得到以下异常:

 Must use jsp:body to specify tag body for &lt;MyTag if jsp:attribute is used.

如果我删除最外面的<c:if>标记,它就可以了。在<jsp:attribute>中使用<c:if>是否有问题?任何帮助,将不胜感激。感谢。

1 个答案:

答案 0 :(得分:5)

元素的主体被隐式地定义为相应元素的主体。也可以使用&lt; jsp:body&gt;明确表示正文。如果一个或多个&lt; jsp:attribute&gt;元素出现在标记的正文中。查看elementattributebody的参考文献。

但这不是真正的问题。问题是&lt; jsp:attribute&gt;条件标签不能很好地发挥作用。 &lt; jsp:属性&gt;正在尝试在其父标记上设置属性,在您的示例中该属性为&lt; c:if&gt;。

您可以使用&lt; c:if&gt;在元素内部(正如BalusC在他的评论中所建议的那样),但是这将导致一个具有空值的属性,或者你可以从:

<jsp:element ...>
  <c:if test="${true}">
    <jsp:attribute name="extraInlineComplianceJavascript">
      ....
    </jsp:attribute>
  </c:if>
</jsp:element>

(更详细):

<c:if test="${true}">
  <jsp:element ...>
    <jsp:attribute name="extraInlineComplianceJavascript">
      ....
    </jsp:attribute>
  </jsp:element>
</c:if>
<c:if test="${false}">
  <jsp:element ...>
     <!-- no attribute for false -->
  </jsp:element>
</c:if>

您还可以使用&lt; c:choose&gt;。当然,它不适用于多个属性:D。

我的个人建议是抛弃&lt; jsp:attribute&gt;并找到另一种有条件地设置属性的方法。