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

Posted

技术标签:

【中文标题】EL 空运算符如何在 JSF 中工作?【英文标题】:How does EL empty operator work in JSF? 【发布时间】:2012-12-20 12:54:26 【问题描述】:

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

rendered="#not empty myBean.myList"

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

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

【问题讨论】:

【参考方案1】:

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

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 和 eclipse (4.4.0) 上使用它提示“这个空表达式总是计算为假。只有字符串、映射、数组和集合对空值有意义运营商” 更奇怪的是,在我的情况下它总是评估为真。 如果myBeannull 呢? true/false 还会被返回还是会抛出异常?【参考方案2】:

使用 BalusC 的实现 Collection 的建议,我现在可以在扩展 javax.faces.model.ListDataModeldataModel 上使用非空运算符隐藏我的 primefaces p:dataTable

代码示例:

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...

【讨论】:

以上是关于EL 空运算符如何在 JSF 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Richfaces 组件在按需加载的弹出窗口中工作?

为啥关系运算符不能在指针和数组中工作[关闭]

如何调试 JSF/EL

包含不在 Powershell 中工作的运算符

如何阻止 EL 表达式在未呈现的 JSF 组件中进行评估?

在 Eclipse 中工作的 Web 应用程序给出了验证 EL 错误 org.apache.catalina.core.StandardWrapperValve 调用