我如何获得ArrayList
使用 JSF EL 表达式的长度?
#{MyBean.somelist.length}
不起作用。
是的,因为 Java API 创建委员会中的一些天才决定,即使某些类具有size()
成员或length
属性,它们也不会实现getSize()
或者getLength()
JSF 和大多数其他标准要求的,你不能做你想做的事。
有几种方法可以做到这一点。
一:向您的 Bean 添加一个返回长度的函数:
在 MyBean 类中: public int getSomelistLength() { return this.somelist.length; } 在您的 JSF 页面中: #{MyBean.somelistLength}
二:如果你在使用 Facelets(哦,天哪,你为什么不使用 Facelets!),你可以添加 fn 命名空间并使用长度函数
在 JSF 页面中: #{ fn:length(MyBean.somelist) }
你的意思是 size() 不是吗?
#{MyBean.somelist.size()}
为我工作(使用具有 Jboss EL 扩展的 JBoss Seam)
注意:此解决方案更适合旧版本的 JSTL。对于大于 1.1 的版本,我建议fn:length(MyBean.somelist)
按照Bill James的建议使用。
本文有一些更详细的信息,包括另一种可能的解决方案;
问题是我们试图调用列表的 size 方法(这是一个有效的 LinkedList 方法),但它不是 JavaBeans 兼容的 getter 方法,因此无法评估表达式 list.size-1。
有两种方法可以解决这个困境。首先,您可以使用 RT Core 库,如下所示:
<c_rt:out value='<%= list[list.size()-1] %>'/>
其次,如果您想在您的 JSP 页面中避免使用 Java 代码,您可以实现一个简单的包装类,该类包含一个列表并使用符合 JavaBeans 的 getter 方法提供对列表大小属性的访问。清单 2.25 中列出了该 bean。
c_rt 方法的问题是您需要手动从请求中获取变量,因为否则它无法识别它。在这一点上,您正在为应该内置的功能输入大量代码。这是 EL 中的一个巨大缺陷。
我最终使用了“包装器”方法,这是它的类;
public class CollectionWrapper {
Collection collection;
public CollectionWrapper(Collection collection) {
this.collection = collection;
}
public Collection getCollection() {
return collection;
}
public int getSize() {
return collection.size();
}
}
还没有人提到的第三个选项是将列表大小作为单独的属性放入模型中(假设您使用 MVC)。因此,在您的模型中,您将有“someList”,然后是“someListSize”。这可能是解决此问题的最简单方法。
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>
在屏幕上显示表格大小
例子:Table Size = 5
7 年后……作为 jsf 用户,facelets 解决方案仍然适用于我
将命名空间包括为
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
并使用 EL
#{fn:length(myBean.someList)}
,例如,如果在 jsf ui:fragment 中使用下面的示例工作正常
<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
<!-- Do something here-->
</ui:fragment>
您最终可以通过使用EL Functor来扩展 EL 语言,这将允许您调用任何 Java bean 方法,即使使用参数...
您可以使用以下 EL 获取长度:
#{Bean.list.size()}