Как работает пустой оператор EL в JSF?

88

В JSF компонент может отображаться или не отображаться с помощью пустого оператора EL.

rendered="#{not empty myBean.myList}"

Как я понял, оператор работает как с нулевой проверкой, так и с проверкой на пустоту списка.

Я хочу выполнить пустую проверку некоторых объектов моего собственного пользовательского класса, какой интерфейс (ы) или части интерфейсов мне нужно реализовать? С каким интерфейсом совместим пустой оператор?

Аксель Вилльгерт
источник

Ответы:

151

Из спецификации EL 2.2 (см. Ниже «Щелкните здесь, чтобы загрузить спецификацию для оценки»):

1.10 Пустой оператор - empty A

emptyОператор является оператором префикс , который может быть использован для определения , если значение равно нулю или пусто.

Оценить empty A

  • Если Aесть null, вернутьtrue
  • В противном случае, если Aэто пустая строка, вернутьtrue
  • В противном случае, если Aэто пустой массив, вернутьtrue
  • В противном случае, если Aпусто Map, вернитеtrue
  • В противном случае, если Aпусто Collection, вернитеtrue
  • В противном случае верните false

Так что, учитывая интерфейсы, работает Collectionи Mapтолько. В твоем случае, думаю, Collectionэто лучший вариант. Или, если это объект, похожий на Явабию, тогда Map. В любом случае, этот isEmpty()метод используется для фактической проверки. На методы интерфейса, которые вы не можете или не хотите реализовывать, вы можете бросить UnsupportedOperationException.

BalusC
источник
Странно, я пытаюсь использовать это в Long и eclipse (4.4.0) намекает, что «Это пустое выражение всегда имеет значение false. Только строка, карты, массивы и коллекция имеют значимые значения для пустого оператора»
Питер Де Би,
Что еще более странно, в моем случае он всегда оценивается как истина.
Питер Де Би,
А если myBeanесть null? Будет ли true/ по- falseпрежнему возвращаться или может возникнуть исключение?
theyuv
9

Используя предложение BalusC о реализации Collection, теперь я могу скрыть свои начальные буквы, p:dataTableиспользуя не пустой оператор на моем, dataModelкоторый расширяетjavax.faces.model.ListDataModel

Пример кода:

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import javax.faces.model.ListDataModel;
import org.primefaces.model.SelectableDataModel;

public class EntityDataModel extends ListDataModel<Entity> implements
        Collection<Entity>, SelectableDataModel<Entity>, Serializable {

    public EntityDataModel(List<Entity> data) { super(data); }

    @Override
    public Entity getRowData(String rowKey) {
        // In a real app, a more efficient way like a query by rowKey should be
        // implemented to deal with huge data
        List<Entity> entitys = (List<Entity>) getWrappedData();
        for (Entity entity : entitys) {
            if (Integer.toString(entity.getId()).equals(rowKey)) return entity;
        }
        return null;
    }

    @Override
    public Object getRowKey(Entity entity) {
        return entity.getId();
    }

    @Override
    public boolean isEmpty() {
        List<Entity> entity = (List<Entity>) getWrappedData();
        return (entity == null) || entity.isEmpty();
    }
    // ... other not implemented methods of Collection...
}
Аксель Вилльгерт
источник