如何在JSF表达式语言中获得列表的长度?

时间:2008-10-15 19:52:50

标签: java jsp jsf jstl el

如何使用JSF EL表达式获取ArrayList的长度?

#{MyBean.somelist.length}

不起作用。

7 个答案:

答案 0 :(得分:161)

是的,因为Java API创建委员会中的一些天才决定,即使某些类具有size()成员或length属性,它们也不会实现getSize()或{{1在JSF和大多数其他标准要求的情况下,你无法做你想做的事。

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

一:向Bean添加一个返回长度的函数:

In class MyBean:
public int getSomelistLength() { return this.somelist.length; }

In your JSF page:
#{MyBean.somelistLength}

二:如果你正在使用Facelets(哦,上帝,你为什么不使用Facelets!),你可以添加fn命名空间并使用长度函数

In JSF page:
#{ fn:length(MyBean.somelist) }

答案 1 :(得分:57)

你的意思是尺寸()不是吗?

#{MyBean.somelist.size()}

适合我(使用带有Jboss EL扩展的JBoss Seam)

答案 2 :(得分:14)

注意:此解决方案适用于旧版本的JSTL。对于大于1.1的版本,我建议使用Bill James建议的fn:length(MyBean.somelist)


This article有一些更详细的信息,包括另一种可能的解决方案;

  

问题是我们正在尝试调用列表的大小方法(这是一个有效的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中的 GIANT 缺陷。

我最终使用了“wrapper”方法,这里是它的类;

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”。这可能是解决这个问题的最简单方法。

答案 3 :(得分:6)

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>

在屏幕上显示表格大小

示例:Table Size = 5

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

7年后......作为jsf用户,facelets解决方案对我来说仍然可以正常工作

将命名空间包含为 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>

答案 6 :(得分:-4)

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

<强>#{Bean.list.size()}