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
A
是null
,则返回true
否则,如果A
为空字符串,则返回true
否则,如果A
是一个空数组,则返回true
否则,如果A
为空Map
,则返回true
否则,如果A
为空Collection
,则返回true
否则返回false
因此,考虑到接口,它仅适用于 Collection
和 Map
。在你的情况下,我认为Collection
是最好的选择。或者,如果它是类似 Javabean 的对象,则为 Map
。无论哪种方式,在幕后,isEmpty()
方法都用于实际检查。在你不能或不想实现的接口方法上,你可以抛出UnsupportedOperationException
。
【讨论】:
奇怪,我尝试在 Long 和 eclipse (4.4.0) 上使用它提示“这个空表达式总是计算为假。只有字符串、映射、数组和集合对空值有意义运营商” 更奇怪的是,在我的情况下它总是评估为真。 如果myBean
是null
呢? true
/false
还会被返回还是会抛出异常?【参考方案2】:
使用 BalusC 的实现 Collection 的建议,我现在可以在扩展 javax.faces.model.ListDataModel
的 dataModel
上使用非空运算符隐藏我的 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 组件在按需加载的弹出窗口中工作?
在 Eclipse 中工作的 Web 应用程序给出了验证 EL 错误 org.apache.catalina.core.StandardWrapperValve 调用