90

在 JSF 中,可以使用 EL 空运算符渲染或不渲染组件

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

据我了解,该运算符既可用作空检查,又可检查列表是否为空。

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

4

2 回答 2

156

来自EL 2.2 规范(获取下面的“单击此处下载规范以进行评估”):

1.10 空运算符 -empty A

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

评估empty A

  • 如果Anull,则返回true
  • 否则,如果A是空字符串,则返回true
  • 否则,如果A是空数组,则返回true
  • 否则,如果A为空Map,则返回true
  • 否则,如果A为空Collection,则返回true
  • 否则返回false

因此,考虑到接口,它Collection只能运行Map。在你的情况下,我认为Collection是最好的选择。或者,如果它是一个类似 Javabean 的对象,那么Map. 无论哪种方式,在幕后,该isEmpty()方法都用于实际检查。在您不能或不想实现的接口方法上,您可以抛出UnsupportedOperationException.

于 2013-01-06T18:04:47.820 回答
9

使用 BalusC 的实现 Collection 的建议,我现在可以在我的扩展上使用非空运算符隐藏我的p:dataTableprimefacesdataModeljavax.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...
}
于 2013-01-07T18:51:58.737 回答