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


117

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

#{MyBean.somelist.length}

不起作用。



@GBa,您可以使用#{MyBean.somelist.size()}来显示列表的大小。
2014年

您也可以使用c:forEach遍历列表,并在循环主体中将计数值分配给变量,例如:<c:set var =“ nr_of_items” value =“ $ {varStatus.count}” />。特别有用,特别是当您遍历列表时。
DavidBalažic2015年

Answers:


166

是的,由于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)}

2
fn可能是可行的方法,不幸的是,它仅在大于1.1的JSTL版本中可用。
James McMahon

27
使用fn:length可以在裸露的JSP上为我工作(没有JSF,Facelets;超传统项目在逐步淘汰之前会进行轻度更新)。正确使用的标签库:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
Christopher Parker 2010年

57
对于仍然像我一样落在这里的人们,还是两年后,考虑到您可以在面中添加以下名称空间: xmlns:fn="http://java.sun.com/jsp/jstl/functions"
Damien MIRAS

59

你的意思是size()是吗?

#{MyBean.somelist.size()}

为我工作(使用具有Jboss EL扩展名的JBoss Seam)


也许EL的较新规格支持尺寸方法?任何人都可以确认或否认吗?
詹姆斯·麦克马洪

2
@nemo-这在JSR245维护版本中得到解决:blogs.sun.com/kchung/entry/jsr_245_mr_part_i(就JEE规范而言,将为JEE6)
McDowell

@McDowell,感谢您提供信息,我真的很惊讶他们花了这么长时间才解决此问题。
James McMahon

谢谢。它也对我有用。+1。但是在广泛支持JEE 6之前,我可能会坚持使用“更标准”的JSTL函数。
Hosam Aly

顺便说一句,它可能在JBoss中只是说一句话#{MyBean.somelist.size}(末尾没有括号)。
Hosam Aly

14

注意:对于旧版本的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”。这可能是解决此问题的最简单方法。



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

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

在屏幕上显示表格大小

例: Table Size = 5


是的,我发现这是最简单的方法。我正在将Websphere6与JSP(旧版系统)一起使用。使用相同的tablib,然后使用“美元符号”而不是“哈希”,因为哈希无效。即:{fn:length(SystemBean.list)}
JackDev


-1

7年后... facelets解决方案对于jsf用户来说仍然可以正常使用

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

-5

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

#{Bean.list.size()}


1
这基本上与Damo的答案相同。
Artjom B.

6
作为@ArtjomB。建议,在这里发布与其他人发布的答案相同的答案通常不太好。在这种情况下,将近六年前
Andrew Barber
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.