J'ai quelques classes qui étendent une superclasse, et dans le JSP je veux montrer quelques attributs de ces classes. Je veux seulement faire un JSP, mais je ne sais pas à l'avance si l'objet a un attribut ou non. J'ai donc besoin d'une expression JSTL ou d'une balise qui vérifie que l'objet que je passe a cet attribut (similaire à l'opérateur in en javascript, mais sur le serveur).
<c:if test="${an expression which checks if myAttribute exists in myObject}">
<!-- Display this only when myObject has the atttribute "myAttribute" -->
<!-- Now I can access safely to "myAttribute" -->
${myObject.myAttribute}
</C:if>
Comment puis-je l'obtenir?
Merci.
Utilisez JSTL c:catch
.
<c:catch var="exception">${myObject.myAttribute}</c:catch>
<c:if test="${not empty exception}">Attribute not available.</c:if>
Vous pouvez facilement créer une fonction personnalisée pour vérifier la propriété, selon article de blog de vivin .
En bref, si vous avez déjà votre propre taglib, il suffit de créer une méthode statique 'hasProperty' ...
import Java.beans.PropertyDescriptor;
import org.Apache.commons.beanutils.PropertyUtils;
...
public static boolean hasProperty(Object o, String propertyName) {
if (o == null || propertyName == null) {
return false;
}
try
{
return PropertyUtils.getPropertyDescriptor(o, propertyName) != null;
}
catch (Exception e)
{
return false;
}
}
... et en ajoutant cinq lignes à votre TLD ...
<function>
<name>hasProperty</name>
<function-class>my.package.MyUtilClass</function-class>
<function-signature>boolean hasProperty(Java.lang.Object,
Java.lang.String)
</function-signature>
</function>
... et l'appeler dans votre JSP
<c:if test="${myTld:hasProperty(myObject, 'myAttribute')}">
<c:set var="foo" value="${myObject.myAttribute}" />
</c:if>
La réponse acceptée peut avoir des effets secondaires lorsque je veux simplement tester si l'objet a un champ, mais que je ne veux pas afficher la valeur du champ. Dans le cas mentionné, j'utilise l'extrait ci-dessous:
<c:catch var="exception">
<c:if test="${object.class.getDeclaredField(field) ne null}">
</c:if>
</c:catch>
j'espère que cela t'aides.
Juste une utilisation plus détaillée (typique?) De la grande réponse de BalusC
<%--
[1] sets a default value for variable "currentAttribute"
[2] check if myObject is not null
[3] sets variable "currentAttribute" to the value of what it contains
[4] catches "property not found exception" if any
- if exception thrown, it does not output anything
- if not exception thrown, it outputs the value of myObject.myAttribute
--%>
<c:set var="currentAttribute" value="" /> <%-- [1] --%>
<c:if test="${not empty myObject}"> <%-- [2] --%>
<c:set var="currentAttribute"> <%-- [3] --%>
<c:catch var="exception">${myObject.myAttribute}</c:catch> <%-- [4] --%>
</c:set>
</c:if>
<%-- use the "currentAttribute" variable without worry in the rest of the code --%>
currentAttribute is now equal to: ${currentAttribute}
Comme l'a souligné Shervin dans les commentaires de la réponse de BalusC, ce n'est probablement PAS la solution la plus propre, mais comme l'a répondu BalusC "c'est jusqu'à présent le seul moyen d'atteindre la condition étrange".
Ressources
Voulez-vous dire quelque chose comme ça:
<c:if test="${not null myObject.myAttribute}">
<!-- Now I can access safely to "myAttribute" -->
</C:if>
ou autre variante
<c:if test="${myObject.myAttribute != null}">
<!-- Now I can access safely to "myAttribute" -->
</C:if>
Si c'est une liste que vous pouvez faire
<c:if test="#{not empty myObject.myAttribute}">