Подтвердить что ты не робот

Атрибут проверки существует в JSP

У меня есть несколько классов, которые расширяют суперкласс, а в JSP я хочу показать некоторые атрибуты этих классов. Я только хочу сделать один JSP, но я не знаю заранее, если объект имеет атрибут или нет. Поэтому мне нужно выражение JSTL или тег, который проверяет, что объект, который я передаю, имеет этот атрибут (похожий на оператора в javascript, но на сервере).

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

Как я могу получить это?

Спасибо.

4b9b3361

Ответ 1

Использовать JSTL c:catch.

<c:catch var="exception">${myObject.myAttribute}</c:catch>
<c:if test="${not empty exception}">Attribute not available.</c:if>

Ответ 2

Вы можете легко создать пользовательскую функцию для проверки свойства, согласно сообщению в блоге vivin.

Короче говоря, если у вас уже есть собственный taglib, это просто вопрос создания статического метода 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;
    }
}

... и добавив пять строк в ваш 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>

... и называя его в вашем JSP

<c:if test="${myTld:hasProperty(myObject, 'myAttribute')}">
  <c:set var="foo" value="${myObject.myAttribute}" />
</c:if>

Ответ 3

Вы имеете в виду что-то вроде этого:

<c:if test="${not null myObject.myAttribute}">
   <!-- Now I can access safely to "myAttribute" -->
</C:if>

или другой вариант

<c:if test="${myObject.myAttribute != null}">
   <!-- Now I can access safely to "myAttribute" -->
</C:if>

Если это список, который вы можете сделать

<c:if test="#{not empty myObject.myAttribute}">

Ответ 4

Просто более подробное (типичное?) использование отличного ответа 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}

Как отметил Шервин в комментариях к ответам BalusC, это, вероятно, НЕ самое чистое решение, но, как ответил BalusC, "пока что единственный способ достичь нечетного требования".

Ресурсы

Ответ 5

Принятый ответ может иметь некоторые побочные эффекты, когда я просто хочу проверить, есть ли у объекта поле, но не хочу выводить значение поля. В упомянутом случае я использую фрагмент ниже:

 <c:catch var="exception">
        <c:if test="${object.class.getDeclaredField(field) ne null}">            
        </c:if>
 </c:catch>

надеюсь это поможет.