2010-08-17 13 views
6

Tengo el siguiente dentro de un JSP:JSP - ¿Puedo usar <jsp: attribute> dentro de <c:if>? Excepción: "Debe usar jsp: body para especificar cuerpo de la etiqueta"

<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> 

Como es, tengo la siguiente excepción:

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

Si quito la las etiquetas más externas <c:if>, funciona. ¿Hay algún problema con el uso de <jsp:attribute> dentro de un <c:if>? Cualquier ayuda sería apreciada. Gracias.

+1

Una sesión en la oscuridad: intente 'c: if' dentro de' jsp: attribute' en su lugar. – BalusC

Respuesta

5

El cuerpo de un elemento se define implícitamente como el cuerpo del elemento respectivo. El cuerpo también se puede representar explícitamente usando < jsp: cuerpo >. Esto es necesario si uno o más elementos < jsp: attribute > aparecen en el cuerpo de la etiqueta. Consulte las referencias de element, attribute y body.

Pero ese no es el problema real. El problema es < jsp: el atributo > no funciona bien con las etiquetas condicionales. El < jsp: atributo > está intentando establecer el atributo en su etiqueta padre, que en su ejemplo es < c: si >.

Usted podría utilizar < c: si > el interior del elemento (como BalusC sugirió en su comentario), pero que dará lugar a un un atributo con un valor vacío, o usted podría ir desde:

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

(a más detallado):

<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> 

también es posible usar un < c: choose >. Y, por supuesto, no funcionará bien con más de un atributo: D.

Mi sugerencia personal sería tirar el < jsp: atributo > y encontrar otra manera de configurar condicionalmente sus atributos.

Cuestiones relacionadas