如何ArrayList
使用JSF EL表达式获得an的长度?
#{MyBean.somelist.length}
不起作用。
如何ArrayList
使用JSF EL表达式获得an的长度?
#{MyBean.somelist.length}
不起作用。
Answers:
是的,由于Java API创建委员会中的一些天才决定,即使某些类具有size()
成员或length
属性,它们也不会实现,getSize()
或者getLength()
JSF和大多数其他标准都需要实现,所以您将无法做自己想做的事情。
有两种方法可以做到这一点。
一:向您的Bean添加一个返回长度的函数:
在MyBean类中: public int getSomelistLength(){返回this.somelist.length; } 在您的JSF页面中: #{MyBean.somelistLength}
第二:如果您使用的是Facelets(哦,天哪,为什么不使用Facelets!),则可以添加fn命名空间并使用length函数
在JSF页面中: #{fn:length(MyBean.somelist)}
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
你的意思是size()是吗?
#{MyBean.somelist.size()}
为我工作(使用具有Jboss EL扩展名的JBoss Seam)
#{MyBean.somelist.size}
(末尾没有括号)。
注意:对于旧版本的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方法提供对列表的size属性的访问。清单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
您最终可以使用EL Functor扩展EL语言,这将允许您调用任何Java bean方法,即使带有参数也是如此。
您可以使用以下EL获得长度:
#{Bean.list.size()}