Как работает 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...
}