ChatGPT解决这个技术问题 Extra ChatGPT

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

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

#{MyBean.somelist.length}

不起作用。

@GBa 您可以使用 #{MyBean.somelist.size()} 来显示列表的大小。
您还可以使用 c:forEach 循环遍历列表并在循环体中将计数值分配给变量,例如:。无论如何,当您在列表上循环时尤其有用。

B
Beryllium

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

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

一:向您的 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) }

fn 可能是要走的路,不幸的是,它仅在大于 1.1 的 JSTL 版本中可用。
使用 fn:length 对我来说适用于裸 JSP(没有 JSF、Facelets;超遗留项目在逐步淘汰之前进行了轻微更新)。要使用的正确标记库:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
对于像我一样登陆这里的人,仍然是 2 年后,考虑您可以将以下命名空间添加到您的 facelet:xmlns:fn="http://java.sun.com/jsp/jstl/functions"
D
Damo

你的意思是 size() 不是吗?

#{MyBean.somelist.size()}

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


也许 EL 的较新规格支持 size 方法?任何人都可以确认或否认这一点吗?
@nemo - 这在 JSR245 维护版本中得到解决:blogs.sun.com/kchung/entry/jsr_245_mr_part_i(就 JEE 规范而言,这将是 JEE6)
@McDowell,感谢您提供的信息,我真的很惊讶他们花了这么长时间才解决这个问题。
谢谢你。它也对我有用。 +1。但在 JEE 6 得到广泛支持之前,我可能会坚持使用“更标准”的 JSTL 功能。
顺便说一句,它可能在 JBoss 中只说 #{MyBean.somelist.size} (最后没有括号)。
C
Community

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

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

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

我最终使用了“包装器”方法,这是它的类;

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


U
UdayKiran Pulipati
<%@ 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)}
A
Arry

7 年后……作为 jsf 用户,facelets 解决方案仍然适用于我

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

R
Romain Linsolas

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


S
Soujanya

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

#{Bean.list.size()}


这与 Damo's 的答案基本相同。
作为@ArtjomB。建议,在这里发布与其他人已经发布的答案相同的答案通常并不好。在这种情况下,差不多六年前。