web-dev-qa-db-fra.com

attribut de test dans la balise JSTL <c: if>

J'ai vu du code comme celui-ci dans un JSP

<c:if test="<%=request.isUserInRole(RoleEnum.USER.getCode())%>">
    <li>user</li>
</c:if>

Ma confusion concerne le "=" qui apparaît dans la valeur de l'attribut test. J'ai cru comprendre que tout ce qui était inclus dans <%= %> est imprimé sur la sortie, mais la valeur assignée à test doit sûrement être un booléen, alors pourquoi cela fonctionne-t-il?

Pour les points bonus, existe-t-il un moyen de modifier la valeur d'attribut ci-dessus de telle sorte qu'elle n'utilise pas de code de scriptlet? Vraisemblablement, cela signifie utiliser EL à la place.

À la vôtre, Don

14
Dónal

Tout ce que l'attribut test recherche pour déterminer si quelque chose est vrai est la chaîne "true" (sensible à la casse). Par exemple, le code suivant affichera "Bonjour tout le monde!"

<c:if test="true">Hello world!</c:if>

Le code dans le <%= %> renvoie un booléen, il affichera donc la chaîne "true" ou "false", ce qui est exactement ce que le <c:if> tag recherche.

16
Michael

L'expression entre <% =%> est évaluée avant la balise c: if. Donc, en supposant que | request.isUserInRole | renvoie | true |, votre exemple serait évalué en premier:

<c:if test="true">
    <li>user</li>
</c:if>

puis la balise c: if serait exécutée.

4
Mike Spross

Les attributs des bibliothèques de balises JSP en général peuvent être statiques ou résolus au moment de la demande. S'ils sont résolus au moment de la demande, le JSP résoudra leur valeur au moment de l'exécution et transmettra la sortie à la balise. Cela signifie que vous pouvez mettre à peu près n'importe quel code JSP dans l'attribut et la balise se comportera en fonction de la sortie qui produit.

Si vous regardez les documents jstl taglib, vous pouvez voir quels attributs sont les plus rapides et ceux qui ne le sont pas. http://Java.Sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html

2
Sindri Traustason

<% =%> par lui-même sera envoyé à la sortie, dans le contexte du JSTL, il sera évalué en une chaîne

0
Javaxpert