在JSF中,可以使用EL空运算符来渲染或不渲染组件
rendered="#{not empty myBean.myList}"
据我了解,该运算符既可以作为null检查,也可以检查列表是否为空。
我想对自己的自定义类的某些对象进行空检查,我需要实现哪些接口或部分接口?空运算符与哪个接口兼容?
在JSF中,可以使用EL空运算符来渲染或不渲染组件
rendered="#{not empty myBean.myList}"
据我了解,该运算符既可以作为null检查,也可以检查列表是否为空。
我想对自己的自定义类的某些对象进行空检查,我需要实现哪些接口或部分接口?空运算符与哪个接口兼容?
Answers:
从EL 2.2规范中(请在“单击此处下载该规范以进行评估”下面获得该规范):
1.10空运算符-
empty A
该
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
。
myBean
是null
什么呢?会true
/false
仍会返回还是会抛出异常?
使用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...
}