你如何获得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()}