2010-08-17 26 views
6

Je les éléments suivants dans une JSP:JSP - Puis-je utiliser <jsp: attribute> à l'intérieur de <c:if>? Exception: "Doit utiliser jsp: corps pour spécifier corps tag"

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

Comme il est, je reçois l'exception suivante:

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

Si je supprime la étiquettes extérieures <c:if>, cela fonctionne. Y at-il un problème avec l'utilisation <jsp:attribute> à l'intérieur d'un <c:if>? Toute aide serait appréciée. Merci.

+1

Un tir dans l'obscurité: essayez 'c: if' à l'intérieur de' jsp: attribute' à la place. – BalusC

Répondre

5

Le corps d'un élément est défini implicitement comme le corps de l'élément respectif. Le corps peut également être représenté explicitement en utilisant < jsp: body >. Ceci est requis si un ou plusieurs éléments < jsp: attribut > apparaissent dans le corps de l'étiquette. Vérifiez les références pour element, attribute et body.

Mais ce n'est pas le vrai problème. Le problème est < jsp: l'attribut > ne joue pas bien avec les balises conditionnelles. L'attribut < jsp: attribut > tente de définir l'attribut sur sa balise parent, ce qui dans votre exemple est < c: si >.

Vous pouvez utiliser < c: si > dans l'élément (comme BalusC a suggéré dans son commentaire), mais cela se traduira par un attribut avec une valeur vide, ou vous pouvez aller de:

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

(a plus bavard):

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

Vous pouvez également utiliser un < c: choisissez >. Et bien sûr, cela ne fonctionnera pas bien avec plus d'un attribut: D.

Ma suggestion personnelle serait de jeter le < jsp: attribut > et de trouver un autre moyen de définir vos attributs conditionnellement.