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

如何使用 JSFEL 表达式获得 ArrayList的长度?

#{MyBean.somelist.length}

不起作用。

134460 次浏览

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

有几种方法可以解决这个问题。

One: add a function to your Bean that returns the length:

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


In your JSF page:
#{MyBean.somelistLength}

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

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

你是说尺寸吧?

#{MyBean.somelist.size()}

对我来说是可行的(使用具有 JBoss EL 扩展的 JBossSeam)

您最终可以通过使用 EL 函子来扩展 EL 语言,这将允许您调用任何 Javabean 方法,甚至使用参数..。

Note: This solution is better for older versions of JSTL. For versions greater then 1.1 I recommend using fn:length(MyBean.somelist) as suggested by 比尔 · 詹姆斯.


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

问题在于,我们试图调用 list 的 size 方法(这是一个有效的 LinkedList 方法) ,但它不是一个兼容 JavaBean 的 getter 方法,因此表达式 list.size-1无法计算。

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

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

Second, if you want to avoid Java code in your JSP pages, you can implement a simple wrapper class that contains a list and provides access to the list's size property with a JavaBeans-compliant getter method. That bean is listed in Listing 2.25.

The problem with c_rt method is that you need to get the variable from request manually, because it doesn't recognize it otherwise. At this point you are putting in a lot of code for what should be built in functionality. This is a 巨人 flaw in the 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)。所以在你的模型中,你会有“ somList”,然后是“ somListSize”。这可能是解决这个问题最简单的方法。

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


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

在屏幕上它显示表的大小

例子: Table Size = 5

你可以使用下面的 EL 来得到长度:

# { Bean.list.size ()}

7年过去了... faclets 解决方案对于我这样一个 jsf 用户来说仍然很好用

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

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

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