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

Agu*_*tin 6 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>
Run Code Online (Sandbox Code Playgroud)

原样,我得到以下异常:

 Must use jsp:body to specify tag body for &lt;MyTag if jsp:attribute is used.
Run Code Online (Sandbox Code Playgroud)

如果我删除最外面的<c:if>标签,它的工作原理.有没有用的问题<jsp:attribute>里面<c:if>?任何帮助,将不胜感激.谢谢.

小智 5

元素的主体被隐式地定义为相应元素的主体.也可以使用<jsp:body>显式表示正文.如果一个或多个<jsp:attribute>元素出现在标记的正文中,则这是必需的.检查元素,属性正文的引用.

但这不是真正的问题.问题是<jsp:attribute>与条件标签不兼容.<jsp:attribute>正在尝试在其父标记上设置属性,在您的示例中,该标记为<c:if>.

你可以在元素中使用<c:if>(如BalusC在他的评论中所建议的那样),但是这会产生一个空值的属性,或者你可以从:

<jsp:element ...>
  <c:if test="${true}">
    <jsp:attribute name="extraInlineComplianceJavascript">
      ....
    </jsp:attribute>
  </c:if>
</jsp:element>
Run Code Online (Sandbox Code Playgroud)

(更详细):

<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>
Run Code Online (Sandbox Code Playgroud)

您也可以使用<c:choose>.当然,它不适用于多个属性:D.

我的个人建议是抛弃<jsp:attribute>并找到另一种有条件地设置属性的方法.