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

Posted

技术标签:

【中文标题】在 JSF 表达式语言中如何获取列表的长度?【英文标题】:How do you get the length of a list in the JSF expression language? 【发布时间】:2010-09-17 09:30:29 【问题描述】:

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

#MyBean.somelist.length

不工作。

【问题讨论】:

相关:How to display value of List#size() in JSF EL? @GBa 你可以使用#MyBean.somelist.size() 来显示列表的大小。 您也可以使用 c:forEach 循环遍历列表并在循环体中将计数值分配给变量,例如: 。无论如何,当您在列表中循环时尤其有用。 【参考方案1】:

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

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

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

在 MyBean 类中: public int getSomelistLength() return this.somelist.length; 在您的 JSF 页面中: #MyBean.somelistLength

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

在 JSF 页面中: # fn:length(MyBean.somelist)

【讨论】:

fn 可能是要走的路,不幸的是它只在 JSTL 版本大于 1.1 中可用。 使用 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"【参考方案2】:

你的意思是 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 (末尾没有括号)。【参考方案3】:

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

【讨论】:

【参考方案4】:

注意:此解决方案更适合旧版本的 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 中的 GIANT 缺陷。

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

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

【讨论】:

还有***.com/questions/1332169/…【参考方案5】:
<%@ 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)【参考方案6】:

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

#Bean.list.size()

【讨论】:

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

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>

【讨论】:

以上是关于在 JSF 表达式语言中如何获取列表的长度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在JSF XHTML中指定UTF-8字符?

如何阻止 EL 表达式在未呈现的 JSF 组件中进行评估?

如何记录 JSF ajax 请求的方法表达式

如果 jsf 数据表为空,如何显示消息?

如何在 JSF 页面中显示从属性文件加载的属性

如何调试 JSF/EL