EL空操作符在JSF中如何工作?

在JSF中,组件可以呈现或不使用EL空操作符

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

据我所知,操作符既作为空检查,也检查检查列表是否为空。

我想对我自己的自定义类的一些对象进行空检查,我需要实现哪些接口或接口的一部分? 哪个接口是空运营商兼容的?

从EL 2.2规范 (获得下面的“点击此处下载评估规范”):

1.10空操作员 – empty A

empty算符是一个前缀运算符,可用于确定值是空还是空。

评估empty A

  • 如果Anull ,则返回true
  • 否则,如果A是空string,则返回true
  • 否则,如果A是一个空数组,则返回true
  • 否则,如果A是一个空的Map ,则返回true
  • 否则,如果A是一个空的Collection ,则返回true
  • 否则返回false

所以,考虑到接口,它只适用于CollectionMap 。 在你的情况下,我认为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... }