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


88

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

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

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

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

Answers:


151

EL 2.2规范中(请在“单击此处下载该规范以进行评估”下面获得该规范):

1.10空运算符- empty A

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

评估 empty A

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

因此,考虑到接口,它的工作原理上CollectionMap只。就您而言,我认为Collection是最佳选择。或者,如果它是类似Javabean的对象,则为Map。无论哪种方式,在幕后,该isEmpty()方法都用于实际检查。在您无法或不想实现的接口方法上,可以抛出UnsupportedOperationException


很奇怪,我尝试在Long and eclipse(4.4.0)上使用它,提示“此空表达式始终求值为false。只有字符串,映射,数组和集合对空运算符具有有意义的值”
Pieter De Bie

更奇怪的是,在我看来,它总是评估为true。
Pieter De Bie 2015年

myBeannull什么呢?会true/false仍会返回还是会抛出异常?
他们

9

使用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...
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.