你如何获得JSFexpression式语言的列表长度?

我将如何使用JSF ELexpression式来获取ArrayList的长度?

 #{MyBean.somelist.length} 

不起作用。

是的,因为Java API创build委员会的一些天才决定,即使某些类具有size()成员或length属性,他们也不会实现JSF和其他大多数标准所要求的getSize()getLength()做你想做的事。

有几种方法可以做到这一点。

一:向你的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)

注意:这个解决scheme对旧版本的JSTL更好。 对于大于1.1的版本,我推荐使用Bill James所build议的fn:length(MyBean.somelist)


本文有一些更详细的信息,包括另一个可能的解决scheme;

问题是我们试图调用列表的大小方法(这是一个有效的LinkedList方法),但它不是一个JavaBeans兼容的getter方法,所以无法评估expression式list.size-1。

解决这个困境有两种方法。 首先,您可以使用RT Core库,如下所示:

 <c_rt:out value='<%= list[list.size()-1] %>'/> 

其次,如果要避免JSP页面中的Java代码,可以实现一个包含列表的简单包装类,并使用符合JavaBeans的getter方法提供对列表大小属性的访问。 这个bean列在清单2.25中。

c_rt方法的问题在于,您需要手动从请求中获取variables,因为否则它不能识别它。 在这一点上,你正在把许多代码放在function上。 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

您最终可以通过使用EL Functor扩展EL语言,这将允许您调用任何Java bean方法,即使使用参数…

7年后… facelets解决scheme仍然适合我作为一个jsf用户

将名称空间包含为xmlns:fn="http://java.sun.com/jsp/jstl/functions"

并使用EL作为#{fn:length(myBean.someList)}例如,如果在jsf中使用ui:片段下面的示例工作正常

 <ui:fragment rendered="#{fn:length(myBean.someList) gt 0}"> <!-- Do something here--> </ui:fragment> 

您可以使用以下EL获取长度:

#{Bean.list.size()}