EL空运算符如何在JSF中工作?

时间:2013-01-06 18:00:39

标签: jsf el

在JSF中,可以使用EL空运算符

呈现或不呈现组件
rendered="#{not empty myBean.myList}"

正如我所理解的那样,运算符既可以作为空值检查,也可以检查列表是否为空。

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

2 个答案:

答案 0 :(得分:139)

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

  

1.10空操作员 - empty A

     

empty运算符是一个前缀运算符,可用于确定值是否为   null或empty。

     

评估empty A

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

因此,考虑到接口,它仅适用于CollectionMap。在您的情况下,我认为Collection是最佳选择。或者,如果它是类似Javabean的对象,那么Map。无论哪种方式,在封面下,isEmpty()方法用于实际检查。在您不能或不想实现的接口方法上,您可以抛出UnsupportedOperationException

答案 1 :(得分:10)

使用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...
}