Как работает оператор El empty в JSF?
в JSF компонент может быть отображен или не использовать пустой оператор EL
rendered="#{not empty myBean.myList}"
Как я понял, оператор работает как нулевая проверка, но также проверяет, пуст ли список.
Я хочу сделать пустые проверки на некоторых объектах моего собственного пользовательского класса, какие интерфейсы или части интерфейсов мне нужно реализовать? С каким интерфейсом совместим пустой оператор?
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... }