Проверка атрибута существует в JSP - PullRequest
41 голосов
/ 26 марта 2010

У меня есть несколько классов, которые расширяют суперкласс, и в JSP я хочу показать некоторые атрибуты этих классов. Я хочу создать только одну JSP, но заранее не знаю, имеет ли объект атрибут или нет. Поэтому мне нужно выражение JSTL или тег, который проверяет, что передаваемый объект имеет этот атрибут (аналогично оператору in в 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>

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

Спасибо.

Ответы [ 5 ]

58 голосов
/ 26 марта 2010

Используйте JSTL c:catch.

<c:catch var="exception">${myObject.myAttribute}</c:catch>
<c:if test="${not empty exception}">Attribute not available.</c:if>
15 голосов
/ 10 мая 2012

Вы можете легко создать пользовательскую функцию для проверки свойства согласно сообщению в блоге 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>
2 голосов
/ 21 сентября 2016

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

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

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

2 голосов
/ 01 октября 2014

Просто более подробное (типичное?) Использование отличного ответа 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, "пока что это единственный способ достичь странного требования".

Ресурсы

1 голос
/ 26 марта 2010

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

<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}">
...