Как работает оператор El empty в JSF?


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

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

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

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

2 78

2 ответа:

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

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

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

оценить empty A

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

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

используя предложение BalusC о реализации коллекции, теперь я могу скрыть свои primefaces 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...
}