EL空操作符在JSF中如何工作?
在JSF中,组件可以呈现或不使用EL空操作符
rendered="#{not empty myBean.myList}"
据我所知,操作符既作为空检查,也检查检查列表是否为空。
我想对我自己的自定义类的一些对象进行空检查,我需要实现哪些接口或接口的一部分? 哪个接口是空运营商兼容的?
从EL 2.2规范 (获得下面的“点击此处下载评估规范”):
1.10空操作员 –
empty A
empty
算符是一个前缀运算符,可用于确定值是空还是空。评估
empty A
- 如果
A
为null
,则返回true
- 否则,如果
A
是空string,则返回true
- 否则,如果
A
是一个空数组,则返回true
- 否则,如果
A
是一个空的Map
,则返回true
- 否则,如果
A
是一个空的Collection
,则返回true
- 否则返回
false
所以,考虑到接口,它只适用于Collection
和Map
。 在你的情况下,我认为Collection
是最好的select。 或者,如果它是一个Javabean类对象,那么Map
。 无论哪种方式,在封面下, isEmpty()
方法用于实际检查。 在你不能或不想实现的接口方法上,你可以抛出UnsupportedOperationException
。
使用BalusC的实施集合的build议我现在可以隐藏我的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... }