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

В JSF компонент может быть отображен или не использован пустым оператором EL

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

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

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

Ответ 1

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

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

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

Оценить empty A

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

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

Ответ 2

Используя предложение 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...
}